0

XmlWriter を使用して XML レポートを作成しようとしました。不思議なことに、MS Excel でレポート ファイルを開こうとすると、多数のレコードに対して次のエラーが表示されます。「ファイルが壊れているため、開けません」。ただし、レポート ファイルは破損していないと思います。他のエディター (メモ帳など) と同様に、ファイルを開いて内容に問題がないことを確認できます。

以下のコードでは、ループは上限が 1995 の場合は問題なく動作しますが、上限が 1996 の場合は失敗します。

前もって感謝します、

================================================== ======================

    private static void WriteReport(XmlWriter writer, ReportingFilters filters, DataContext context)
    {

        writer.WriteStartElement("Table"); // Begin Table

        writer.WriteAttributeString("ss", "ExpandedColumnCount", null, "7");
        writer.WriteAttributeString("ss", "ExpandedRowCount", null, "2000");
        writer.WriteAttributeString("x", "FullColumns", null, "1");
        writer.WriteAttributeString("x", "FullRows", null, "1");

        writer.WriteStartElement("Column");
        writer.WriteAttributeString("ss", "Width", null, "200");
        writer.WriteEndElement();

        writer.WriteStartElement("Column");
        writer.WriteAttributeString("ss", "Width", null, "125");
        writer.WriteEndElement();

        writer.WriteStartElement("Column");
        writer.WriteAttributeString("ss", "Width", null, "100");
        writer.WriteEndElement();

        writer.WriteStartElement("Column");
        writer.WriteAttributeString("ss", "Width", null, "75");
        writer.WriteEndElement();

        writer.WriteStartElement("Column");
        writer.WriteAttributeString("ss", "Width", null, "75");
        writer.WriteEndElement();

        // Write the title.
        writer.WriteStartElement("Row");
        writer.WriteStartElement("Cell");
        writer.WriteAttributeString("ss", "StyleID", null, "BorderedTitle");
        writer.WriteStartElement("Data");
        writer.WriteAttributeString("ss", "Type", null, "String");
        writer.WriteString("Selected Dates: " + filters.StartDate.ToShortDateString() + " -" + filters.EndDate.ToShortDateString());
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndElement();

        // Write the title.
        writer.WriteStartElement("Row");
        writer.WriteStartElement("Cell");
        writer.WriteAttributeString("ss", "StyleID", null, "BorderedTitle");
        writer.WriteStartElement("Data");
        writer.WriteAttributeString("ss", "Type", null, "String");
        writer.WriteString("Date Report was Run: " + DateTime.Now.ToShortDateString());
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndElement();

        //.. etc

        var reportResults = ReportingManager.GetHospitalHitRate(context, filters);
        var totalDemos = 0;
        var totalMatched = 0;

            // Loop works OK for 1995, 1996 fails with "The file is corrupt and cannot be opened"
            for (int m = 0; m < 1995; m++ )
            {
                writer.WriteStartElement("Row"); // Begin Content Row

                writer.WriteStartElement("Cell");
                writer.WriteStartElement("Data");
                writer.WriteAttributeString("ss", "Type", null, "String");
                writer.WriteString("aaaaaaaaaaaaaaaaaaaaaaa");
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteStartElement("Cell");
                writer.WriteStartElement("Data");
                writer.WriteAttributeString("ss", "Type", null, "String");
                writer.WriteString("bbbbbbbbbbbbbbb");
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteStartElement("Cell");
                writer.WriteStartElement("Data");
                writer.WriteAttributeString("ss", "Type", null, "String");
                writer.WriteString("cccccccccccc");
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteStartElement("Cell");
                writer.WriteStartElement("Data");
                writer.WriteAttributeString("ss", "Type", null, "String");
                writer.WriteString("dddddddddd");
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteStartElement("Cell");
                writer.WriteStartElement("Data");
                writer.WriteAttributeString("ss", "Type", null, "String");

                //.. etc
                writer.WriteString("%");
                writer.WriteEndElement();
                writer.WriteEndElement();

                writer.WriteEndElement();

            }

        //.. etc

        writer.WriteEndElement(); // End Table.
    }
}
4

1 に答える 1

0

グーグルで調べた後、 http://msdn.microsoft.com/en-us/library/office/aa140066%28v=office.10%29.aspxで「XML スプレッドシート リファレンス」を見つけました 。

属性 ss:ExpandedRowCount を使用していたことが判明し、それを 2000 に設定しました。レコード数がこの数を超える場合、XML スプレッドシート ドキュメントは無効と見なされました。このオプションの属性を削除すると、生成されたレポートは正常に機能しました。

属性: ss:ExpandedRowCount 説明: このテーブル内の行の総数をスパース性に関係なく指定します。この属性は、指定された行と列がフル サイズに拡張された場合のテーブル全体のサイズを定義します。指定する場合、この属性はテーブルと同期している必要があります。テーブル内の行インデックスは 1 から始まり、ExpandedRowCount まで続く必要があります。この値がテーブルと同期していない場合、指定された XML スプレッドシート ドキュメントは無効です。

于 2012-09-03T13:16:53.733 に答える