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

wnvonmuf  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(220)

strong text我正在尝试创建并写入Excel。对于模板,我只是从OPENXML Productivity工具中复制了现有Excel文件的代码,然后修改了代码,以便在从该代码创建新文件时添加数据行。但是,我似乎在使其正常工作时遇到了一些问题。我不断收到
c无法打开文件:零件/XL/工作表/工作表2:根元素缺少替换部件:/xl/worksheets/sheet2.xml部分存在XML错误。文档只能包含一个根元素。行1,列0。

错误,我仍然无法正确调试。此外,在原来的模板,有3个工作表在我的工作簿。我确保删除其中两个,这样我就可以只有一个创建的代码,因为我假定OpenXML2.0Productivity工具只为文档代码放在一起时存在的工作表生成代码。但发生的是,生成的文件有所有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);
        }
jhkqcmku

jhkqcmku1#

问题出在构建XML的方式上;正如错误所解释的,XML必须有一个根元素。2让我给予你一些例子:
有效的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>

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

06odsfpq

06odsfpq2#

如果让我猜的话--这个错误是由于您删除了

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

工作表初始值设定项中的ID实际上是对工作簿ID的引用。由于您删除了GenerateWorkbookPart 2Content函数,因此该引用是错误的。
啊,软引用的问题...
在Microsoft的示例代码中,它们用途:

sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1);

这仍然是一个软引用,但至少没有硬编码。)

pwuypxnk

pwuypxnk3#

只是一个供参考的任何人谁得到这个necrothread在他们的谷歌结果。
如果XML文件中没有实际数据,也会发生此错误。Excel会将此错误报告为根目录太多,而实际问题根本没有。

相关问题