簡體   English   中英

如何在perl中逐行讀取.xlsm文件

[英]how to read .xlsm file line by line in perl

這段代碼從.xlsm文件中讀取數據。此代碼像cell(0,0)一樣逐個單元格地讀取數據,依此類推,我無法讀取整行的數據。我想讀取.xlsm文件行按行,也僅按指定的工作表,而不是全部。

#!/usr/bin/env perl
use strict;
use warnings;
use Spreadsheet::Reader::ExcelXML qw( :just_the_data);

my $workbook  = Spreadsheet::Reader::ExcelXML->new( file => 'filename.xlsm' 
);

if ( !$workbook->file_opened ) {
     die $workbook->error(), "\n";
 }

for my $worksheet ( $workbook->worksheets) {

    print "Reading worksheet named: " . $worksheet->get_name . "\n";

    while( 1 ){
            my $cell = $worksheet->get_next_value;

            print "Cell is: $cell\n";
            last if $cell eq 'EOF';
     }
 }

輸出:

    # SYNOPSIS Screen Output
    # 01: Row, Col    = (0, 0)
    # 02: Value       = Category
    # 03: Unformatted = Category
    # 04:
    # 05: Row, Col    = (0, 1)
    # 06: Value       = Total
    # 07: Unformatted = Total
    # 08:
    # 09: Row, Col    = (0, 2)
    # 10: Value       = Date
    # 11: Unformatted = Date
    # 12:
    # 13: Row, Col    = (1, 0)
    # 14: Value       = Red
    # 16: Unformatted = Red
    # 17:
    # 18: Row, Col    = (1, 1)
    # 19: Value       = 5
    # 20: Unformatted = 5
    # 21:
    # 22: Row, Col    = (1, 2)
    # 23: Value       = 2017-2-14 #(shows as 2/14/2017 in the sheet)
    # 24: Unformatted = 41318
    # 25:
    # More intermediate rows ...
    # 82:
    # 83: Row, Col    = (6, 2)
    # 84: Value       = 2016-2-6 #(shows as 2/6/2016 in the sheet)
    # 85: Unformatted = 40944

根據文檔,您可以在工作簿級別使用fetchrow_arrayreffetchrow_array方法獲得完整的行。

fetchrow_arrayref( $row )

定義:為了向DBI致敬,我包括了此函數以返回所請求的$ row中單元格或值的數組ref。 如果未請求任何行,則返回“下一個”行。 在數組ref中,任何空白單元格都將顯示為“ undef”。

接受:undef = next | $ row =指示所需行的行整數請參閱Spreadsheet :: Reader :: ExcelXML中的屬性“ count_from_zero”以了解為$ row返回的行。

返回:該行中所有可能列位置的數組引用,並按照Spreadsheet :: Reader :: ExcelXML中的屬性“ group_return_type”填充數據。

請注意,此模塊對行是什么有自己的定義,您可以在導入時進行更改。

若要加載特定的工作表,請在worksheet簿對象上使用worksheet方法。 您需要事先知道工作表的名稱,或者可以使用get_sheet_names獲得所有名稱。

worksheet( $name )

定義:此方法將返回一個對象,以讀取標識的工作表中的值。 如果沒有值傳遞給$ name,則返回物理順序的“下一個”工作表。 “下一個”不會包裝它也只會遍歷工作簿中的“工作表”(而不是“圖表”)。

接受:$ name字符串,表示要打開的工作表對象的名稱。 該名稱是在Excel中打開電子表格時在選項卡上可見的單詞。 (不是基礎的zip成員文件名-可以不同。它不接受圖表選項卡的名稱。)

返回:一個能夠讀取該名稱的工作表的工作表對象。 如果請求“圖表表”,它將返回undef並設置錯誤屬性。 或者在“下一個”模式下,如果經過最后一張紙,則返回undef。

示例:使用隱含的“下一個”工作表;

這是一個未經測試的快速示例,它將打開一個特定的工作表,逐行獲取數據並轉儲結果。

use strict;
use warnings;
use Spreadsheet::Reader::ExcelXML qw( :just_the_data);
use Data::Dumper;

my $workbook  = Spreadsheet::Reader::ExcelXML->new( 
    file => 'filename.xlsm' );

my $worksheet = $workbook->worksheet('foo');

while (my $row = $worksheet->fetchrow_array_ref) {
    print Dumper $row;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM