1
我使用OpenOffice的UNO API通過作家文檔中的所有文本進行迭代。迭代當前我使用XTextTable接口getCellNames()方法的文本表。我如何檢測合併和拆分單元格。我想將表格導出爲html,所以我應該計算colspan和rowspan。OpenOffice的通過TextTable迭代檢測合併和拆分單元格(計算合併單元格和行跨度)
我將不勝感激任何建議...我出出主意:(
我使用OpenOffice的UNO API通過作家文檔中的所有文本進行迭代。迭代當前我使用XTextTable接口getCellNames()方法的文本表。我如何檢測合併和拆分單元格。我想將表格導出爲html,所以我應該計算colspan和rowspan。OpenOffice的通過TextTable迭代檢測合併和拆分單元格(計算合併單元格和行跨度)
我將不勝感激任何建議...我出出主意:(
最後,我找到了答案(它實際上是合併單元格的一部分)。這段代碼是醜陋的,我知道,但有一天我會重構它;)
public class Cell
{
private List<string> _text = new List<string>();
public List<string> Text
{
get { return _text; }
set { _text = value; }
}
public int ColSpan { get; set; }
public int RowSpan { get; set; }
public Cell(int colSpan, int rowSpan, List<string> text)
{
ColSpan = colSpan;
RowSpan = rowSpan;
_text = text;
}
public Cell(int colSpan, int rowSpan)
{
ColSpan = colSpan;
RowSpan = rowSpan;
}
}
在這裏它是表剖析方法
public static List<List<Cell>> ParseTable(XTextTable table)
{
XTableRows rows = table.getRows() as XTableRows;
int rowCount = rows.getCount();
int sum = GetTableColumnRelativeSum(table);
// Temprorary store for column count of each row
int[] colCounts = new int[rowCount];
List<List<int>> matrix = new List<List<int>>(rowCount);
for (int i = 0; i < rowCount; i++)
matrix.Add(new List<int>());
// Get column count for each row
int maxColCount = 0;
for (int rowNo = 0; rowNo < rowCount; rowNo++)
{
TableColumnSeparator[] sep = GetTableRowSeperators(rows, rowNo);
colCounts[rowNo] = sep.Length + 1;
if (maxColCount < colCounts[rowNo])
maxColCount = colCounts[rowNo];
for (int j = 0; j < sep.Length; j++)
matrix[rowNo].Add(sep[j].Position);
matrix[rowNo].Add(sum);
}
int[] curIndex = new int[rowCount];
List<List<Cell>> results = new List<List<Cell>>(rowCount);
for (int i = 0; i < rowCount; i++)
results.Add(new List<Cell>());
int curMinSep = matrix[0][0];
do
{
curMinSep = matrix[0][curIndex[0]];
for (int i = 0; i < rowCount; i++)
if (curMinSep > matrix[i][curIndex[i]]) curMinSep = matrix[i][curIndex[i]];
for (int rowNo = 0; rowNo < rowCount; rowNo++)
{
int col = curIndex[rowNo];
int lastIdx = results[rowNo].Count - 1;
if (curMinSep == matrix[rowNo][col])
{
if (colCounts[rowNo] > col + 1) curIndex[rowNo] = col + 1;
if (results[rowNo].Count > 0 &&
results[rowNo][lastIdx].Text.Count < 1 &&
results[rowNo][lastIdx].ColSpan > 0)
{
results[rowNo][lastIdx].ColSpan++;
results[rowNo][lastIdx].Text = GetCellText(table, rowNo, col);
}
else
{
results[rowNo].Add(new Cell(0, 0, GetCellText(table, rowNo, col)));
}
}
else
{
if (results[rowNo].Count > 0 &&
results[rowNo][lastIdx].Text.Count < 1)
{
results[rowNo][lastIdx].ColSpan++;
}
else
{
results[rowNo].Add(new Cell(1, 0));
}
}
}
} while (curMinSep < sum);
return results;
}
public static short GetTableColumnRelativeSum(XTextTable rows)
{
XPropertySet xPropertySet = rows as XPropertySet;
short sum = (short)xPropertySet.getPropertyValue("TableColumnRelativeSum").Value;
return sum;
}
public static TableColumnSeparator[] GetTableRowSeperators(XTableRows rows, int rowNo)
{
XPropertySet rowProperties = rows.getByIndex(rowNo).Value as XPropertySet;
TableColumnSeparator[] sep = null;
sep = rowProperties.getPropertyValue("TableColumnSeparators").Value as TableColumnSeparator[];
return sep;
}
大流士嗨,湊巧我想在過去的兩天,沒有成功,同樣的事情。 我用不同的方法嘗試使用XTextTable.getCellNames和XTextTable.createCursorByCellName並用光標進行導航以找出單元格的鄰域。但由於表格內部光標導航的行爲非常奇怪(在我看來),我沒有成功。 在你的代碼中,你缺少GetTableColumnRelativeSum和GetTableRowSeperators方法,你是否也可以發佈這些方法。 – mvladic 2011-03-04 15:00:25
@mvladic - 添加的代碼所缺少的一部分...... – 2011-03-04 15:38:29
我不知道TableColumnSeparators是的TableRow財產,在文檔中我只發現屬性爲TextTable http://api.openoffice.org/docs/common/的一部分REF/COM /陽光/明星/文本/ TextTable.html#TableColumnSeparators – mvladic 2011-03-04 15:45:01