2014-09-26 66 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";