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

Posted

技术标签:

【中文标题】计算 OpenDocument 电子表格(ODS 文件)中的列数【英文标题】:Count number of columns in an OpenDocument Spreadsheet (ODS file) 【发布时间】:2013-09-01 19:14:11 【问题描述】:

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

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

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

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

有没有一种方法可以有效地确定电子表格中的列数,而不必单独考虑每一行?

【问题讨论】:

***.com/questions/9989645/… 【参考方案1】:

我不建议您直接阅读和操作 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

【讨论】:

感谢您的回答。虽然在一般实践中,使用现有 API 通常会更好,但在这种情况下,只需要轻量级的实现来从电子表格输入中抓取数据。商业包不适合这个项目,不幸的是我找不到完全用 C# 实现的开源 API。【参考方案2】:

我意识到要确定 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();

【讨论】:

以上是关于计算 OpenDocument 电子表格(ODS 文件)中的列数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 C#.net 将表格导出到打开的 office 电子表格(.ods 文件)中?

如何使用 ODFDOM 设置 ods 电子表格的页面大小、页面方向和页边距?

MaltReport2:基于 OpenDocument/OpenOfficeXML 的报表引擎

MaltReport2:基于 OpenDocument/OpenOfficeXML 的报表引擎

如何从 Perl 创建或读取 OpenOffice 电子表格?

通过 Python 脚本更新之前打开的 LibreOffice 电子表格而不关闭 LibreOffice