向垂直合并的单元格添加行c#

时间:2014-09-26 10:57:24

标签: c# merge ms-word cell

我正在处理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                       |
+----------------------------------------------+

任何变通办法都会受到赞赏!

4 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

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

首先,您必须决定是否需要固定文档(例如,您将以编程方式创建其整个DOM和内容)或流文档(例如,您将创建一个带有布局的模板,格式化数据的占位符,然后合并数据在运行时进入模板。)

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

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

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

Here is an example如何从模板创建报告以提供线索。

答案 2 :(得分:0)

我知道这是一个旧帖子,但我有一个非常类似的问题,就像这样在表格中添加行:

    SerialPortHandler spHandler;
    public void Init()
    {
        SerialPortHandler spHandler = new SerialPortHandler("COM1", IsReport, DequeueResponse);
        spHandler.OnReport += SpHandler_OnReport;
    }

    bool IsReport(byte[] data)
    {
        //Determines whether the command is Cmd_Reprot
        return true;
    }

    byte[] DequeueResponse(Queue<byte> quReceive)
    {
        byte[] response = null;
        //Dequeuing a valid response based protocol rules
        return response;
    }

    private void SpHandler_OnReport(byte[] data)
    {
        if (DataEqual(Cmd_Report, CMD_REPORT))
        {
            //do something X about data then save data
        }
    }

    public void DoWork()
    {
        //do something 
        byte[] Cmd_Req = null;
        byte[] Cmd_Res = new byte[CMD_RES.Length];
        int ret = spHandler.SendCommand(Cmd_Req, Cmd_Req, 1000);

        if (ret > 0 && DataEqual(Cmd_Res, CMD_RES))
        {
            //create data, do something A about data
        }
        else
        {
            //do something B
        }
    }

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

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

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

table.Rows[2]

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

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 :(得分:0)

您必须获取表的范围,然后获取超出此范围的单元格集合,最后使用item逐个单元格地进行操作。