OpenXML for Excel - 文档必须只包含一个根元素。第1行,第0列

时间:2012-10-01 21:18:41

标签: c# excel openxml

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

无法打开文件:part / xl / worksheets / sheet2:缺少根元素 用XML错误替换了部分:/xl/worksheets/sheet2.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);
        }

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:1)

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

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

来自示例的行。注意,我拿了你的代码并用1代替了1 ..

你要看的地方是

        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函数,该引用是一个错误。

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

在Microsoft的示例代码中 - 他们使用:

        sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1);

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