簡體   English   中英

OpenXML僅讀取4列

[英]OpenXML Only reading 4 columns

我在更大的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列標題?

萬一有人需要,我發現可以更改:

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

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

工作了。 使用columnIndex作為變量,我可以根據所選工作表進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM