使用“Openxml writer”合并 Excel 中的单元格

Posted

技术标签:

【中文标题】使用“Openxml writer”合并 Excel 中的单元格【英文标题】:Merge cells in Excel using "Openxml writer" 【发布时间】:2015-07-02 23:08:08 【问题描述】:

我要合并的单元格是excel。通过使用 DOM 方法,我可以轻松地做到这一点。但是由于我的 excel 文件太大,当我尝试获取工作表时,它会抛出内存不足异常。所以我必须使用 SAX 方法来读取 excel 文件。但我不知道如何在这种方法中合并单元格。 搜索了很多,但都给出了DOM方法的解决方案。

谁能帮忙,提前谢谢。

【问题讨论】:

你的问题解决了吗? 是的.. 但是使用 DOM 方法的唯一原因是.. 要在 Excel 中合并单元格,您必须具有单元格引用。并且只有在 Excel 准备好后才可用。 【参考方案1】:

我的解决方案是:通过 openxmlreader 从旧工作表中读取整个数据,而不是通过 openxmlwriter 写入新工作表,因此我可以在将数据写入 sheetdata 元素后添加合并单元格元素。

using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(YourExcelfileName, true))
        
            // Create reference of main Workbook part, which contains all reference.
            WorkbookPart objworkbook = myDoc.WorkbookPart;

            // pick up first worksheet
            WorksheetPart objworksheet = objworkbook.WorksheetParts.First();

            // will be used in end while creating sheet data
            string objorigninalSheetId = objworkbook.GetIdOfPart(objworksheet);
            WorksheetPart objreplacementPart = objworkbook.AddNewPart<WorksheetPart>();
            string objreplacementPartId = objworkbook.GetIdOfPart(objreplacementPart);

            Sheets sheets = objworkbook.Workbook.Sheets;
            Sheet sheet = new Sheet()  Id = workbookPart.GetIdOfPart(objreplacementPart), SheetId = 2, Name = "Sheet" ;
            sheets.Append(sheet);

            // Create object reader to read from excel file.
            OpenXmlReader objreader = OpenXmlReader.Create(objworksheet);

            // create writer object to write in excel sheet.
            OpenXmlWriter objOpenXmwriter = OpenXmlWriter.Create(objreplacementPart);

            objOpenXmwriter.WriteStartElement(new Worksheet());
            objOpenXmwriter.WriteStartElement(new SheetData());


            while (objreader.Read())
            
            //read the context of original sheetdata.
            //then put all data to new sheetdata by openxmlwriter

            

            // this is for Sheetdata
            objOpenXmwriter.WriteEndElement();

            //* after Sheetdata you can merge cells by openxmlwriter like that:    

            objOpenXmwriter.WriteStartElement(new MergeCells());
            objOpenXmwriter.WriteElement(new MergeCell()  Reference = "P1:Q1" );
            objOpenXmwriter.WriteElement(new MergeCell()  Reference = "R1:S1" );
            objOpenXmwriter.WriteEndElement();

            // this is for Worksheet
            objOpenXmwriter.WriteEndElement();

            //close all objects
            objreader.Close();
            objOpenXmwriter.Close();

            Sheet sheetreplace = objworkbook.Workbook.Descendants<Sheet>().Where(s => s.Id.Value.Equals(objorigninalSheetId)).First();
            sheetreplace.Id.Value = objreplacementPartId;
            objworkbook.DeletePart(objworksheet);

        

在Excel中使用Openxml writer合并单元格的方法如下:

objOpenXmwriter.WriteStartElement(new MergeCells());
objOpenXmwriter.WriteElement(new MergeCell()  Reference = "P1:Q1" );
objOpenXmwriter.WriteElement(new MergeCell()  Reference = "R1:S1" );
objOpenXmwriter.WriteEndElement();

参考资料:

Merge cell example

Merge cell function

openxmlwriter example

【讨论】:

【参考方案2】:

您可以使用EPPlus 来做到这一点:

using (ExcelPackage package = new ExcelPackage(new FileInfo(@"C:\Temp\example.xlsx")))

    ExcelWorksheet ws = package.Workbook.Worksheets.First();
    ws.Cells["A1:A2"].Merge = true;
    package.Save();

【讨论】:

不能使用任何其他工具。我们已经在生产环境中实现了功能。

以上是关于使用“Openxml writer”合并 Excel 中的单元格的主要内容,如果未能解决你的问题,请参考以下文章

从 vba 中的单元格地址获取 excel 合并单元格的值

python实现多个excel合成合并为一个excel

python实现多个excel合成合并为一个excel

Exce信息提取

踩坑d8:列表中添加字典 读写同一个exce的sheet页

DCOM EXCE权限配置问题