只读取4列

本文关键字:4列 读取 | 更新日期: 2023-09-27 18:09:39

我在一个更大的OpenXML Excel阅读器中有以下代码段。这个阅读器获取分配给数据集的信息,然后显示在datagridview中:

         public static DataTable ExtractExcelSheetValuesToDataTable(string xlsxFilePath, string sheetName, int startingRow)    {
    DataTable dt = new DataTable();
    using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(xlsxFilePath, true))        {
        //Access the main Workbook part, which contains data
        WorkbookPart workbookPart = myWorkbook.WorkbookPart;
        WorksheetPart worksheetPart = null;
        if (!string.IsNullOrEmpty(sheetName))            {
            Sheet ss = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).SingleOrDefault<Sheet>();
            worksheetPart = (WorksheetPart)workbookPart.GetPartById(ss.Id);
        }            else            {
            worksheetPart = workbookPart.WorksheetParts.FirstOrDefault();

        } 
        SharedStringTablePart stringTablePart = workbookPart.SharedStringTablePart;
        if (worksheetPart != null)            {
            Row lastRow = worksheetPart.Worksheet.Descendants<Row>().LastOrDefault();

            #region ColumnCreation
            //Returns the columns - come back to this later - may be able to modify this to have
            //A checkbox "Column names in first row"
            Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();
            int columnInt = 0;
            //if (firstRow != null)
            //{
                foreach (Cell c in firstRow.ChildElements)
                {
                    string value = GetValue(c, stringTablePart);
                    dt.Columns.Add(columnInt + ": " + value);
                    columnInt++;
                }
            //}
            #endregion

            #region Create Rows
            //if (lastRow != null)
            //{
            //lastRow.RowIndex;
                for (int i = startingRow; i <= 150000; i++)
                {
                    DataRow dr = dt.NewRow();
                    bool empty = true;
                    Row row = worksheetPart.Worksheet.Descendants<Row>().Where(r => i == r.RowIndex).FirstOrDefault();
                    int j = 0;
                    if (row != null)
                    {
                        foreach (Cell c in row.ChildElements)
                        {
                            //Get cell value
                            string value = GetValue(c, stringTablePart);
                            if (!string.IsNullOrEmpty(value) && value != "")
                                empty = false;
                            dr[j] = value;
                            j++;
                            if (j == dt.Columns.Count)
                                break;
                        }
                        if (empty)
                            break;
                        dt.Rows.Add(dr);
                    }
                }
            } 
            #endregion
        }
   // }
    return dt;

    }
    public static string GetValue(Cell cell, SharedStringTablePart stringTablePart)    {
    if (cell.ChildElements.Count == 0)           return null;
     //get cell value
    string value = cell.ElementAt(0).InnerText;//CellValue.InnerText;
     //Look up real value from shared string table
    if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
        value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
     return value;
}

    public void GetSheetInfo(string fileName)
    {
         Sheets theSheets = null;
        // Open file as read-only.
        using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
        {
            S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
            WorkbookPart wbPart = mySpreadsheet.WorkbookPart;
            theSheets = wbPart.Workbook.Sheets;
            foreach (Sheet item in theSheets)
            {
                cmbSheetSelect.Items.Add(item.Name);

            }
        }
    }

这对基本的电子表格有效,但当我试图阅读更高级的电子表格时,我遇到了一个或两个问题。

首先,我有一个有5列的工作表:见这里

然而,当我运行我的程序时,它只返回前4列,而不是列E及其所有数据。

我的第二个问题是是否有可能使用该代码(或它的变体)能够指定我想要程序读取的行作为datagridview列标题?

只读取4列

如果有人需要这个,我发现改变:

Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();

Row firstRow = worksheetPart.Worksheet.Descendants<Row>().ElementAtOrDefault(columnIndex)

。columnIndex是一个变量,我可以根据所选择的工作表进行更改。