C# 如何始终使用DocumentFormat.OpenXml跳过指定数量的行
我使用DocumentFormat.OpenXml迭代行,有时需要从第4行、第8行和第11行开始。我用下面的“skipRows”和“If”定义了应该跳过多少行让我跳过不必要的行: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;
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()”有时会跳过空行,有时则不会。