OpenXML 仅读取 4 列

OpenXML Only reading 4 columns

我在更大的 OpenXML Excel reader 中有以下代码。 reader 抓取分配给数据集的信息,然后显示在数据网格视图中:

         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 列的工作表:see here

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

我的第二个问题是,是否可以使用该代码(或其变体)来指定我希望程序读取的行作为 datagridview 列标题?

万一有人需要这个我发现改变:

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

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

成功了。由于 columnIndex 是一个变量,我可以根据所选的 sheet 进行更改。