【问题标题】:OpenXML Multiple SheetsOpenXML 多张工作表
【发布时间】:2012-02-02 21:51:12
【问题描述】:

我正在向 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();

【问题讨论】:

    标签: c# openxml


    【解决方案1】:

    对于每个 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<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();
    

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

    【讨论】:

    • 非常优雅的解决方案,比其他解决方案更容易使用。请注意,任何寻找 CreateTextCell 代码的人都可以在这里找到它:msdn.microsoft.com/en-us/library/…
    • 注意这一点:需要单独的WorkSheetPart对象 需要单独的WorkSheet对象 需要单独的SheetData对象 需要单独的Sheet对象
    • 符合:Worksheet workSheet1 = new WorkSheet();应该是 Worksheet workSheet1 = new Worksheet();与 workSheet2 类似。
    • 很好解释
    【解决方案2】:

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

    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++;
                }                                
            }
        }
    

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

    【讨论】:

      【解决方案3】:

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

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

      这样的东西似乎更合适。

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

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

      您要么需要制作另一个 sheetData(未在此代码块中创建)发送到另一个工作表,要么尝试我上面提到的方法。

      【讨论】:

      • 我试图将行附加到工作表,但这给了我一个错误。我也尝试过使用多个 sheetData,但我不知道如何将它们连接到单个工作表。
      • 好吧,你把这些东西从这个代码块中去掉了。我们需要更多代码来提供帮助。
      • 这是我所有的代码。我尝试了你的建议,但这似乎是不可能的。而且我不知道我在用多个 sheetData 做什么。这就是我来找你们的原因。
      • 您同时引用了 sheetData 和 worksheet 并且这两个变量都没有在此代码中创建。
      • 糟糕。好的,你让我到了那里。我已经编辑了我的代码。谢谢你的耐心:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多