2017-12-14 33 views
0

このコードは、.xlsmファイルからデータを読み込みます。このデータは、セル(0,0)のようなセルごとに読み込まれます。行全体のデータを読み込みます。行ごとに.xlsmファイルを読み込み、すべてではなく指定されたワークシートのみを読み込みます。perlの行ごとに.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 
+1

"行"にさまざまなデータ型の潜在的に多くのセルが含まれている場合、シートを1行ずつ読み込むことは何を意味しますか?あなたは「ライン」のために正確に何を受け取りたいですか? –

+0

各行のデータを一度に – Anand

+1

なぜそれをしたいですか?あなたはそれがより速くなると思いますか?少ないコード?より読みやすい? – simbabque

答えて

2

文書によると、あなたは完全な行を取得するためにworkbook levelfetchrow_arrayreffetchrow_arrayメソッドを使用することができます。

fetchrow_arrayref($row)

定義:DBIに敬意でIが要求$行のセルまたは値の 配列リファレンスを返すためにこの機能が含まれていました。 の行がない場合、これは '次の行'を返します。配列refでは空のセル は 'undef'と表示されます。

は受け入れ:undefを=次回| $行=スプレッドシートに属性「count_from_zero」を参照してください 目的の行を示す行の整数::リーダー:: ExcelXML $行に対して返される行を理解すること。

Spreadsheet :: Reader :: ExcelXMLの属性「group_return_type」ごとに、その行の可能なすべての列位置の配列参照 。

このモジュールには、行が何であるかという独自の定義があり、インポート時に変更できることに注意してください。

特定のワークシートを読み込むには、ワークブックオブジェクトでworksheetメソッドを使用します。事前にワークシートの名前を知る必要があります。または、すべての名前をget_sheet_namesで取得することができます。

worksheet($name)

定義:このメソッドは 識別ワークシート内の値を読み取るためのオブジェクトを返します。 $ nameに値が渡されない場合、物理的な順序で '次の' ワークシートが返されます。 'next'はラップされません。 はブック内の 'ワークシート'のみを反復します( 'chartsheets'ではなく)。

受け入れ:開いているワークシート オブジェクトの名前を表す$ name文字列。 Excelでスプレッドシートを開くと、この名前がタブに表示される単語になります。

戻り値: というワークシートを読み取ることができるワークシートオブジェクトです。 undefinedを返し、 「chartsheet」が要求された場合はエラー属性を設定します。または、 'next'モードでは、最後のシートが の場合はundefを返します。

例:暗黙の「次の」ワークシートを使用します。

ここでは、特定のワークシートを開き、行ごとにデータを取得し、結果をダンプします。

+0

私はこのような出力を得ています: - $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 52; $ VAR1 = 26; $ VAR1 = 1; $ VAR1 = 58; $ VAR1 = 52; $ VAR1 = 52; – Anand

+0

Windowsでアクティブなperlを使用しています – Anand

+0

@Anandは 'fetchrow_array_ref'ではなく' fetchrow_array'を使ったようです。私の例ではスカラの '$ row'を使用していたので、配列の要素の数と思われます。入力例がなければ、私はあなたをさらに助けることはできません。私はすでにあなたのためのドキュメントを読んでいます。私は残念なことにあなたのためにあなたの仕事をすることはできません。 – simbabque

関連する問題