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 сообщит об этом, как будто у вас слишком много корней, хотя на самом деле проблема вовсе не в них.

Другие вопросы по тегам