Как использовать Excel :: Writer :: XLSX для создания таблицы, в которой вставка строки копирует формулу столбца? - PullRequest
0 голосов
/ 12 декабря 2018

Итак, в Excel я могу вручную создать и создать следующее (у меня отображается формула в столбце C):

enter image description here

Затем я могу выбрать от A: 1 до C3, выбрать «Вставка» -> «Таблица» и нажать «ОК» в диалоговом окне «Создать таблицу», чтобы превратить мои данные в таблицу, сняв флажок «Кнопка фильтра»:

enter image description here

Затем, когда я щелкаю правой кнопкой мыши строку 3 и выбираю Вставить, я получаю новую строку 3 с правильно скопированной формулой столбца С.

enter image description here

Моя проблема в том, что я не могу сгенерировать файл Excel с Perl, используя Excel :: Writer :: XLSX, который может создать таблицу, в которой вставка строки приведет к копированию формулы.В итоге он становится пустым, например:

enter image description here

Ниже приведен мой код.Любые идеи будут высоко ценится.

#!/usr/bin/env perl

use strict;
use warnings;

use Excel::Writer::XLSX;

my $filePath = shift;
my $workbook = Excel::Writer::XLSX->new( $filePath );
my $worksheet = $workbook->add_worksheet( 'Metadata' );

my @data = ( [1,2,"=SUM(A2:B2)"], [3,4,"=SUM(A3:B3)"], [5,6,"=SUM(A4:B4)"] );

my $rowCount = (scalar @data) + 1;

$worksheet->add_table( 
    "A1:C$rowCount", 
    {
        data => \@data,
        name => 'Table1',
        style => 'Table Style Medium 2',
        autofilter => 0,
        header_row => 1,
        columns => [
            { header => 'Value 1' },
            { header => 'Value 2' },
            { header => 'Sum' },
        ]
    }
);

$workbook->close();

1 Ответ

0 голосов
/ 13 декабря 2018

Таблицы Excel так мало используются ... приятно видеть кого-то с благодарностью за то, что он может предложить, и слава автору модуля за добавление поддержки таблиц.

Несколько вещей ...если вам нужна формула на основе таблицы, объявите ее в свойстве формулы столбца таблицы.Это приведет к тому, что оно будет скопировано в любые новые созданные строки.

{ header => 'Title', formula => '=1+2' }

Во-вторых, может быть способ сделать это с помощью синтаксиса R1C1 (Excel поддерживает его, но я не знаю, еслиExcel :: Writer :: XLSX), но я нахожу, что когда вы ссылаетесь на другие столбцы в таблице, проще всего это сделать на основе столбца таблицы, а не ссылки на ячейку - это одно из больших преимуществ таблиц Excel по сравнению сстандартные диапазоны.

formula => '=[@[Header A]]*[@[Header B]]'

Затрагиваемый код должен выглядеть следующим образом:

my @data = ( [1,2], [3,4], [5,6] );

my $rowCount = (scalar @data) + 1;

$worksheet->add_table(
    "A1:C$rowCount",
    {
        data => \@data,
        name => 'Table1',
        style => 'Table Style Medium 2',
        autofilter => 0,
        header_row => 1,
        columns => [
            { header => 'Value 1' },
            { header => 'Value 2' },
            { header => 'Sum',
              formula => '=SUM([@[Value 1]]:[@[Value 2]])'
            },
        ]
    }
);

Когда вы откроете электронную таблицу и добавите строку, я думаю, вы получите желаемое поведение.

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