代码之家  ›  专栏  ›  技术社区  ›  Darius Kucinskas

OpenOffice遍历TextTable检测合并和拆分单元格(计算colspan和rowspan)

  •  1
  • Darius Kucinskas  · 技术社区  · 14 年前

    如果有什么建议我会很感激。。。我没有主意了:(

    1 回复  |  直到 14 年前
        1
  •  2
  •   Darius Kucinskas    13 年前

    最后我得到了答案(实际上是其中的一部分)。我知道这段代码很难看,但总有一天我会重构它;)

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