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

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

ccannot打开文件:part / xl / worksheets / sheet2:缺less根元素replace部分:/xl/worksheets/sheet2.xml部分出现XML错误。 一个文档必须包含一个根元素。 第1行第0列

错误,我仍然无法正确debugging。 另外,在原始模板中,我的工作簿中有3张。 我确定删除了其中的两个,所以我可以只创build一个代码,因为我认为OpenXML 2.0生产力工具只会生成当前文档代码放在一起的表单的代码。 但是会发生的是,生成的文件已经包含了全部4张原始表格,但似乎无法将标题放在每个表格上。

希望得到一些提示,去哪里去find这个问题,并解决它。 提前致谢。

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

问题在于你构造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> 

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

如果我不得不猜测 – 这个错误是由于你删除了这个事实

  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的引用。 由于您摆脱了GenerateWorkbookPart2Content函数,该引用是一个错误。

啊,软引用的问题…

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

  sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1); 

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