![](/img/trans.png)
[英]How to add rows/cells in DocumentFormat.OpenXml Spreadsheet?
[英]How to always skip specified number of Rows using DocumentFormat.OpenXml
我使用 DocumentFormat.OpenXml 遍歷行,有時我需要從第 4、8、11 行開始。 我用下面的“skipRows”和“If”定義了應該跳過多少行,讓我跳過不必要的行:
var rows = sheet.Descendants<Row>();
foreach (Row row in rows)
{
if (dataRowIndex < skipRows)
{
dataRowIndex++;
continue;
}
問題是,有時當行完全為空時,它不會自動遍歷它。 有時,當它為空時,它會遍歷它。 當在所述行中寫入任何單元格時,它總是迭代。 這是為什么? 無論這些行中的單元格中是否有任何數據,我如何確保它始終跳過例如 6 行?
有時,當它為空時,它會遍歷它。 當在所述行中寫入任何單元格時,它總是迭代。 這是為什么?
這是由於 XML 模式的定義方式造成的。 模式中的行是完全可選的; 如果一行中沒有數據,則不需要將其寫入 XML(盡管也沒有什么可以阻止它被寫入)。 如果一行中有一個單元格,則該行必須寫入 XML,因為單元格是一行的子項; 如果沒有該行,將無處可寫單元格。
無論這些行中的單元格中是否有任何數據,我如何確保它始終跳過例如 6 行?
您可以使用Row
的RowIndex
屬性找出正在讀取的Row
的實際索引。
下面的例子應該做你所追求的:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.