2010-07-09 3 views
5

Я использовал Spreadsheet::ParseExcel для отображения содержимого электронной таблицы. Я видел несколько примеров того, как сбрасывать всю электронную таблицу. Я действительно хотел бы видеть, как использовать этот скрипт более выборочно.Нужно больше примеров использования таблицы: 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 для каждой строки и добавить текст в конец строки, хранящейся в ячейке. Как это будет создано?

ответ

8

Чтобы изменить файл 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); 

Для многих других примеров, см отличной документации:

+2

Я являюсь хранителем таблицы :: ParseExcel, и я думаю, что это хороший, ясный пример. ++ – jmcnamara

+0

Ничего себе, фантастический пример. Огромное спасибо! И спасибо всем вашим вкладам и за такие замечательные инструменты! –

+0

Я получил следующее: Не могу вызывать метод «значение» по неопределенному значению в ./excel-test-new строке 19. –

2

переформатировать данные в каждом из столбцов определенным образом, вы можете использовать комбинацию Spreadsheet::ParseExcel и Spreadsheet::WriteExcel модулей как

Создать новую первенствует по Spreadsheet::WriteExcel модуля и добавить таблицу в it.Then Разбираем существующий 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 
       } 
      } 
     } 

После записи нового отличиться от существующего первенствует, вы можете использовать API, из Spreadsheet::WriteExcel для добавления данных в it.It будет решать проблемы, как

  1. Сначала он сохранит существующий файл Excel.
  2. вы можете сделать форматирование в новый файл excel без изменения исходного файла Excel.
+0

Вы знаете, как мы можем обрабатывать ячейки слияния здесь? – user1837967