C# 将行添加到垂直合并的单元格c

C# 将行添加到垂直合并的单元格c,c#,merge,ms-word,cell,C#,Merge,Ms Word,Cell,我正在做一个WordAutomation项目,需要处理这个表。我正在使用VisualStudio2010和Word 2010 我得到了这张桌子: +----------------------------------------------+ | 1,1 | |----------------------------------------------| | | 2,2

我正在做一个WordAutomation项目,需要处理这个表。我正在使用VisualStudio2010和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                       |
+----------------------------------------------+

任何解决办法都将不胜感激

在使用InteropAPI进行类似的Word自动化项目时,我遇到了同样的问题。不幸的是,当存在合并行时,无法将行插入表中,因为无法引用该行

我假设您正在使用预先创建的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);

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

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

首先,您必须决定是要使用固定文档(例如,您将以编程方式创建其整个DOM和内容),还是要使用流文档(例如,您将使用布局、格式和占位符为数据创建模板),然后在运行时将数据合并到模板中

这两个选项都可以应用于您的案例中。模板文档更容易、更快速地准备。所以,若您可以在启用Docentric的模板中描述规则,那个么您就可以开始了。因为您可以使用逻辑语句使用条件内容,所以使用这种方法可能可以解决您的问题

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

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


如何从模板创建报告以提供线索

我知道这是一篇老文章,但我在向表中添加行时遇到了类似的问题,如下所示:

+----------------------------------------------+
|            |       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";

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

使用代码将表添加到文档中。所以我已经知道了这些合并功能。我的表格是从工厂添加的,然后将信息添加到单元格中并添加新行。所以我真正想要的是一种方法,用一个垂直合并的单元格添加行,而不必在之后合并它们。因此,我不必在表格出厂后进行任何表格格式化。一种方法是识别合并的单元格,拆分它们,执行操作,然后再次合并它们。但我也不确定这是否可行。这听起来是一个不错的工具包,但它不是我真正想要的。