Как изменить ширину столбцов таблицы Word с помощью Perl?

Используя Perl с модулем Win32::OLE, я пытаюсь вставить таблицу в документ Microsoft Word, а затем изменить ширину столбцов. Я могу вставить таблицу без каких-либо проблем, но изменение ширины столбцов оказывается более сложным. После создания макроса и попытки перевести VBA на Perl, вот что у меня есть:

my $word = Win32::OLE->new('Word.Application', sub {$_[0]->Quit;});
my $doc = $word->Documents->Open('myfile.doc');

### Code to find and select a tag to replace with a table goes here ###

my $table = $doc->Tables->Add($word->Selection->Range, 4, 4);
$table->Columns(1)->{PreferredWidthType} = wdPreferredWidthPoints;
$table->Columns(1)->{PreferredWidth} = 200;

К сожалению, это дает ошибку «Невозможно использовать неопределенное значение в качестве ссылки HASH» в последних двух строках. Я пробовал несколько других вариантов этого, но ни один из них не работал, и Google тоже не помог. Я был бы очень признателен за ответ о том, как это сделать.

Спасибо.


person epsilon_j    schedule 05.10.2015    source источник
comment
Я бы предложил использовать Data::Dumper для печати $table -> Columns(1), потому что эта ошибка подразумевает, что Columns(1) не определено.   -  person Sobrique    schedule 05.10.2015
comment
@Sobrique, предостережение: если вы используете Data::Dumper для объектов OLE, убедитесь, что вы установили $Data::Dumper::MaxDepth, особенно при работе с объектами приложений Microsoft, в которых обычно каждый отдельный объект указывает на объект приложения, который содержит все. Win32::OLE по умолчанию не создает уникальные объекты и просто использует вашу память, переделывая один и тот же объект приложения снова, и снова, и снова.   -  person Axeman    schedule 05.10.2015
comment
Вы также можете указать _Unique при загрузке модуля: search.cpan.org/~jdb/Win32-OLE-0.1712/lib/Win32/OLE.pm#_Unique   -  person Axeman    schedule 05.10.2015
comment
@Sobrique: Вы действительно правы в том, что он не определен, но, к сожалению, это не приближает меня к решению проблемы.   -  person epsilon_j    schedule 05.10.2015


Ответы (1)


После некоторых проб и ошибок я обнаружил, что это сделало работу:

$table->Rows(1)->Select;
$word->Selection->Columns(1)->{Width} = 200;

Достаточно было изменить размер только столбцов в строке 1, и это повлияло на все остальные строки. Легко, когда знаешь как!

person epsilon_j    schedule 07.10.2015