【问题标题】:Adding a row to a vertically merged cell c#向垂直合并的单元格添加一行c#
【发布时间】:2014-11-21 08:52:02
【问题描述】:

我正在处理一个 WordAutomation 项目,需要处理这个表。我正在使用 Visual Studio 2010 和 Word 2010。

我得到了这张桌子:

+----------------------------------------------+
|                    1,1                       |
|----------------------------------------------|
|            |       2,2       |      2,3      |
|     2,1    |-----------------|---------------|
|            |       3,2       |      3,3      |
|----------------------------------------------|
|                    4,1                       |
+----------------------------------------------+

我想在合并的单元格中添加一行。我正在使用这个功能:

table.Rows.Add(table.Rows[2]);

当单元格未垂直合并时,该功能可以正常工作。但是在垂直合并单元格上执行时会引发此错误:

"Cannot access individual rows in this collection because the table has vertically merged cells."

我想要这个输出:

+----------------------------------------------+
|                    1,1                       |
|----------------------------------------------|
|            |       2,2       |      2,3      |
|     2,1    |-----------------|---------------|
|            |       3,2       |      3,3      |
|            |-----------------|---------------|
|            |       4,2       |      4,3      |
|----------------------------------------------|
|                    5,1                       |
+----------------------------------------------+

任何解决方法将不胜感激!

【问题讨论】:

    标签: c# merge ms-word cell


    【解决方案1】:

    在使用 Interop API 处理类似的 Word Automation 项目时,我遇到了同样的问题。不幸的是,当存在合并的行时,您无法在表中插入行,因为您无法引用该行。

    我假设您正在使用预先创建并用作模板的 word 文档。

    我能想到的唯一解决方法是将所有垂直合并的单元格拆分回正常状态。在您的情况下,您现在将 2,1 -> 4,1 作为有效单元格,您可以调用

    table.Rows.Add(table.Rows[2]);
    

    您可以在添加行后使用合并单元格;

    document.Tables[1].Cell(2,1).Merge(document.Tables[1].Cells(4,1));
    

    下面的代码将在表格第 4 行之前添加一个或多个未知数行,然后将左侧的单元格合并到原始第 4 行。

    int addedRows = 0;
    
    foreach (string text_for_cell in listOfString) 
    {
       // add a new row and set the contents of the cell 
       var new_row = document.Rows.Add(table[1].Rows[4 + addedRows]);
       new_row.Cell[2].Range.FormattedText.Text = text_for_cell;
    
       addedRows++;
    
    }
    
    document.Tables[1].Cells(2,1).Merge(document.Tables[1].Cells(3 + addedRows, 1);
    

    这样做的缺点是您要引用行和列索引。因此,对原始模板的任何更改也需要反映在代码中。

    【讨论】:

    • 使用代码将表格添加到文档中。所以我已经知道这些合并功能。我的表格是从工厂添加的,然后将信息添加到单元格中并添加新行。所以我真正想要的是一种在垂直合并的单元格中添加行而不在之后合并它们的方法。所以我在出厂后不需要做任何表格格式化。
    • 一种方法是识别合并的单元格,拆分它们,执行您的操作,然后再次合并它们。但我也不确定这是否可行。 stackoverflow.com/questions/4269545/…
    【解决方案2】:

    我建议您查看 3rd 方工具包。这最终将为您节省大量时间(和金钱)。我知道 Docentric,所以我会告诉您它如何解决您的问题。

    首先,您必须决定是想要一个固定文档(例如,您将通过编程方式创建其整个 DOM 和内容)还是一个流文档(例如,您将创建一个包含数据布局、格式和占位符的模板,然后合并在运行时将数据导入模板)。

    这两个选项都可以应用于您的情况。模板文档的准备更加容易和快捷。因此,如果您可以在启用 Docentric 的模板中描述规则,那么您就可以开始了。因为您可以使用逻辑语句来使用条件内容,所以您可以通过这种方法解决您的问题。

    但如果没有,您仍然可以使用 Docentric 的 DOM 类从头开始创建文档。

    在这两种情况下,您都可以选择 .docx、.pdf 或 .xps 输出。由于报表生成是基于 OpenXML 的,因此无需安装 Word,并且可以非常有效地在服务器上使用。

    Here is an example如何从模板创建报告给你一个线索。

    【讨论】:

    • 这听起来像是一个不错的工具包,但它并不是我真正想要的。
    【解决方案3】:

    我知道这是一篇旧帖子,但我遇到了一个非常相似的问题,向这样的表添加行:

    +----------------------------------------------+
    |            |       1,2       |      1,3      |
    |     1,1    |-----------------|---------------|
    |            |       2,2       |      2,3      |
    |----------------------------------------------|
    |     3,1    |       3,2       |      3,3      |
    +----------------------------------------------+
    

    问题是您不能直接访问表行,它会引发您提到的错误。此代码不起作用:

    table.Rows[2]
    

    但您仍然可以添加行和访问单元格,例如在我的情况下添加新行 (4) 并填充我使用的单元格:

    int count = table.Range.Cells.Count;
    table.Rows.Add();
    table.Range.Cells[count + 1].Range.Text = "4,1 value";
    table.Range.Cells[count + 2].Range.Text = "4,2 value";
    table.Range.Cells[count + 3].Range.Text = "4,3 value";
    

    因此,在您的示例中,解决方案是添加一个引用单元格 3.3 的新行。我没有测试过这段代码,但它应该是要走的路:

    table.Rows.Add(table.Range.Cells[6]);
    table.Range.Cells[7].Range.Text = "4,2 value";
    table.Range.Cells[8].Range.Text = "4,3 value";
    

    【讨论】:

      【解决方案4】:

      您必须获取表格的范围,然后获取该范围之外的单元格集合,最后使用 item 逐个单元格地进行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多