2017-12-14 2 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

"라인"에 잠재적으로 많은 데이터 유형의 셀이 포함되어있을 때 시트를 한 라인 씩 읽는 것이 무엇을 의미합니까? "라인"에 대해 정확히 받기를 원하십니까? –

+0

한 번에 각 데이터 행 – Anand

+1

왜 그렇게하고 싶습니까? 더 빨라질 것이라고 생각합니까? 적은 코드? 좀 더 가독성? – simbabque

답변

2

는 문서에 따르면, 당신은 전체 행을 얻을 수있는 workbook levelfetchrow_arrayreffetchrow_array 방법을 사용할 수 있습니다.

fetchrow_arrayref($row)

정의 : 경의 I에서 요청한 $ 행의 셀 또는 값의 배열 REF 반환하도록 함수를 포함하는 DBI. 이없는 행이 있으면 '다음'행을 반환합니다. 배열 참조에서 빈 셀 은 'undef'로 표시됩니다.

가 수용 : 다음 = 미확정 | $ 행 = 스프레드 시트 :: 리더의 속성 "count_from_zero":: ExcelXML $ 행에 대해 반환되는 행 이해를 참조하십시오 원하는 행을 나타내는 행 정수입니다.

반환 값 : 의 가능한 모든 열 위치에 대한 배열 참조로 Spreadsheet :: Reader :: ExcelXML의 "group_return_type"특성에 따라 데이터가 채워집니다.

이 모듈에는 행이 무엇인지에 대한 자체 정의가 있으며 가져올 때 변경할 수 있습니다.

특정 워크 시트를로드하려면 통합 문서 개체에 worksheet 메서드를 사용하십시오. 사전에 워크 시트의 이름을 알아야하거나 get_sheet_names으로 모든 이름을 얻을 수 있습니다.

worksheet($name)

정의 :이 방법은 확인 워크 시트의 값을 읽어 객체를 반환합니다. $ name에 값이 전달되지 않으면 'next' 워크 시트가 실제 순서대로 반환됩니다. '다음'은 줄 바꿈되지 않습니다. 은 통합 문서의 '워크 시트'만 반복합니다 ( '차트 시트'가 아님).

수락 : 열려고하는 워크 시트 이름 을 나타내는 $ name 문자열. 이 이름은 Excel에서 스프레드 시트를 열 때 탭에 표시되는 단어입니다. (아래에있는 zip 구성원 파일 은 다를 수 있습니다. 차트 탭 이름을 허용하지 않습니다.)

반환 : 의 워크 시트를 읽을 수있는 워크 시트 개체입니다. undefined를 반환하고 'chartsheet'가 요청 된 경우 오류 속성을 설정합니다. 또는 'next'모드에서 마지막 시트가 이면 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; 
} 
+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

윈도우에서 액티브 펄을 사용하고 있습니다. – Anand

+0

@Anand는'fetchrow_array_ref'가 아니라'fetchrow_array'를 사용하는 것처럼 보입니다. 이 예제에서는 배열의 요소 수인 것 같습니다. 왜냐하면이 예제에서는 스칼라'$ row'를 사용했기 때문입니다. 예제 입력 없이는 더 이상 당신을 도울 수 없습니다. 이미 설명서를 읽었습니다. 불행히도 당신 일을 할 수 없습니다. – simbabque

관련 문제