2010-07-09 78 views
5

我一直在使用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列,並將一些文本附加到存儲在單元格中的字符串的末尾。那將如何建立?

回答

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

我是Spreadsheet :: ParseExcel的維護者,我認爲這是一個很好的例子。 ++ – jmcnamara 2010-07-10 10:43:36

+0

哇,很棒的例子。非常感謝!並感謝你的所有貢獻和這樣的真棒工具! – 2010-07-10 23:25:21

+0

我得到以下內容:無法在./excel-test-new第19行的未定義值上調用方法「值」。 – 2010-07-10 23:57:06

2

要重新格式化每列中的數據以某種方式,你可以使用Spreadsheet::ParseExcelSpreadsheet::WriteExcel模塊的組合像

創建一個新的Spreadsheet::WriteExcel模塊Excel,以及it.Then添加工作表解析現有的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追加數據it.It將解決像

  1. 問題之後首先它會保留你現有的Excel文件。
  2. 您可以在不修改原始Excel文件的情況下將文件格式化爲新的Excel文件。
+0

你知道我們如何在這裏處理合並單元格嗎? – user1837967 2013-10-17 02:58:22

相關問題