OpenXML только чтение 4 столбца C#

Я очень новичок в OpenXML, так что на этом мне не хватает - у меня есть следующий фрагмент кода в гораздо большем читателе OpenXML Excel - этот читатель берет информацию, назначенную набору данных, и затем отображается в виде сетки данных:

         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 и все его данные.

Мой второй вопрос: возможно ли с помощью этого кода (или его варианта) указать строку, которую я хочу, чтобы программа читала как заголовок столбца таблицы данных?

1 ответ

Решение

В случае, если кому-то это нужно, я обнаружил, что это меняется:

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

к

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

Работал. С columnIndex, являющимся переменной, я могу изменить в зависимости от выбранного листа.

Другие вопросы по тегам