计算OpenDocument电子表格(ODS文件)中的列数

时间:2013-09-01 19:14:12

标签: c# xml spreadsheet xmldocument opendocument

我在C#中创建了一个非常简单的应用程序,它使用OpenDocument SpreadsheetXmlDocument类读取DotNetZipLib文件。由于格式和样式与我的应用程序无关,因此这是相对简单的。

该格式包含此问题<table:table-column><table:table-row><table:table-cell><table:covered-table-cell>感兴趣的几个要素。即使考虑列重复,列元素的数量也不一定对应于电子表格中的实际列数。同样,每个行元素包含不同数量的单元格元素。

正如OpenDocument specification中所述,我已经考虑了可以重复行,列和单元格的事实。这很好用,因为数据被读入我的数据格式的正确单元格。

根据我目前对规范的理解,似乎计算电子表格中列数的唯一方法是枚举每一行并计算单元格数。虽然这相对容易,但在填充我的数据结构之前知道列计数会很方便。

有没有办法有效地确定电子表格中的列数而无需单独考虑每一行?

2 个答案:

答案 0 :(得分:2)

我不建议您直接阅读和操作OpenDocument XML。建议您使用OpenOffice UNO API或ODF工具包。 如果您可以在该计算机上运行OpenOffice,则使用OpenOffice UNO API会更容易。如果您无法在该计算机上运行OpenOffice,则可以使用ODF工具包https://incubator.apache.org/odftoolkit/

使用C#的OpenOffice UNO API: Use OpenOffice Uno CLI with C# to create a spreadsheet

使用UNO API,我使用XCellRangesQuery中的queryContentCells。 http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangesQuery.html#queryContentCells

答案 1 :(得分: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();