Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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# 如何始终使用DocumentFormat.OpenXml跳过指定数量的行_C#_Openxml - Fatal编程技术网

C# 如何始终使用DocumentFormat.OpenXml跳过指定数量的行

C# 如何始终使用DocumentFormat.OpenXml跳过指定数量的行,c#,openxml,C#,Openxml,我使用DocumentFormat.OpenXml迭代行,有时需要从第4行、第8行和第11行开始。我用下面的“skipRows”和“If”定义了应该跳过多少行让我跳过不必要的行: var rows = sheet.Descendants<Row>(); foreach (Row row in rows) { if (dataRowIndex < skipRows) { dataRowIndex++; continue;

我使用DocumentFormat.OpenXml迭代行,有时需要从第4行、第8行和第11行开始。我用下面的“skipRows”和“If”定义了应该跳过多少行让我跳过不必要的行:

var rows = sheet.Descendants<Row>();
foreach (Row row in rows)
{
    if (dataRowIndex < skipRows)
    {
         dataRowIndex++;
         continue;
    }
var rows=sheet.subjections();
foreach(行中的行)
{
如果(数据行索引
问题是,有时当行完全为空时,它不会自动遍历该行。有时为空时,它会遍历该行。当有任何单元格写入该行时,它总是遍历该行。这是为什么?我如何确保它总是跳过例如6行,而不管这些行中的单元格中是否有任何数据

有时当它为空时,它会遍历它。当在所述行中写入任何单元格时,它总是遍历。为什么

这是由于XML模式的定义方式造成的。行在模式中是完全可选的;如果行中没有数据,则不需要将其写入XML(尽管也没有任何方法可以阻止其写入)。如果行中有一个单元格,则必须将该行写入XML,因为该单元格是行的子单元格;没有该行,就没有任何地方可以写入该单元格

我如何确保它总是跳过例如6行,而不管这些行中的单元格中是否有任何数据

您可以使用
行索引
属性来查找正在读取的
的实际索引

下面的示例应该是您所追求的:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    SharedStringTablePart stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

    var rows = sheetData.Descendants<Row>();

    foreach (Row row in rows)
    {
        if (row.RowIndex <= skipRows)
        {
            continue;
        }

        //this is just to show that it's outputting from the first non-skipped row
        Cell cell = row.GetFirstChild<Cell>();
        string contents;

        if (cell.DataType == CellValues.SharedString)
        {
            int index = int.Parse(cell.CellValue.InnerText);
            contents = stringTable.SharedStringTable.ElementAt(index).InnerText;
        }
        else
        {
            contents = cell.InnerText;
        }
        Console.WriteLine(contents);
    }
}
使用(电子表格文档=电子表格文档.Open(文件路径,false))
{
WorkbookPart WorkbookPart=document.WorkbookPart;
WorksheetPart WorksheetPart=workbookPart.WorksheetParts.First();
SheetData SheetData=worksheetPart.Worksheet.Elements().First();
SharedStringTablePart stringTable=workbookPart.GetPartSoftType().FirstOrDefault();
var rows=sheetData.substands();
foreach(行中的行)
{

if(row.RowIndex不确定它是否有效,但您是否尝试过“.Skip()”?:):我认为“.Skip()”函数在创建列表后会跳过行。因此这不会是一个更改。问题是“sheet.subjects()”有时会跳过空行,有时则不会。