Имате нужда от повече примери за това как да използвате Spreadsheet::ParseExcel

Използвам Spreadsheet::ParseExcel за изброяване на съдържанието на електронната таблица. Виждал съм няколко примера как да изхвърлите цялата електронна таблица. Наистина бих искал да видя как да използвам този скрипт по-селективно.

Примерът по-долу от IBM основно изхвърля съдържанието на всички клетки, които имат данни.

#!/usr/bin/perl -w

use strict;
use Spreadsheet::ParseExcel;

my $oExcel = new Spreadsheet::ParseExcel;

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;

my $oBook = $oExcel->Parse($ARGV[0]);
my($iR, $iC, $oWkS, $oWkC);
print "FILE  :", $oBook->{File} , "\n";
print "COUNT :", $oBook->{SheetCount} , "\n";

print "AUTHOR:", $oBook->{Author} , "\n"
 if defined $oBook->{Author};

for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++)
{
 $oWkS = $oBook->{Worksheet}[$iSheet];
 print "--------- SHEET:", $oWkS->{Name}, "\n";
 for(my $iR = $oWkS->{MinRow} ;
     defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;
     $iR++)
 {
  for(my $iC = $oWkS->{MinCol} ;
      defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;
      $iC++)
  {
   $oWkC = $oWkS->{Cells}[$iR][$iC];
   print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
  }
 }
}

Може ли някой да ми даде пример за това как мога да посоча някакво действие, което да предприема за определена колона за всеки ред?

Например, имам електронна таблица със 7 колони и n реда. Искам да преформатирам данните във всяка от колоните по определен начин. Може би искам да взема колона 6 за всеки ред и да добавя някакъв текст в края на низа, съхранен в клетката. Как ще бъде настроено това?


person XL.    schedule 09.07.2010    source източник


Отговори (2)


За да промените Excel файл, Spreadsheet::ParseExcel::SaveParser модулът е много полезен. Тя ви позволява да прочетете файл, да направите модификации и след това да запишете промененото съдържание в нов файл. Ето един прост пример:

use strict;
use warnings;

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;

my $excel_file_name = $ARGV[0];
my $parser          = Spreadsheet::ParseExcel::SaveParser->new();
my $workbook_orig   = $parser->Parse($excel_file_name);

# We will edit column 7 of the first worksheet.
my $worksheet = $workbook_orig->worksheet(0);
my $EDIT_COL = 6;

my ($row_min, $row_max) = $worksheet->row_range();
for my $r ($row_min .. $row_max){
    my $cell = $worksheet->get_cell($r, $EDIT_COL);
    unless (defined $cell){
        next; # Modify as needed to handle blank cells.
    }
    my $val = $cell->value . '_append_text';
    $worksheet->AddCell( $r, $EDIT_COL, $val, $cell->{FormatNo} );
}

# You can save the modifications to the same file, but when
# you are learning, it's safer to write to a different file.
$excel_file_name =~ s/\.xls$/_new.xls/;
$workbook_orig->SaveAs($excel_file_name);

За много други примери вижте отличната документация:

person FMc    schedule 10.07.2010
comment
Аз съм поддържащият Spreadsheet::ParseExcel и мисля, че това е хубав, ясен пример. ++ - person jmcnamara; 10.07.2010
comment
Уау, фантастичен пример. Много благодаря! И благодаря на всички ваши приноси и за такива страхотни инструменти! - person XL.; 11.07.2010
comment
Получих следното: Не мога да извикам стойност на метод на недефинирана стойност в ./excel-test-нов ред 19. - person XL.; 11.07.2010
comment
@XL След като получите $cell от метода get_cell, често трябва да проверявате дали е дефиниран. Ако не, това означава, че клетката в електронната таблица е била празна. Редактирах отговора си, за да илюстрирам идеята. - person FMc; 11.07.2010

За да преформатирате данните във всяка от колоните по определен начин, можете да използвате комбинацията от модули Spreadsheet::ParseExcel и Spreadsheet::WriteExcel като

Създайте нов модул excel от Spreadsheet::WriteExcel и добавете работен лист в него. След това анализирайте съществуващия Excel и запишете съдържанието в нов excel с форматиране.

Ето примерен пример:

use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;

my $oBook = $oExcel->Parse($ARGV[0]);
my($iR, $iC, $oWkS, $oWkC);
my $workbook  = Spreadsheet::WriteExcel->new('/root/Desktop/test_simple.xls');
my $worksheet = $workbook->add_worksheet();
$worksheet->set_column('A:A', 50);
my $format = $workbook->add_format();
            $format->set_size(10);
            $format->set_bold();
            $format->set_color('black');
            $format->set_font('Verdana');
            $format->set_text_wrap();
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++)
        {
                    $oWkS = $oBook->{Worksheet}[$iSheet];
            for(my $iR = $oWkS->{MinRow} ;defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;$iR++)
            {
                for(my $iC = $oWkS->{MinCol} ;defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;$iC++)
                {
                   $oWkC = $oWkS->{Cells}[$iR][$iC];
                   $worksheet->write($iR , $iC,  $oWkC->Value, $format) if($oWkC); #writing a new excel from existing excel
                }
            }
        }

След като напишете нов excel от съществуващия excel, можете да използвате API на Spreadsheet::WriteExcel, за да добавите данни в него. Това ще реши проблеми като

  1. Първо ще запази съществуващия ви Excel файл.
  2. можете да направите форматиране в нов файл на Excel, без да променяте оригиналния файл на Excel.
person Nikhil Jain    schedule 10.07.2010
comment
Знаете ли как можем да се справим с обединените клетки тук? - person user1837967; 17.10.2013