¿Cómo agrego una nueva hoja a un archivo de Excel .xlsx utilizando el SDK v2.0 OpenXML con C #?

StackOverflow https://stackoverflow.com/questions/2495390

  •  21-09-2019
  •  | 
  •  

Pregunta

Sólo publicar la solución trabajé a cabo en la actualidad. Véase mi respuesta a continuación.

Si usted no tiene la muy útiles v2.0 OpenXML SDK herramienta, se pueden encontrar en http://www.microsoft.com/downloads/details.aspx?FamilyID=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en

Si conoce el propósito de las líneas que comentaba con "No sé ...", por favor dejar un comentario explicando ellos.

¿Fue útil?

Solución

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(spreadSheetFileName, true)) {
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

    // rId must be unique within the spreadsheet. 
    // You might be able to use the SpreadSheetDocument.Parts.Count() to do this.
    // i.e. string relationshipID = "rId" + (spreadsheetDocument.Parts.Count() + 1).ToString();
    string rId = "rId6";

    // Sheet.Name and Sheet.SheetId must be unique within the spreadsheet.
    Sheet sheet = new Sheet() { Name = "Sheet4", SheetId = 4U, Id = rId };
    workbookPart.Workbook.Sheets.Append(sheet);

    WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(rId);

    Worksheet worksheet = new Worksheet();
    worksheet.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

    // I don't know what SheetDimension.Reference is used for, it doesn't seem to change the resulting xml.
    SheetDimension sheetDimension = new SheetDimension() { Reference = "A1:A3" };
    SheetViews sheetViews = new SheetViews();
    // If more than one SheetView.TabSelected is set to true, it looks like Excel just picks the first one.
    SheetView sheetView = new SheetView() { TabSelected = false, WorkbookViewId = 0U };

    // I don't know what Selection.ActiveCell is used for, it doesn't seem to change the resulting xml.
    Selection selection = new Selection() { ActiveCell = "A1", SequenceOfReferences = new ListValue<StringValue>() { InnerText = "A1" } };
    sheetView.Append(selection);
    sheetViews.Append(sheetView);
    SheetFormatProperties sheetFormatProperties = new SheetFormatProperties() { DefaultRowHeight = 15D };

    SheetData sheetData = new SheetData();

    // I don't know what the InnerText of Row.Spans is used for. It doesn't seem to change the resulting xml.
    Row row = new Row() { RowIndex = 1U, Spans = new ListValue<StringValue>() { InnerText = "1:3" } };

    Cell cell1 = new Cell() { CellReference = "A1", DataType = CellValues.Number, CellValue = new CellValue("99") };
    Cell cell2 = new Cell() { CellReference = "B1", DataType = CellValues.Number, CellValue = new CellValue("55") };
    Cell cell3 = new Cell() { CellReference = "C1", DataType = CellValues.Number, CellValue = new CellValue("33") };

    row.Append(cell1);
    row.Append(cell2);
    row.Append(cell3);

    sheetData.Append(row);
    PageMargins pageMargins = new PageMargins() { Left = 0.7D, Right = 0.7D, Top = 0.7D, Bottom = 0.75D, Header = 0.3D, Footer = 0.3D };

    worksheet.Append(sheetDimension);
    worksheet.Append(sheetViews);
    worksheet.Append(sheetFormatProperties);
    worksheet.Append(sheetData);
    worksheet.Append(pageMargins);

    worksheetPart.Worksheet = worksheet;
}

Otros consejos

(1) No sé lo que se utiliza para Selection.ActiveCell

Hay un rectángulo de selección alrededor de la ActiveCell cuando se abre Excel. A1 es el valor predeterminado ActivCell cuando se abre una nueva hoja de cálculo. ActiveCell se puede ajustar a cualquier célula usando Selection.ActiveCell

(2) No sé lo que se utiliza para SheetDimension.Reference

SheetDimension.Reference contanis un rango como "A4: BA25" A4 es el primer celular con un valor y BA25 es el último. No sé exactamente cómo Excel utiliza esta información, pero no mantiene OpenXml XML para las filas vacías, columnas, celdas. El SheetDimension.Reference indica que no hay celdas con los valores anteriores A4 y no hay celdas con valores después BA25

No sé lo que se utiliza para Selection.ActiveCell

Hay un rectángulo de selección alrededor de la ActiveCell cuando se abre Excel. A1 es el valor predeterminado ActivCell cuando se crea una nueva hoja de cálculo. ActiveCell se puede ajustar a cualquier célula usando Selection.ActiveCell

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top