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

发布于 2024-08-26 22:42:32 字数 179 浏览 13 评论 0原文

我正在使用 OpenOffice uno api 迭代编写器文档中的所有文本。目前,为了迭代文本表,我正在使用 XTextTable 接口 getCellNames() 方法。我如何检测合并和拆分的单元格。我想将表导出为 html,所以我应该计算 colspan 和 rowspan。

我将不胜感激任何建议...我没有主意了:(

I am using OpenOffice uno api to iterate through all text in writer document. To iterate over text tables currently I am using XTextTable interface getCellNames() method. How I could detect merged and split cells. I want to export table to html, so I should calculate colspan and rowspan.

I would appreciate any suggestions... I am out of ideas :(

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫烠⑼条掵仅有一顆心 2024-09-02 22:42:32

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

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

Finally I have the answer (actually colspan part of it). This code is ugly I know, but one day I'll refactor it ;)

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

and here it is table parse method

    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;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文