OpenXML(SAX方法) – 将行添加到现有选项卡

我正在尝试使用OpenXML(SAX方法)创build一个Excel文档。 当我的方法被调用时,我想检查是否已经为一个给定的键创build一个选项卡。 如果是我想只追加到该选项卡的底部一行。 如果该选项卡没有创build给定的键我创build一个新的选项卡,如;

part = wbPart.AddNewPart<WorksheetPart>(); string worksheetName = row.Key[i].ToString(); Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(part), SheetId = sheetNumber, Name = worksheetName }; sheets.Append(sheet); writer = OpenXmlWriter.Create(part); writer.WriteStartElement(new Worksheet()); writer.WriteStartElement(new SheetData()); currentrow = 1; string header = Header + "\t" + wrapper.GetHeaderString(3, 2, -1); //need to fix WriteDataToExcel(header, currentrow, 0, writer); currentrow++; writer.WriteEndElement(); writer.WriteEndElement(); writer.Close(); 

如果一个选项卡已经被创build,我记得使用下面的代码表;

 private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName) { IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>(). Elements<Sheet>().Where(s => s.Name == sheetName); if (sheets.Count() == 0) { // The specified worksheet does not exist. return null; } string relationshipId = sheets.First().Id.Value; WorksheetPart worksheetPart = (WorksheetPart) document.WorkbookPart.GetPartById(relationshipId); return worksheetPart; } 

当正确的工作表部分返回时,我尝试通过指向我的OpenXmlWriter到正确的部分,然后添加行添加新行;

  part = GetWorksheetPartByName(document, row.Key[i].ToString()); writer = OpenXmlWriter.Create(part); writer.WriteStartElement(part.Worksheet); writer.WriteStartElement(part.Worksheet.GetFirstChild<SheetData>()); SheetData sheetData = part.Worksheet.GetFirstChild<SheetData>(); Row lastRow = sheetData.Elements<Row>().LastOrDefault(); 

代码运行但是我总是只有一行(最初创build标签时添加的)。 电子表格中没有后续行显示。

我将添加很多行(50,000+),并且不希望创build新文件并在每次都复制信息。

根据我的经验,使用SAX方法编写(即使用OpenXmlWriter)对于新事物(零件,工作表,whatnot)最适合。 当您使用OpenXmlWriter.Create()时,就像覆盖零件的原始现有数据(在这种情况下是WorksheetPart)。 即使实际上,它不是。 这很复杂。

据我的实验,如果有现有的数据,你不能使用OpenXmlWriter编辑数据。 即使您使用Save()函数或正确closuresOpenXmlWriter。 出于某种原因,SDK将忽略您的努力。 因此,你添加了原来的一行。

如果你正在写50000行,那么最好一次性完成。 那么SAX方法将是有用的。 另外,如果你写一行(一次?),使用SAX和DOM方法的速度好处可以忽略不计。