【问题标题】:Open XML Creating Multiple sheets打开 XML 创建多个工作表
【发布时间】:2018-07-27 04:53:40
【问题描述】:

我正在尝试使用 Open XML C# 创建一个 Excel 文件,其中我的 excel 文件中有多个工作表需要创建。请在下面找到我的代码并帮助我解决问题。

当我打开 excel 时,只有 1 个工作表存在,工作表 2 会在工作表 1 中被覆盖。

    public void CreateExcelFile(string filePath , List<SheetData> excelSheet)
    {

        var sheetCount = GetSheetCount(filePath);


        using (SpreadsheetDocument spreedDoc = SpreadsheetDocument.Create(filePath,
            DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
        {
            Workbook workbook1 = new Workbook();
            workbook1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
            FileVersion fileVersion1 = new FileVersion() { ApplicationName = "xl", LastEdited = "5", LowestEdited = "4", BuildVersion = "9302" };
            WorkbookProperties workbookProperties1 = new WorkbookProperties() { FilterPrivacy = true, DefaultThemeVersion = (UInt32Value)124226U };

            BookViews bookViews1 = new BookViews();
            WorkbookView workbookView1 = new WorkbookView() { XWindow = 240, YWindow = 105, WindowWidth = (UInt32Value)14805U, WindowHeight = (UInt32Value)8010U, ActiveTab = (UInt32Value)2U };

            bookViews1.Append(workbookView1);
            Sheets sheetCol = new Sheets();

            int ctr = 0;
            foreach (var sheetToCreate in excelSheet)
            {
                ctr++;

                //WorksheetPart worksheetPart = null;
                //worksheetPart = wbPart.AddNewPart<WorksheetPart>();
                //var sheetData = new SheetData();

                //worksheetPart.Worksheet = new Worksheet(sheetData);
                //worksheetPart.Worksheet = new Worksheet(sheetToCreate);

                string sheetName = "Sheet";


                sheetName += ctr.ToString();



                var sheet = new Sheet()
                {
                    Id = "rId" + ctr,
                    SheetId = (UInt32)ctr,
                    Name = sheetName
                };
                sheet.Append(sheetToCreate);
                sheetCol.Append(sheet);


                //wbPart.Workbook.Sheets.AppendChild(sheet);
                //wbPart.Workbook.Append(sheetCol);

                workbook1.Sheets.Append(sheet);

                //var workingSheet = ((WorksheetPart)wbPart.GetPartById(sheet.Id)).Worksheet;



            }
            workbook1.Append(fileVersion1);
            workbook1.Append(workbookProperties1);
            workbook1.Append(bookViews1);
            workbook1.Append(sheetCol);



            //Set Border 
            //wbPark

            workbook1.Save();
        }
    }

【问题讨论】:

  • 这是关于一次添加多张工作表

标签: c# excel openxml


【解决方案1】:

在处理 OpenXML 时,“OpenXML Productivity Tool”(可从 Microsoft 网站下载)是您的朋友。当我使用 OpenXML 创建文档时,我会执行以下操作:

  1. 使用 Excel 或 Word 创建一个类似于我想要的文档(在本例中,一个包含两个工作表的 Excel 电子表格文档(我将它们标记为“第一”和“第二”)。
  2. 在生产力工具中打开文档
  3. 反映代码(工具 UI 上的按钮)
  4. 复制/粘贴我想要的代码。

如果我这样做,我最终会得到我需要的所有代码。我已经把它归结为要回答你的问题。 Excel 会抱怨下面生成的文档已损坏(因为它包含的只是创建两张表的代码 - 并留下了许多其他必需的代码 - 所有这些都可以从工具中窃取)。但是,如果您告诉 Excel“帮我修复此问题”,您将得到一个包含两张表的文档,分别标记为“第一张”和“第二张”

WorkbookPart workbookPart1 = document.AddWorkbookPart();
Workbook workbook1 = new Workbook() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "x15 xr xr6 xr10 xr2" } };
//lots of namespace declarations - copy them from the tool (they are needed!!)
//lots of code for WorkbookProperties, etc (you can get this from Tool)
Sheets sheets1 = new Sheets();
Sheet sheet1 = new Sheet() { Name = "First", SheetId = (UInt32Value)1U, Id = "rId1" };
Sheet sheet2 = new Sheet() { Name = "Second", SheetId = (UInt32Value)2U, Id = "rId2" };

sheets1.Append(sheet1);
sheets1.Append(sheet2);
//More elided code

workbook1.Append(sheets1);
workbookPart1.Workbook = workbook1;

我强烈建议您保持 Sheet 和 Sheets 之类的复数形式清晰。您的代码有Sheets sheetCol = new Sheets();,之后不清楚sheetCol 是Sheets 而不是Sheet。

然后你有一个名为sheetToCreate 的东西,它是一个SheetData 对象。再次,这令人困惑 - 称它为 thisSheetData 之类的明确名称。我真的强烈建议您尽可能地遵循 OpenXML 命名,否则将很难遵循正在发生的事情。

写出文件后,生产力工具也很​​方便。您可以看到自己创建的内容,通常会发现错误所在。此外,还有一个验证按钮,通常(并非总是)指出文档结构中的问题。

祝你好运。准备好更擅长骂你的代码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多