我在C#中创建了一个非常简单的应用程序,它使用OpenDocument Spreadsheet和XmlDocument
类读取DotNetZipLib文件。由于格式和样式与我的应用程序无关,因此这是相对简单的。
该格式包含此问题<table:table-column>
,<table:table-row>
,<table:table-cell>
和<table:covered-table-cell>
感兴趣的几个要素。即使考虑列重复,列元素的数量也不一定对应于电子表格中的实际列数。同样,每个行元素包含不同数量的单元格元素。
正如OpenDocument specification中所述,我已经考虑了可以重复行,列和单元格的事实。这很好用,因为数据被读入我的数据格式的正确单元格。
根据我目前对规范的理解,似乎计算电子表格中列数的唯一方法是枚举每一行并计算单元格数。虽然这相对容易,但在填充我的数据结构之前知道列计数会很方便。
有没有办法有效地确定电子表格中的列数而无需单独考虑每一行?
答案 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();