Perl - электронная таблица :: Объяснение функции WriteExcel - PullRequest
3 голосов
/ 17 октября 2011

Я хотел бы использовать функцию "autofit_columns", как показано здесь: CPAN

Вот моя программа (я пропустил часть соединения с БД и запроса)

my $workbook = Spreadsheet::WriteExcel->new("TEST.xls");

my $bold = $workbook->add_format();
$bold->set_bold();
my $number = $workbook->add_format();
$number->set_num_format(0x01);
$worksheet = $workbook->add_worksheet('Sheet1');

my @headings = ('Blabla...');

foreach $i (@headings){
$worksheet->write(0, $col++, $i, $bold);
};

$col=0;
$lrow=1;
while (@row = $sth->fetchrow_array()) {
        $worksheet->write($lrow,$col,\@row);
        $lrow++;

};
$sth->finish;
$dbh->disconnect;

autofit_columns($worksheet);
$workbook->close();

sub autofit_columns {

        my $worksheet = shift;
        my $col       = 0;

        for my $width (@{$worksheet->{__col_widths}}) {

            $worksheet->set_column($col, $col, $width) if $width;
            $col++;
        }
    }

ПРОБЛЕМА: Мои столбцы не вписываются в файл xls ... Есть идеи, почему?

Я не понимаю кусок кода:

for my $width (@{$worksheet->{__col_widths}}) {

                $worksheet->set_column($col, $col, $width) if $width;
                $col++;
            } 

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Вам не хватает той части кода примера, которая добавляет функцию обратного вызова:

$worksheet->add_write_handler(qr[\w], \&store_string_widths);

Вам также не хватает функции store_string_widths().

Что касается вашего второго вопроса, обратный вызов хранит максимальную длину строки, используемую для каждого столбца. Фрагмент кода использует эти длины, чтобы установить ширину столбца для каждого столбца от первого до последнего столбца, в котором хранится длина. Если столбец не имеет ширины автоматической подгонки, его ширина не корректируется.

Это все немного странно в Spreadsheet :: WriteExcel. Он будет более интегрирован в модуль в Excel :: Writer :: XLSX, который заменяет WriteExcel.

2 голосов
/ 17 октября 2011

Вам нужно еще раз взглянуть на этот пример и реализовать часть add_write_handler, прежде чем что-либо записывать в свой лист.

Пожалуйста, посмотрите на

$worksheet->add_write_handler(qr[\w], \&store_string_widths);

строка и затем store_string_widths реализация подпрограммы.

Ответ заключается в том, что вам нужно хранить абсолютную ширину строки при каждой записи. Затем, после того как вы записали все данные на свой рабочий лист, вам нужно пройтись по строкам и найти наибольшую длину строки для каждого столбца - это будет желаемая ширина столбца.

Желаю удачи.

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