Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在OpenXML中计算每个工作表的行数_C#_Openxml - Fatal编程技术网

C# 如何在OpenXML中计算每个工作表的行数

C# 如何在OpenXML中计算每个工作表的行数,c#,openxml,C#,Openxml,我从Interop库切换到OpenXML,因为我需要读取大型Excel文件。在此之前,我可以使用: worksheet.UsedRange.Rows.Count 获取工作表中包含数据的行数。我用这些信息制作了一个进度条。在OpenXML中,我不知道如何获得关于工作表的相同信息。我现在拥有的是以下代码: using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false)) { Wo

我从
Interop
库切换到
OpenXML
,因为我需要读取大型
Excel
文件。在此之前,我可以使用:

worksheet.UsedRange.Rows.Count
获取工作表中包含数据的行数。我用这些信息制作了一个进度条。在OpenXML中,我不知道如何获得关于工作表的相同信息。我现在拥有的是以下代码:

 using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false))
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
    int row_count = 0, col_count;
    // here I would like to get the info about the number of rows
    foreach (Row r in sheetData.Elements<Row>())
    {
        col_count = 0;
        if (row_count > 10)
        {
            foreach (Cell c in r.Elements<Cell>())
            {
                // do some stuff  
                // update progressbar  
            }
        }
        row_count++;
    }
}
使用(SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Open(路径,false))
{
WorkbookPart WorkbookPart=电子表格文档.WorkbookPart;
WorksheetPart WorksheetPart=workbookPart.WorksheetParts.First();
SheetData SheetData=worksheetPart.Worksheet.Elements().First();
int行计数=0,列计数;
//在这里,我想获得有关行数的信息
foreach(sheetData.Elements()中的r行)
{
col_计数=0;
如果(行数>10)
{
foreach(r.Elements()中的单元格c)
{
//做点什么
//更新进度条
}
}
行计数++;
}
}
这并不难(当您使用
LINQ
时)

使用(SpreadsheetDocument myDoc=SpreadsheetDocument.Open(“PATH”,true))
{
//获取工作簿部件
WorkbookPart WorkbookPart=myDoc.WorkbookPart;
//然后访问工作表部分
IEnumerable worksheetPart=工作簿零件.WorksheetParts;
foreach(工作表部件中的工作表部件WSP)
{
//查找图纸数据
IEnumerable sheetData=WSP.sheet.Elements();
//遍历Excel工作表中的每个工作表
foreach(SheetData中的SheetData SD)
{
IEnumerable row=SD.Elements();//获取行IEnumerator
Console.WriteLine(row.Count());//将提供行数
}
}

使用
Linq
编辑,现在它是直接的了。

所以,我必须事先做这个循环?只是为了计算行数?我问这个问题,因为我在处理数据的主循环中更新了progressbar,但在此之前,我必须设置它的最大属性(即工作表上的行数)抱歉,发得太急了…请尝试最新更新:)使用LINQ作为您的答案..不,您将不需要:)我的答案提供工作表中所有工作表的可用行数..只需使用提供的代码:)好的。我现在明白了。我将在一分钟内检查我的代码中的这一方法。您的代码和我的代码的唯一区别是我迭代了所有t他说:)它会很好用的
 using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open("PATH", true))
 {
   //Get workbookpart
   WorkbookPart workbookPart = myDoc.WorkbookPart;

   //then access to the worksheet part
   IEnumerable<WorksheetPart> worksheetPart = workbookPart.WorksheetParts;

   foreach (WorksheetPart WSP in worksheetPart)
   {
      //find sheet data
      IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();       
      // Iterate through every sheet inside Excel sheet
      foreach (SheetData SD in sheetData)
      {
           IEnumerable<Row> row = SD.Elements<Row>(); // Get the row IEnumerator
           Console.WriteLine(row.Count()); // Will give you the count of rows
      }
}