2013-09-01 69 views
0

我在C#中创建了一个非常简单的应用程序,该应用程序使用DotNetZipLibXmlDocument类读取OpenDocument Spreadsheet文件。这是相对简单的,因为格式和样式与我的应用程序无关。计算OpenDocument电子表格(ODS文件)中的列数

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

正如OpenDocument specification说我已经考虑到一个事实,即行,列和单元格可以重复。这是很好的,因为数据正在被读入我的数据格式的正确单元格中。

以我目前的规范的理解,似乎只有这样才能计算列数在电子表格的每一行来枚举和计数细胞的数量。虽然这是比较容易,这将是方便知道列数之前填充我的数据结构。

有没有办法有效地确定在电子表格的列数,而不必单独考虑每一行?

+0

http://stackoverflow.com/questions/9989645/reading-openoffice-calc-ods-programmatically-using-c/9989726 #9989726 – 2013-09-06 14:17:37

回答

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(); 
2

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

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

随着UNO API我用queryContentCells从XCellRangesQuery这一点。 http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangesQuery.html#queryContentCells

+0

T汉克斯为你的答案。在一般情况下,使用现有的API通常会更好,但在这种情况下,只需轻量级实现从电子表格输入中刮取数据。一个商业软件包不适合这个项目,不幸的是我无法找到一个完全用C#实现的开源API。 –

相关问题