Почему я не могу добавить диаграмму в свою электронную таблицу Excel с помощью электронной таблицы Perl :: WriteExcel - PullRequest
1 голос
/ 23 февраля 2010

При создании диаграммы в электронной таблице с использованием Spreadsheet :: WriteExcel создаваемый файл продолжает выдавать сообщение об ошибке

Excel обнаружил нечитаемый контент в "Report.xls"

и спрашивает меня, хочу ли я его восстановить. Я понял, что проблемная строка в коде - то, где я фактически вставляю диаграмму, с

$chartworksheet->insert_chart(0, 0, $linegraph, 10, 10);

Если я закомментирую эту строку, с данными все в порядке (но, конечно, диаграммы нет). Остальная часть соответствующего кода выглядит следующим образом (любые переменные, не определенные здесь, определены ранее в коде, например $lastrow).

printf("Creating\n");
my $chartworksheet = $workbook->add_worksheet('Graph');
my $linegraph = $workbook->add_chart(type => 'line', embedded => 1);
$linegraph->add_series(values => '=Data!$D$2:$D$lastrow', name => 'Column1');
$linegraph->add_series(values => '=Data!$E$2:$E$lastrow', name => 'Column2');
$linegraph->add_series(values => '=Data!$G$2:$G$lastrow', name => 'Column3');
$linegraph->add_series(values => '=Data!$H$2:$H$lastrow', name => 'Column4');
$linegraph->set_x_axis(name => 'x-axis');
$linegraph->set_y_axis(name => 'y-axis');
$linegraph->set_title(name => 'title');
$linegraph->set_legend(position => 'bottom');
$chartworksheet->activate();
$chartworksheet->insert_chart(0, 0, $linegraph, 10, 10);
printf("Finished\n");

Я в полной растерянности и не могу найти никаких ответов. Помогите пожалуйста!

Ответы [ 2 ]

4 голосов
/ 23 февраля 2010

Глядя на выражение:

'=Data!$D$2:$D$lastrow'

Является ли $lastrow некоторым соглашением в Spreadsheet::WriteExcel или это переменная из вашего скрипта, которая должна быть интерполирована в строковое выражение? Если это ваш var, то этот код, вероятно, не будет делать то, что вы хотите внутри одинарных кавычек, и вы можете захотеть использовать что-то вроде

'=Data!$D$2:$D' . $lastrow
"=Data!\$D\$2:\$D:$lastrow"
sprintf('=Data!$D2:$D%d',$lastrow)
1 голос
/ 24 февраля 2010

Проблема, как правильно указывает mobrule, заключается в том, что вы используете одинарные кавычки в строке серии, а $lastrow не интерполируется.

Вы можете полностью избежать подобных проблем при программном создании строк серии диаграмм с помощью служебной функции xl_range_formula().

$chart->add_series(
    categories    => xl_range_formula( 'Sheet1', 1, 9, 0, 0 ),
    values        => xl_range_formula( 'Sheet1', 1, 9, 1, 1 ),
);

# Which is the same as:
$chart->add_series(
    categories    => '=Sheet1!$A$2:$A$10',
    values        => '=Sheet1!$B$2:$B$10',
);

Подробнее см. В следующем разделе документации WriteExcel: Работа с диапазонами ячеек .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...