Just posting the solution I worked out today. See my answer below.
If you don't have开发者_开发知识库 the very helpful OpenXML SDK v2.0 Tool, you can find it at http://www.microsoft.com/downloads/details.aspx?FamilyID=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en
If you know the purpose of the lines I commented with "I don't know...", please leave a comment explaining them.
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;
}
(1) I don't know what Selection.ActiveCell is used for
There is a focus rectangle around the ActiveCell when Excel opens. A1 is the ActivCell default when a new spreadsheet is opened. ActiveCell can be set to any cell using Selection.ActiveCell
(2) I don't know what SheetDimension.Reference is used for
SheetDimension.Reference contanis a Range such as "A4:BA25" A4 is the first cell with a value and BA25 is the last. I don't know exactly how Excel uses this info but OpenXml doesn't maintain xml for empty rows, columns, cells. The SheetDimension.Reference indicates that there are no cells with values before A4 and no cells with values after BA25
I don't know what Selection.ActiveCell is used for
There is a focus rectangle around the ActiveCell when Excel opens. A1 is the ActivCell default when a new spreadsheet is created. ActiveCell can be set to any cell using Selection.ActiveCell
精彩评论