将范围指向表格单元格的末尾

时间:2018-12-06 15:48:22

标签: perl ms-word win32ole word-table

在使用Win32 :: OLE的Perl CGI中,我需要在表单元格中插入几行文本,但要一一插入。

我使用的不同对象是:

  • $ go_document ,Word文档
  • $ lo_table ,Word表
  • $ li_row $ li_col ,表格中的单元格坐标
  • @ly_lines ,文本数组

这是我的代码,可以正常工作:

for (my $ii = 0; $ii <= $#ly_lines; $i++)
{
    my $lo_range = $lo_table->Cell($li_row, $li_col)->Range;
    $lo_range->InsertAfter($ly_lines[$ii]);

    $lo_range = $lo_table->Cell($li_row, $li_col)->Range;
    $lo_range->InsertParagraphAfter();
}

当我尝试将样式应用于每个文本行时,就会发生我的问题。

由于我不想设置整个单元格的样式,但不想设置要插入的行的样式,因此我尝试了一下(样式存储在 @ly_styles 数组中):

for (my $ii = 0; $ii <= $#ly_lines; $i++)
{
    my $lo_range = $lo_table->Cell($li_row, $li_col)->Range;
    $lo_range->Collapse(wdCollapseEnd);

    $go_document->Styles->Add($ly_styles[$ii]);
    $lo_range->{'Style'} = $ly_styles;
    $lo_range->InsertAfter($ly_lines[$ii]);

    $lo_range = $lo_table->Cell($li_row, $li_col)->Range;
    $lo_range->Collapse(wdCollapseEnd);

    $lo_range->InsertParagraphAfter();
}

在此循环中,文本行以相反的顺序显示在上,并在我想要的文本旁边的单元格中显示

Collapse(wdCollapseEnd)命令似乎没有将范围设置为目标单元格的末尾,而是设置为下一个单元格的开始。

有人知道如何解决此问题吗? 预先感谢。

1 个答案:

答案 0 :(得分:0)

您在正确的轨道上。

wdCollapseEnd之后立即尝试将范围向后移动一个字符:

$lo_range->MoveEnd(wdCharacter, -1)

“为什么”有点不可思议,我不确定我想象的原因是否正确...我认为原因是折叠范围使焦点放在下一个起点细胞。就像选择整个单元格一样,然后按向右箭头将其移至下一个单元格,而不是选择的单元格中文本的末尾。因此,必须向后移动一个字符(例如按向左箭头)才能到达原始单元格的末尾。

Range具有MoveEndMoveStart。对MoveStart使用正数或对MoveEnd使用负数将有效地移动整个Range,而不会包括其他内容。 MoveStart的负值或MoveEnd的正值将扩展Range以包括新内容。同样,可以将其想像为使用箭头键,但是这次按住Shift可以扩展选择范围。这些方法可以使用各种参数(WdUnits枚举)来处理诸如单元格,段落等对象。这些列表可以在《 Word语言参考》中找到。