C# OpenXML多页

C# OpenXML多页,c#,openxml,C#,Openxml,我正在将多张工作表添加到excel工作簿中。我想把一行放在一张纸上,另一行放在另一张纸上。此代码将两行放在两张图纸上。有没有办法解决这个问题 SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile, SpreadsheetDocumentType.Workbook); // Add a WorkbookPart to the document WorkbookPart wor

我正在将多张工作表添加到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>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild<Sheets>(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();
SpreadsheetDocument ssDoc=SpreadsheetDocument.Create(保存文件,SpreadsheetDocumentType.工作簿);
//将工作簿部件添加到文档中
WorkbookPart WorkbookPart=ssDoc.AddWorkbookPart();
workbookPart.工作簿=新工作簿();
//将工作表部件添加到工作簿部件
WorksheetPart WorksheetPart=workbookPart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
Sheets Sheets=ssDoc.WorkbookPart.Workbook.AppendChild(new Sheets());
图纸sheet1=新图纸()
{Id=ssDoc.WorkbookPart.GetIdOfPart(工作表部分),
SheetId=1,Name=“Sheet1”
};
图纸sheet2=新图纸()
{
Id=ssDoc.WorkbookPart.GetIdOfPart(工作表部分),
SheetId=2,Name=“Sheet2”
};
附页(第1页);
附页(第2页);
工作表=新工作表();
SheetData SheetData=新的SheetData();
Row headerRow=新行();
Cell-emptyCell=CreateTextCell(cellHeader,index,“”);
headerRow.Append(emptyCell);
行newRow=新行();
Cell mycell=CreateTextCell(cellHeader,索引,“数据”);
newRow.Append(mycell);
sheetData.Append(headerRow);
sheetData.Append(newRow);
工作表。附加(表数据);
工作表部分工作表=工作表;
ssDoc.Close();

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

像这样的事情似乎更合适

这似乎就是为什么这两页都受到影响的原因

worksheet.Append(sheetData);            
worksheetPart.Worksheet = worksheet;
您可能需要制作另一个sheetData(不是在此代码块中创建的)以发送到另一个工作表,或者尝试类似于上面提到的方法。

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

  • 需要一个单独的
    工作表部件
    对象
  • 需要一个单独的
    工作表
    对象
  • 需要一个单独的
    SheetData
    对象
  • 需要一个单独的
    对象
它看起来是这样的:

SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile,
    SpreadsheetDocumentType.Workbook);

WorkbookPart workbookPart = ssDoc.AddWorkbookPart();
workbookPart.Workbook = new Workbook();

Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

// Begin: Code block for Excel sheet 1
WorksheetPart worksheetPart1 = workbookPart.AddNewPart<WorksheetPart>();
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<WorksheetPart>();
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();
SpreadsheetDocument ssDoc=SpreadsheetDocument.Create(保存文件、,
电子表格文档类型。工作簿);
WorkbookPart WorkbookPart=ssDoc.AddWorkbookPart();
workbookPart.工作簿=新工作簿();
Sheets Sheets=ssDoc.WorkbookPart.Workbook.AppendChild(new Sheets());
//开始:Excel工作表1的代码块
WorksheetPart worksheetPart1=workbookPart.AddNewPart();
工作表工作表1=新工作表();
SheetData sheetData1=新的SheetData();
//表1的数据
Row rowInSheet1=新行();
Cell-emptyCell=CreateTextCell(cellHeader,index,“”);
rowInSheet1.Append(emptyCell);
sheetData1.追加(rowInSheet1);
工作表1.附件(表1);
工作表Part1。工作表=工作表1;
图纸sheet1=新图纸()
{
Id=ssDoc.WorkbookPart.GetIdOfPart(工作表part1),
SheetId=1,
Name=“Sheet1”
};
附页(第1页);
//结束:Excel工作表1的代码块
//开始:Excel工作表2的代码块
WorksheetPart worksheetPart2=workbookPart.AddNewPart();
工作表工作表2=新工作表();
SheetData sheetData2=新的SheetData();
//表2的数据
行rowInSheet2=新行();
Cell mycell=CreateTextCell(cellHeader,索引,“数据”);
rowInSheet2.Append(mycell);
sheetData2.追加(rowInSheet2);
工作表2.附件(数据表2);
工作表Part2。工作表=工作表2;
图纸sheet2=新图纸()
{
Id=ssDoc.WorkbookPart.GetIdOfPart(工作表part2),
SheetId=2,
Name=“Sheet2”
};
附页(第2页);
//结束:Excel工作表2的代码块
ssDoc.Close();

我不知道为什么会这么复杂。我只是通过浏览一些随机的博客和论坛帖子以及大量的尝试和错误发现了它。

希望我下面的代码可以帮助您

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

            foreach (DataTable table in tableSet.Tables)
            {
                WorksheetPart wSheetPart = wBookPart.AddNewPart<WorksheetPart>();
                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++;
            }                                
        }
    }
private void exportDocument(字符串文件路径,数据表sourceTable)
{
WorkbookPart wBookPart=null;
DataSet tableSet=getDataSet(sourceTable);//getDataSet是我的本地函数,用于根据我声明的有限行将数据表拆分为某些数据表。
使用(SpreadsheetDocument spreadsheetDoc=SpreadsheetDocument.Create(文件路径,SpreadsheetDocumentType.工作簿))
{
wBookPart=spreadsheetDoc.AddWorkbookPart();
wBookPart.Workbook=新工作簿();
uint sheetId=1;
电子表格doc.WorkbookPart.Workbook.Sheets=新表格();
Sheets Sheets=spreadsheetDoc.WorkbookPart.Workbook.GetFirstChild();
foreach(tableSet.Tables中的DataTable表)
{
工作表部分wSheetPart=wBookPart.AddNewPart();
Sheet Sheet=new Sheet(){Id=spreadsheetDoc.WorkbookPart.GetIdOfPart(wSheetPart),SheetId=SheetId,Name=“mySheet”+SheetId};
附页(页);
SheetData SheetData=新的SheetData();
wSheetPart.Worksheet=新工作表(sheetData);
Row headerRow=新行();
foreach(sourceTable.Columns中的DataColumn列)
{
单元格=新单元格();
cell.DataType=CellValues.String;
cell.CellValue=新的CellValue(column.ColumnName);
头附子(单元);
}
sheetData.AppendChild(headerRow);
foreach(table.Rows中的数据行dr)
{
行=新行();
foreach(table.Columns中的DataColumn列)
{
单元格=新单元格();
cell.DataType=Ce
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<Sheets>();

            foreach (DataTable table in tableSet.Tables)
            {
                WorksheetPart wSheetPart = wBookPart.AddNewPart<WorksheetPart>();
                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++;
            }                                
        }
    }