0

DotNetZipLibとクラスを使用してOpenDocument スプレッドシートファイルを読み取る C# で非常に単純なアプリケーションを作成しました。フォーマットとスタイルは私のアプリケーションには関係ないので、これは単純な相対論です。XmlDocument

<table:table-column>この形式には、この質問に関連するいくつかの要素、、、およびが含まれて<table:table-row><table:table-cell>ます<table:covered-table-cell>。列要素の数は、列の繰り返しを考慮した場合でも、スプレッドシート内の実際の列数と必ずしも一致しません。同様に、各行要素には異なる数のセル要素が含まれます。

OpenDocument 仕様で述べられているように、行、列、およびセルが繰り返される可能性があるという事実を考慮しました。データがデータ形式の正しいセルに読み込まれているため、これはうまく機能しています。

仕様に関する私の現在の理解では、スプレッドシート内の列の数を数える唯一の方法は、各行を列挙してセルの数を数えることです。これは比較的簡単ですが、データ構造を埋める前に列数を知っておくと便利です。

各行を個別に考慮することなく、スプレッドシートの列数を効率的に決定する方法はありますか?

4

2 に答える 2

2

OpenDocument XML を直接読み取って操作することはお勧めしません。代わりに OpenOffice UNO API または ODF ツールキットを使用することをお勧めします。そのマシンで OpenOffice を実行できる場合は、OpenOffice UNO API を使用する方が簡単です。そのマシンで OpenOffice を実行できない場合は、ODF ツールキットhttps://incubator.apache.org/odftoolkit/を使用できます。

OpenOffice UNO API with C#: C# で OpenOffice Uno CLI を使用してスプレッドシートを作成する

UNO API では、これに XCellRangesQuery の queryContentCells を使用します。 http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangesQuery.html#queryContentCells

于 2013-09-02T00:31:10.650 に答える
0

OpenDocument スプレッドシートの列の総数を決定するには、最初に各行を読み取り、実行中のカウントを維持する必要があることに気付きました。

int maximumLength = 0;
while (IsReadingRows) {
    var row = ReadNextRow();
    rowList.Add(row);
    maximumLength = Math.Max(maximumLength, row.Length);
}

行が読み取られ、最大長が判明したら、読み取った各行に空のセルを追加します。

foreach (var row in rowList)
    while (row.Length < maximumLength)
        row.AddCell();
于 2013-09-06T16:03:36.597 に答える