我正在处理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 |
+----------------------------------------------+
任何变通办法都会受到赞赏!
答案 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逐个单元格地进行操作。