1

*強いテキスト* Excel に作成して書き込もうとしています。テンプレートについては、既存の Excel ファイルのコードを OPENXML Productivity Tool から単純にコピーし、そのコードから新しいファイルが作成されたときにデータの行を追加するようにコードを変更しました。ただし、これを正しく機能させるには問題があるようです。私は取得し続けます

ファイルを開けません : パーツ /xl/worksheets/sheet2: ルート要素がありません 置き換えられたパーツ: /xl/worksheets/sheet2.xml パーツと XML エラー。ドキュメントには、ルート要素が 1 つだけ含まれている必要があります。行 1、列 0。

まだ正しくデバッグできないエラー。また、元のテンプレートでは、ワークブックに 3 つのシートがありました。OpenXML 2.0 Productivity ツールは、ドキュメント コードがまとめられた時点で存在していたシートのコードのみを生成すると想定していたため、そのうちの 2 つを削除して、作成された 1 つのコードのみを保持できるようにしました。しかし、生成されたファイルには 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);
        }
4

2 に答える 2

1

問題は、XML を構造化する方法にあります。エラーが説明しているように、XML にはルート要素が 1 つだけ必要です。いくつか例を挙げましょう。

有効な 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>

最初の例では、ドキュメント内のすべての要素が users の子ですが、2 番目の例では 2 人のユーザーが浮かんでいます。

于 2012-10-01T21:29:04.283 に答える
1

私が推測しなければならなかった場合 - このエラーは、あなたが削除したという事実によって引き起こされます

        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 関数を削除したため、その参照はエラーです。

ああ、ソフト参照の問題...

Microsoft のサンプル コードでは、以下を使用しています。

        sheet1.Id = workbookPart.GetIdOfPart(worksheetPart1);

これはまだソフトリファレンスですが、少なくともハードコーディングはありません.. ;)

于 2014-09-04T14:51:40.807 に答える