Win32::OLE를 사용한 Microsoft Word 작업

12284 단어 Perl
Perl Advent Calendar 2019 의 12일째입니다.
어제는 codehex 씨였습니다.

계기



종이 문화의 직장 때문에, 결재 서류나 계약 서류 등 다양한 정형 서류에 둘러싸여 있습니다.
공통되는 내용을 복수의 서류에 전기할 필요가 있어, 실수의 원인도 되고, 시간이 걸리고 있었습니다.
거기서, 입력 폼을 작성해 버튼 하나로 작성 가능하게 하는 등, 업무량의 압축을 도모했습니다.
그 때의 지견을 공유할 수 있으면 좋다고 느꼈기 때문에 투고합니다.

전제 등



현재, VBA를 사용하고 있는 사람에게는 추천할 수 있다고 생각합니다.
Windows7과 Strawberry Perl 5.30(모두 32bit판)에서 실시했습니다.

Win32::OLE


  • 좋은 점
  • VBA에서 두드리는 것을 만들면 perl로 다시 작성하면됩니다
  • Office의 매크로 기록 기능을 사용하면 VBA 코드가 생성되므로 시간을 줄일 수 있습니다.
  • 상수 등도 VBA의 이미디에이트 윈도우에서 간단하게 조사할 수 있으므로 좋다(후술)

  • 나쁜 곳
  • 문자 코드를 항상 의식해야합니다 (CP932로 변환하지 않으면 제대로 작동하지 않음)
  • VBA에 익숙해지면 인수가 엉망이됩니다 (아래 참조)


  • Microsoft Office VBA에서 상수를 확인하는 방법



     이미디에이트윈도우에서 True나 False등의 정수를 조사할 수 있습니다.

    다이어그램에서는 True = -1, False = 0, wdSendToNewDocument = 0 이라고 알 수 있습니다.

    인수 정보



    함수에 대한 인수는 해시 참조로 전달됩니다.
    아래 그림의 빨간색 테두리는 Word의 매크로 기록으로 작성된 VBA입니다. T 드라이브의 샘플 문서라는 파일을 연 것입니다.

     이 경우 perl에서는 다음과 같습니다.

    sample1.pl
    # 引数準備
    my %openparam;  
    $openparam{"FileName"} = Encode::encode("CP932","t:\\サンプル文書.docx");
    $openparam{"ReadOnly"} = 0; # False
    
    # ファイルを開く
    my $doc = $word->Documents->Open(\%openparam);  # 引数のハッシュはリファレンスで渡す
    

    또는

    sample2.pl
    my $openparam;
    $openparam->{"FileName"} = Encode::encode("CP932","t:\\サンプル文書.docx");
    $openparam->{"ReadOnly"} = 0; # False
    
    # ファイルを開く
    my $doc = $word->Documents->Open($openparam);
    

    예) Word 파일을 열고 문서를 넣고 파일 저장



    예는, 이하의 5개를 실시하고 있습니다.
    1. [샘플 문서.docx] 열기
    2. 삽입 소스 데이터로서 [샘플 삽입 데이터 .xlsx]의 sheet1을 지정한다
    3. 병합된 새 문서 작성
    4. 새 문서 인쇄
    5. 새 문서를 [샘플 저장.docx]로 저장

    sample.pl
    #!perl
    use strict;
    
    use Win32::OLE;
    use Encode qw(encode);
    use utf8;
    
    my $word = Win32::OLE->new("Word.Application");
    $word->{Visible} = -1;  # 可視状態にする (True = -1)
    
    # documentは $word->Documents->Open で開く
    # その時の引数をハッシュで準備する
    my %openparam;  
    $openparam{"FileName"} = Encode::encode("CP932","t:\\サンプル文書.docx");
    $openparam{"ReadOnly"} = -1; # True 読み取り専用で開く
    
    # ファイルを開く
    my $doc = $word->Documents->Open(\%openparam);  # 引数のハッシュはリファレンスで渡す
    
    # 差し込み印刷
    my %dbparam;
    $dbparam{"Name"} = encode("CP932","t:\\サンプル差込データ.xlsx");  # 差し込み印刷用のデータ
    $dbparam{"SQLStatement"} = "SELECT * FROM `Sheet1\$`";  # シート名は〔`〕で囲む。また名称末尾には$
    
    $doc->MailMerge->OpenDataSource(\%dbparam); # 差し込み印刷の設定 ハッシュをリファレンスで渡す    
    $doc->MailMerge->{Destination} = 0; # wdSendToNewDocument = 0
    $doc->MailMerge->{SuppressBlankLines} = -1; # True = -1
    $doc->MailMerge->DataSource->{FirstRecord} = 1; # wdDefaultFirstRecord = 1 レコードの最初から
    $doc->MailMerge->DataSource->{LastRecord} = -16; # wdDefaultLastRecord = -16 レコードの最後まで
    $doc->MailMerge->Execute(0);    # 差し込み印刷実行
    
    # 差し込み印刷された文書を印刷
    my $countdoc = $word->Documents->Count; # 文書数、最後に作られた文書は 文書数-1で指定できる
    my $newdoc = $word->Documents->Item($countdoc - 1);
    
    my %printparam;
    $printparam{"Copies"} = 1;  # コピー枚数
    $printparam{"Background"} = 0;  # False = 0
    $newdoc->PrintOut(\%printparam);
    
    # 保存
    $newdoc->SaveAs2(encode("CP932","t:\\サンプル保存.docx"));
    
    # 閉じる
    $newdoc->Close(0); # False = 0
    $doc->Close(0);
    $word->Quit(0);
    
    undef $doc;
    undef $word;
    

    결론



    매크로의 기록을 사용하면 VBA 코드가 작성되기 때문에, 「북마크로 이동」 「표를 결합」 「사선을 그린다」등도 간단하게 perl로 이행할 수 있습니다.
    Excel도 마찬가지로 매크로를 기록하여 생긴 VBA를 가공하면 조금 편해질 수 있습니다.

    내일, 13일째는 omokawa_yasu입니다.
    고마워요.

    좋은 웹페이지 즐겨찾기