简体   繁体   中英

Merge cells in Excel using “Openxml writer”

I want to merge cells is excel. By using DOM approach I can do it easily. But as my excel file is too large, when I tries to get worksheet it throws Out of memory exception. So I have to use SAX approach to read excel file. But I dont know how to merge cells in this approach. Searched a lot but every one gives the solution of DOM approach.

Can anyone help, Thanks in advance.

You can do this using 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();
}

My solution is: read the whole data from the old sheet by openxmlreader than write into new sheet by openxmlwriter, so I can add merge cell element after write data into sheetdata element.

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

        }

The way of merge cells in Excel using Openxml writer is below:

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

References:

Merge cell example

Merge cell function

openxmlwriter example

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM