2014-09-26 43 views
0

我正在开发一个WordAutomation项目并需要处理此表。我使用Visual Studio 2010和Word 2010将一行添加到垂直合并的单元格c#

我得到这个表:

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

任何变通办法,将不胜感激!

回答

0

使用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); 

缺点你正在引用行和列索引。因此,对原始模板的任何更改都需要反映在代码中。

+0

该表使用代码添加到文档中。所以我已经意识到这些合并功能。我的表格是从工厂添加的,然后将信息添加到单元格中并添加新行。所以我真正想要的是一种用垂直合并的单元格添加行而不用合并它们的方法。所以在我的工厂出来之后,我不必做任何表格格式化。 – 2015-03-11 11:40:26

+0

一种方法是识别合并的单元格,拆分它们,执行操作,然后再次合并它们。但我不确定这也是可能的。 http://stackoverflow.com/questions/4269545/determine-if-a-word-cell-is-merged – 2015-03-11 23:24:18

0

我建议你看看第三方工具包。这将为您节省大量时间(和金钱)。我知道Docentric,所以我会告诉你如何解决你的问题。首先,您必须决定是否需要一个固定的文档(例如,您将以编程方式创建其整个DOM和内容)或流程文档(例如,您将创建一个包含布局,格式和占位符的模板,然后合并数据在运行时输入模板)。

这两个选项都可以应用在你的案例中。准备模板文件更容易,速度更快。所以,如果你可以在支持Docen的模板中描述规则,那么你很好。因为你可以使用逻辑语句来使用条件内容,所以你可以用这种方法解决你的问题。

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

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

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

+0

这听起来像一个很好的工具包,但它不是我真正想要的。 – 2015-03-24 09:21:49

0

我知道这是一个老的文章,但我有一个非常类似的问题,添加行到表像这样:

+----------------------------------------------+ 
|   |  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"; 
相关问题