2010-03-31 65 views

回答

2

最後,我找到了答案(它實際上是合併單元格的一部分)。這段代碼是醜陋的,我知道,但有一天我會重構它;)

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; 
    } 
+0

大流士嗨,湊巧我想在過去的兩天,沒有成功,同樣的事情。 我用不同的方法嘗試使用XTextTable.getCellNames和XTextTable.createCursorByCellName並用光標進行導航以找出單元格的鄰域。但由於表格內部光標導航的行爲非常奇怪(在我看來),我沒有成功。 在你的代碼中,你缺少GetTableColumnRelativeSum和GetTableRowSeperators方法,你是否也可以發佈這些方法。 – mvladic 2011-03-04 15:00:25

+0

@mvladic - 添加的代碼所缺少的一部分...... – 2011-03-04 15:38:29

+0

我不知道TableColumnSeparators是的TableRow財產,在文檔中我只發現屬性爲TextTable http://api.openoffice.org/docs/common/的一部分REF/COM /陽光/明星/文本/ TextTable.html#TableColumnSeparators – mvladic 2011-03-04 15:45:01