OpenXML (SAX方法)-向现有选项卡添加行

本文关键字:选项 添加行 SAX 方法 OpenXML | 更新日期: 2023-09-27 17:51:12

我试图使用OpenXML (SAX方法)创建一个Excel文档。当我的方法被调用时,我想检查是否已经为给定的键创建了一个选项卡。如果是的话,我想在标签的底部添加一行。如果没有为给定的键创建选项卡,则创建一个新选项卡,如;

      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();

如果a选项卡已经创建,我使用以下代码召回表;

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();

代码运行,但我总是以一行结束(我第一次创建选项卡时添加的初始行)。电子表格中没有显示后续的行。

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

OpenXML (SAX方法)-向现有选项卡添加行

根据我的经验,使用SAX方法编写(即使用OpenXmlWriter)最适合新事物(部件,工作表等)。当您使用OpenXmlWriter.Create()时,这就像覆盖部件的原始现有数据(在本例中为WorksheetPart)。尽管实际上,它不是。很复杂。

就我的实验而言,如果存在现有数据,则无法使用OpenXmlWriter编辑数据。即使使用Save()函数或正确关闭OpenXmlWriter也不会。由于某种原因,SDK将忽略您的努力。因此,您添加的是原始的一行。

如果您要编写50,000行,最好一次完成所有操作。然后SAX方法就有用了。此外,如果您只编写一行(一次编写一行?),那么使用SAX和使用DOM方法的速度优势可以忽略不计。

根据这个网站工作与现有的Excel与OpenXMLWriter:OpenXMLWriter只能操作新的工作表,而不能操作现有的文档。因此,我担心您不能使用OpenXMLWriter将值插入到现有电子表格的特定单元格中。

您可以读取现有Excel文件中的所有数据,然后似乎您需要添加行(50,000+),我建议使用openxmlwriter将旧数据和新数据一次性写入新的Excel文件。如果使用DOM方法,在添加大量行(50,000+)后可能会导致内存问题。