Как добавить новый лист в файл Excel .xlsx, используя OpenXML SDK v2.0 с c #? - PullRequest
2 голосов
/ 22 марта 2010

Просто опубликовать решение, которое я разработал сегодня. Смотрите мой ответ ниже.

Если у вас нет очень полезного инструмента OpenXML SDK v2.0, вы можете найти его по адресу http://www.microsoft.com/downloads/details.aspx?FamilyID=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en

Если вы знаете назначение строк, которые я прокомментировал словами «Я не знаю ...», пожалуйста, оставьте комментарий, объясняющий их.

Ответы [ 3 ]

5 голосов
/ 22 марта 2010
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;
}
2 голосов
/ 17 сентября 2010

(1) Я не знаю, что Selection.ActiveCell используется для

При открытии Excel вокруг ActiveCell появляется прямоугольник фокусировки. A1 является значением по умолчанию ActivCell при открытии новой электронной таблицы. ActiveCell может быть установлен на любую ячейку с помощью Selection.ActiveCell

(2) Я не знаю, что такое SheetDimension. Ссылка используется для

SheetDimension.Reference Contanis a Range, такой как "A4: BA25" A4 - это первая ячейка со значением, а BA25 - последняя. Я не знаю точно, как Excel использует эту информацию, но OpenXml не поддерживает XML для пустых строк, столбцов, ячеек. SheetDimension.Reference указывает, что нет ячеек со значениями до A4 и нет ячеек со значениями после BA25

0 голосов
/ 17 сентября 2010

Я не знаю, что Selection.ActiveCell используется для

При открытии Excel вокруг ActiveCell появляется прямоугольник фокусировки. A1 является значением по умолчанию ActivCell при создании новой электронной таблицы. ActiveCell может быть установлен на любую ячейку с помощью Selection.ActiveCell

...