C# OpenXML仅读取4列

C# OpenXML仅读取4列,c#,datagridview,openxml,import-from-excel,C#,Datagridview,Openxml,Import From Excel,我在一个更大的OpenXMLExcel阅读器中有以下代码。此读取器获取分配给数据集的信息,然后显示在datagridview中: public static DataTable ExtractExcelSheetValuesToDataTable(string xlsxFilePath, string sheetName, int startingRow) { DataTable dt = new DataTable(); using (Spreads

我在一个更大的OpenXMLExcel阅读器中有以下代码。此读取器获取分配给数据集的信息,然后显示在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);


            }

        }
    }
公共静态数据表ExtractExcelSheetValuesToDataTable(字符串xlsxFilePath、字符串sheetName、int startingRow){
DataTable dt=新的DataTable();
使用(SpreadsheetDocument myWorkbook=SpreadsheetDocument.Open(xlsxFilePath,true)){
//访问包含数据的主工作簿部分
WorkbookPart WorkbookPart=My工作簿.WorkbookPart;
工作表部件工作表部件=空;
如果(!string.IsNullOrEmpty(sheetName)){
Sheet ss=workbookPart.Workbook.Subjections()。其中(s=>s.Name==sheetName.SingleOrDefault();
worksheetPart=(worksheetPart)workbookPart.GetPartById(ss.Id);
}否则{
worksheetPart=workbookPart.WorksheetParts.FirstOrDefault();
} 
SharedStringTablePart stringTablePart=workbookPart.SharedStringTablePart;
如果(工作表部件!=null){
Row lastRow=工作表零件。工作表。子体()。LastOrDefault();
#区域列创建
//返回列-稍后返回此列-可以修改此列使其具有
//复选框“第一行中的列名”
Row firstRow=worksheetPart.Worksheet.subjects().FirstOrDefault();
int columnInt=0;
//如果(第一行!=null)
//{
foreach(第一行中的单元格c.ChildElements)
{
字符串值=GetValue(c,stringTablePart);
dt.Columns.Add(columnInt+“:”+值);
columnInt++;
}
//}
#端区
#区域创建行
//if(lastRow!=null)
//{
//lastRow.RowIndex;
for(int i=startingRow;i i==r.RowIndex).FirstOrDefault();
int j=0;
如果(行!=null)
{
foreach(行中的单元格c.ChildElements)
{
//获取单元格值
字符串值=GetValue(c,stringTablePart);
如果(!string.IsNullOrEmpty(value)&&value!=“”)
空=假;
dr[j]=数值;
j++;
if(j==dt.Columns.Count)
打破
}
if(空)
打破
dt.Rows.Add(dr);
}
}
} 
#端区
}
// }
返回dt;
}
公共静态字符串GetValue(单元格单元格,SharedStringTablePart stringTablePart){
if(cell.ChildElements.Count==0)返回null;
//获取单元格值
字符串值=cell.ElementAt(0).InnerText;//CellValue.InnerText;
//从共享字符串表中查找实际值
if((cell.DataType!=null)&&(cell.DataType==CellValues.SharedString))
value=stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
返回值;
}
public void GetSheetInfo(字符串文件名)
{
sheethesheets=null;
//以只读方式打开文件。
使用(电子表格文档mySpreadsheet=SpreadsheetDocument.Open(文件名,false))
{
S sheets=mySpreadsheet.WorkbookPart.Workbook.sheets;
WorkbookPart wbPart=myPreadSheet.WorkbookPart;
theSheets=wbPart.Workbook.Sheets;
foreach(表格中的表格项目)
{
选择.Items.Add(item.Name);
}
}
}
这对基本的电子表格有效,但当我尝试阅读更高级的电子表格时,我会遇到一两个问题

首先,我的工作表有5列:

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


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

如果有人需要,我发现正在更改:

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

Row firstRow=worksheetPart.Worksheet.substanders().ElementAtOrDefault(columnIndex)

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

您的代码实际上只处理第一行。它只在第一个单元格中包含数据。你知道吗?2.你说的台词是什么意思?是Excel的行,还是每个单元格中的一行字?您好-很抱歉,我已将代码更新为完整的DataTable函数,以备清除。抱歉,我希望能够在excel中传递行号,比如说15,并使用该行作为datagridview中的标题(目前它只拉A1-A…如果有空白列,则停止)。您知道您要做什么吗?我运行了您的代码,将所有列加载到我指定的起始行的
DataTable
中效果很好。我可能会将其称为
rowIndex
,而不是columnIndex。而且索引是从零开始的,因此Excel工作表中的第15行将是
worksheetPart.Worksheet.subjects().ElementAtOrDefault(14)
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().ElementAtOrDefault(columnIndex)