OpenXML для Excel - документ должен содержать ровно один корневой элемент. Строка 1, столбец 0
* сильный текст * я пытаюсь создать и написать, чтобы преуспеть. Для шаблона я просто скопировал код из инструмента OPENXML Productivity для существующего файла Excel, а затем изменил код, добавив мои строки данных при создании нового файла из этого кода. Тем не менее, у меня, кажется, есть некоторые проблемы, заставляющие это работать правильно Я продолжаю получать
Невозможно открыть файл: part /xl/worksheets/sheet2: корневой элемент отсутствует Замененная часть: /xl/worksheets/sheet2.xml деталь с ошибкой XML. Документ должен содержать ровно один корневой элемент. Строка 1, столбец 0.
ошибка, которую я до сих пор не могу правильно отладить. Также в исходном шаблоне в моей книге было 3 листа. Я удостоверился, что удалил два из них, чтобы у меня был только код для созданного, так как я предполагал, что инструмент производительности OpenXML 2.0 будет генерировать код только для листа, который существовал на момент создания кода документа. Но что происходит, так это то, что в сгенерированном файле есть все 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);
}
3 ответа
Проблема в том, как вы структурируете 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);
Этот идентификатор в инициализаторе листа фактически является ссылкой на идентификатор рабочей книги. Поскольку вы избавились от функции GenerateWorkbookPart2Content, эта ссылка является ошибкой.
Ааа, проблема с мягкими ссылками...
В примере кода Microsoft - они используют:
sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1);
Который по-прежнему мягкая ссылка, но по крайней мере нет жесткого кодирования..;)
Просто к сведению всех, кто находит этот некротред в своих результатах Google...
Эта ошибка также возникает, если у вас есть XML-файл без фактических данных. Excel сообщит об этом, как будто у вас слишком много корней, хотя на самом деле проблема вовсе не в них.