OpenXML多张表格

我正在为excel工作簿添加多个工作表。 我希望在一张纸上有一行,在另一张纸上有另一行。 此代码将两行都放在两个工作表上。 有想法该怎么解决这个吗?

SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile, SpreadsheetDocumentType.Workbook); // Add a WorkbookPart to the document WorkbookPart workbookPart = ssDoc.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); // Add a WorksheetPart to theWorkbookPart WorksheetPart worksheetPart = workbookPart.AddNewPart(); worksheetPart.Worksheet = new Worksheet(new SheetData()); Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet1 = new Sheet() { Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; Sheet sheet2 = new Sheet() { Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 2, Name = "Sheet2" }; sheets.Append(sheet1); sheets.Append(sheet2); Worksheet worksheet = new Worksheet(); SheetData sheetData = new SheetData(); Row headerRow = new Row(); Cell emptyCell = CreateTextCell(cellHeader, index, ""); headerRow.Append(emptyCell); Row newRow = new Row(); Cell mycell = CreateTextCell(cellHeader, index, "data"); newRow.Append(mycell); sheetData.Append(headerRow); sheetData.Append(newRow); worksheet.Append(sheetData); worksheetPart.Worksheet = worksheet; ssDoc.Close(); 

对于每个Excel工作表(具有单独的数据)

  • 需要单独的WorkSheetPart对象
  • 需要单独的WorkSheet对象
  • 需要单独的SheetData对象
  • 需要单独的Sheet对象

它看起来像这样:

 SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile, SpreadsheetDocumentType.Workbook); WorkbookPart workbookPart = ssDoc.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild(new Sheets()); // Begin: Code block for Excel sheet 1 WorksheetPart worksheetPart1 = workbookPart.AddNewPart(); Worksheet workSheet1 = new WorkSheet(); SheetData sheetData1 = new SheetData(); // the data for sheet 1 Row rowInSheet1 = new Row(); Cell emptyCell = CreateTextCell(cellHeader, index, ""); rowInSheet1.Append(emptyCell); sheetData1.Append(rowInSheet1); worksheet1.AppendChild(sheetData1); worksheetPart1.Worksheet = workSheet1; Sheet sheet1 = new Sheet() { Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart1), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet1); // End: Code block for Excel sheet 1 // Begin: Code block for Excel sheet 2 WorksheetPart worksheetPart2 = workbookPart.AddNewPart(); Worksheet workSheet2 = new WorkSheet(); SheetData sheetData2 = new SheetData(); // the data for sheet 2 Row rowInSheet2 = new Row(); Cell mycell = CreateTextCell(cellHeader, index, "data"); rowInSheet2.Append(mycell); sheetData2.Append(rowInSheet2); worksheet2.AppendChild(sheetData2); worksheetPart2.Worksheet = workSheet2; Sheet sheet2 = new Sheet() { Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart2), SheetId = 2, Name = "Sheet2" }; sheets.Append(sheet2); // End: Code block for Excel sheet 2 ssDoc.Close(); 

我不知道为什么它必须如此复杂。 我只是通过浏览一些随机的博客和论坛post以及大量的试验和错误来找到它。

希望我的代码可以帮到你。

 private void exportDocument(string FilePath, DataTable sourceTable) { WorkbookPart wBookPart = null; DataSet tableSet = getDataSet(sourceTable);//getDataSet is my local function which is used to split a datatable into some datatable based on limited row I've declared. using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Create(FilePath, SpreadsheetDocumentType.Workbook)) { wBookPart = spreadsheetDoc.AddWorkbookPart(); wBookPart.Workbook = new Workbook(); uint sheetId = 1; spreadsheetDoc.WorkbookPart.Workbook.Sheets = new Sheets(); Sheets sheets = spreadsheetDoc.WorkbookPart.Workbook.GetFirstChild(); foreach (DataTable table in tableSet.Tables) { WorksheetPart wSheetPart = wBookPart.AddNewPart(); Sheet sheet = new Sheet() { Id = spreadsheetDoc.WorkbookPart.GetIdOfPart(wSheetPart), SheetId = sheetId, Name = "mySheet" + sheetId }; sheets.Append(sheet); SheetData sheetData = new SheetData(); wSheetPart.Worksheet = new Worksheet(sheetData); Row headerRow = new Row(); foreach (DataColumn column in sourceTable.Columns) { Cell cell = new Cell(); cell.DataType = CellValues.String; cell.CellValue = new CellValue(column.ColumnName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow); foreach (DataRow dr in table.Rows) { Row row = new Row(); foreach (DataColumn column in table.Columns) { Cell cell = new Cell(); cell.DataType = CellValues.String; cell.CellValue = new CellValue(dr[column].ToString()); row.AppendChild(cell); } sheetData.AppendChild(row); } sheetId++; } } } 

如果您遇到任何问题,请告诉我。

看来你在这里遗漏了一些代码,但我认为你应该附加表格,而不是其他的(不在此代码中的值)

 sheet1.Append(headerRow); sheet2.Append(newRow); 

这样的事情似乎更合适。

这似乎是两个页面都受到影响的原因。

 worksheet.Append(sheetData); worksheetPart.Worksheet = worksheet; 

你需要制作另一个sheetData(不是在这个代码块中创建)发送到另一个工作表,或者尝试像我上面提到的方法。