将范围指向 table 单元格的末尾
Pointing a range at the end of a table cell
在 Perl CGI 中,使用 Win32::OLE,我需要在一个 table 单元格中插入几行文本,但一个接一个。
我使用的不同对象是:
- $go_document,Word文档
- $lo_table,这个词table
- $li_row和$li_col,table[中的单元格坐标=43=]
- @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) 命令没有将范围设置到目标单元格的末尾,而是设置到下一个单元格的开头。
有谁知道如何解决这个问题?
提前致谢。
您走在正确的轨道上。
在 wdCollapseEnd
之后立即尝试将范围向后移动一个字符:
$lo_range->MoveEnd(wdCharacter, -1)
"why" 有点神秘,我不确定我想象的原因是否正确...我认为原因是折叠范围将焦点放在下一个单元格的开始。可以把它想象成整个单元格都被选中,然后按向右箭头移动到下一个单元格,而不是所选单元格中文本的末尾。所以有必要向后移动一个字符(如按向左箭头)以到达原始单元格的末尾。
Range
有 MoveEnd
和 MoveStart
。使用带有 MoveStart
的正数或带有 MoveEnd
的负数将有效地移动整个 Range
,而不包括其他内容。 MoveStart
的负值或 MoveEnd
的正值将扩展 Range
以包含新内容。同样,将其想象成使用箭头键,但这次按住 Shift
以扩展选择。有多种参数(WdUnits
枚举)可以与这些方法一起使用,这些方法适用于单元格、段落等对象。可以在 Word 语言参考中找到该列表。
在 Perl CGI 中,使用 Win32::OLE,我需要在一个 table 单元格中插入几行文本,但一个接一个。
我使用的不同对象是:
- $go_document,Word文档
- $lo_table,这个词table
- $li_row和$li_col,table[中的单元格坐标=43=]
- @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) 命令没有将范围设置到目标单元格的末尾,而是设置到下一个单元格的开头。
有谁知道如何解决这个问题? 提前致谢。
您走在正确的轨道上。
在 wdCollapseEnd
之后立即尝试将范围向后移动一个字符:
$lo_range->MoveEnd(wdCharacter, -1)
"why" 有点神秘,我不确定我想象的原因是否正确...我认为原因是折叠范围将焦点放在下一个单元格的开始。可以把它想象成整个单元格都被选中,然后按向右箭头移动到下一个单元格,而不是所选单元格中文本的末尾。所以有必要向后移动一个字符(如按向左箭头)以到达原始单元格的末尾。
Range
有 MoveEnd
和 MoveStart
。使用带有 MoveStart
的正数或带有 MoveEnd
的负数将有效地移动整个 Range
,而不包括其他内容。 MoveStart
的负值或 MoveEnd
的正值将扩展 Range
以包含新内容。同样,将其想象成使用箭头键,但这次按住 Shift
以扩展选择。有多种参数(WdUnits
枚举)可以与这些方法一起使用,这些方法适用于单元格、段落等对象。可以在 Word 语言参考中找到该列表。