1

*强文本*我正在尝试创建和写入 excel。对于模板,我只是从 OPENXML Productivity 工具中为现有的 excel 文件复制代码,然后修改代码以在从该代码创建新文件时添加我的数据行。但是,我似乎在让它正常工作时遇到了一些问题。我不断得到一个

c 无法打开文件:part /xl/worksheets/sheet2:缺少根元素 替换部分:/xl/worksheets/sheet2.xml 部分带有 XML 错误。一个文档必须只包含一个根元素。第 1 行,第 0 列。

我仍然无法正确调试的错误。此外,在原始模板中,我的工作簿中有 3 张工作表。我确保删除其中的两个,这样我就可以只创建一个的代码,因为我假设 OpenXML 2.0 Productivity 工具只会为文档代码放在一起时存在的工作表生成代码。但是发生的情况是,生成的文件包含所有 4 个原始工作表,但似乎无法将每个工作表的标题放在一起。

想获得一些关于去哪里找到这个问题并解决它的提示。提前致谢。

   public void CreatePackage(string filePath)
        {
            using (SpreadsheetDocument package = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook))
            {
                CreateParts(package);
            }
        }

        private void CreateParts(SpreadsheetDocument document)
        {
            ExtendedFilePropertiesPart extendedFilePropertiesPart1 = document.AddNewPart<ExtendedFilePropertiesPart>("rId3");
            GenerateExtendedFilePropertiesPart1Content(extendedFilePropertiesPart1);

            WorkbookPart workbookPart1 = document.AddWorkbookPart();
            GenerateWorkbookPart1Content(workbookPart1);

            WorkbookStylesPart workbookStylesPart1 = workbookPart1.AddNewPart<WorkbookStylesPart>("rId3");
            GenerateWorkbookStylesPart1Content(workbookStylesPart1);

            ThemePart themePart1 = workbookPart1.AddNewPart<ThemePart>("rId2");
            GenerateThemePart1Content(themePart1);

            WorksheetPart worksheetPart1 = workbookPart1.AddNewPart<WorksheetPart>("rId1");
            GenerateWorksheetPart1Content(worksheetPart1);

            WorksheetCommentsPart worksheetCommentsPart1 = worksheetPart1.AddNewPart<WorksheetCommentsPart>("rId2");
            GenerateWorksheetCommentsPart1Content(worksheetCommentsPart1);

            VmlDrawingPart vmlDrawingPart1 = worksheetPart1.AddNewPart<VmlDrawingPart>("rId1");
            GenerateVmlDrawingPart1Content(vmlDrawingPart1);

            SharedStringTablePart sharedStringTablePart1 = workbookPart1.AddNewPart<SharedStringTablePart>("rId4");
            GenerateSharedStringTablePart1Content(sharedStringTablePart1);

            SetPackageProperties(document);
        }
4

2 回答 2

1

如果我不得不猜测 - 这个错误是由于您删除了

        WorksheetPart worksheetPart2 = workbookPart2.AddNewPart<WorksheetPart>("rId2");
        GenerateWorksheetPart2Content(worksheetPart2);

示例中的行。请注意,我拿走了您的代码并将 1 替换为 2 ..

你会看的地方是

        WorkbookPart workbookPart1 = document.AddWorkbookPart();
        GenerateWorkbookPart1Content(workbookPart1);

部分。在他们有多个工作表生成的地方(不是工作表生成,这是您删除的部分)

        Sheets sheets1 = new Sheets();
        Sheet sheet1 = new Sheet() { Name = "sheet1", SheetId = (UInt32Value)1U, Id = "rId1" };
        Sheet sheet2 = new Sheet() { Name = "sheet2", SheetId = (UInt32Value)2U, Id = "rId2" };

        sheets1.Append(sheet1);
        sheets1.Append(sheet2);

Sheet 初始化程序中的 id 实际上是对工作簿 ID 的引用。由于您摆脱了 GenerateWorkbookPart2Content 函数,因此该引用是一个错误。

啊,软引用的问题......

在微软的示例代码中——他们使用:

        sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1);

这仍然是一个软参考,但至少没有硬编码.. ;)

于 2014-09-04T14:51:40.807 回答
1

问题在于您构建 XML 的方式;正如错误所解释的,XML 必须只有一个根元素。让我举几个例子:

有效的 XML 文档:

<users>
 <user>
  <name>Omar</name>
  <age>25</age>
 </user>
 <user>
  <name>Gabbo</name>
  <age>41</age>
 </user>
</users>

无效的 XML 文档:

<user>
 <name>Omar</name>
 <age>25</age>
</user>
<user>
 <name>Gabbo</name>
 <age>41</age>
</user>

在第一个示例中,文档中的每个元素都是 users 的子元素,而在第二个示例中,有两个用户浮动。

于 2012-10-01T21:29:04.283 回答