使用“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 中的单元格的主要内容,如果未能解决你的问题,请参考以下文章