2010-07-09 22 views
5

Tôi đã sử dụng Spreadsheet::ParseExcel để liệt kê nội dung của bảng tính. Tôi đã xem một số ví dụ về cách đổ toàn bộ bảng tính. Tôi thực sự muốn xem cách sử dụng tập lệnh này một cách có chọn lọc hơn.Cần thêm ví dụ về cách sử dụng Bảng tính :: ParseExcel

Ví dụ bên dưới từ IBM về cơ bản đổ nội dung của tất cả các ô có dữ liệu.

#!/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); 
    } 
} 
} 

Ai đó có thể cho tôi ví dụ về cách tôi có thể chỉ định một số hành động cần thực hiện cho một cột nhất định cho mỗi hàng?

Ví dụ: tôi có bảng tính có 7 cột và n hàng. Tôi muốn định dạng lại dữ liệu trong từng cột theo một cách nhất định. Có lẽ tôi muốn lấy cột 6 cho mỗi hàng và nối thêm một số văn bản vào cuối chuỗi được lưu trữ trong ô. Làm thế nào mà sẽ được thiết lập?

Trả lời

8

Để sửa đổi tệp Excel, mô-đun Spreadsheet::ParseExcel::SaveParser rất hữu ích. Nó cho phép bạn đọc một tập tin, sửa đổi, và sau đó viết nội dung thay đổi vào một tập tin mới. Dưới đây là một ví dụ đơn giản:

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); 

Đối với nhiều ví dụ khác, hãy xem tài liệu xuất sắc:

+2

Tôi là người duy trì bảng tính :: ParseExcel và tôi nghĩ rằng đây là một ví dụ rõ ràng, hay. ++ – jmcnamara

+0

Wow, ví dụ tuyệt vời. Cảm ơn rất nhiều! Và cảm ơn tất cả những đóng góp của bạn và cho những công cụ tuyệt vời như vậy! –

+0

Tôi nhận được thông tin sau: Không thể gọi phương thức "giá trị" trên giá trị không xác định tại ./excel-test-new line 19. –

2

Để định dạng lại dữ liệu trong mỗi của các cột trong một cách nào đó, bạn có thể sử dụng sự kết hợp của Spreadsheet::ParseExcelSpreadsheet::WriteExcel module như

Tạo mới nổi trội bởi Spreadsheet::WriteExcel mô-đun và thêm bảng trong it.Then Phân tích các Excel hiện hành và viết nội dung vào excel mới với hình thành.

Dưới đây là một ví dụ mẫu:

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 
       } 
      } 
     } 

Sau khi viết một mới nổi trội từ excel hiện tại, bạn có thể sử dụng API của Spreadsheet::WriteExcel để nối thêm dữ liệu trong it.It sẽ giải quyết các vấn đề như

  1. Đầu tiên nó sẽ giữ lại tệp Excel hiện có của bạn.
  2. bạn có thể định dạng thành tệp excel mới mà không sửa đổi tệp Excel gốc.
+0

Bạn có biết cách chúng tôi có thể xử lý các ô hợp nhất tại đây không? – user1837967

Các vấn đề liên quan