Excel to TXT 変換

戻る

# Transfer Excel data to txt file # excel2txt.pl 2007.07.30,31 use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; use File::Copy; $Win32::OLE::Warn = 3; # die on errors.. my (%t,$s_ref,$n,$n1,@fld,$file1); # Read setting data while(<DATA>){ if ( /^NAME/ ) { @fld = split; $$s_ref{NAME} = $fld[1]; } elsif (/^SQL/) { chomp; @fld = split(/==>/); $$s_ref{E_DIR} = $fld[1]; $$s_ref{T_DIR} = $fld[2]; } } close(DATA); # Read file's name $t{file1} = $$s_ref{E_DIR} . '-files_div.txt'; open(IN,"../$$s_ref{T_DIR}/$t{file1}") or die "Can't open the file $t{file1}.\n"; while(<IN>) { if (/^$$s_ref{NAME}/){ chomp; @fld = split(/==>/); push(@{ $$s_ref{NOs} }, $fld[1]); push(@{ $$s_ref{Files} }, $fld[2]); } } close(IN); # Do one by one $t{file1} = $$s_ref{E_DIR} . '-' . lc($$s_ref{NAME}) . '.txt'; # Obtaining data from Excel files ($s_ref) = g_excel($s_ref); # Making TXT file $t{txt_file} = '../txt/' . $t{file1}; open(OUT,"> $t{txt_file}"); print " The result is saving in the file $t{txt_file}\n"; print OUT "Filename is $t{file1}\n"; print OUT "=======================================================\n"; for $n ( 0 .. $#{ $$s_ref{NOs} } ) { print OUT 'FILE_SAT:'; printf OUT ("%4s:",$$s_ref{NOs}[$n]); print OUT $$s_ref{Files}[$n],"\n"; for $n1 ( 0 .. $#{ $$s_ref{elements}[$n] } ) { print OUT $$s_ref{elements}[$n][$n1]; } print OUT 'FILE_END:'; printf OUT ("%4s:",$$s_ref{NOs}[$n]); print OUT $$s_ref{Files}[$n],"\n"; print OUT "=======================================================\n"; } close(OUT); sub g_excel { my($s_ref) = @_; my (%t,$n,$n1,$array,$Excel,$Book,$Sheet,$ref_array,$scalar,@fld); $t{Dir} = '../' . $$s_ref{E_DIR}; my $tmp = "\n"; $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application','Quit'); $Excel->{DisplayAlerts} = 'False'; # Open the file # for $n ( 0 .. $#{ $$s_ref{NOs} } ) { for $n ( 67 .. 67 ) { # for $n ( 1001 .. $#{ $$s_ref{NOs} } ) { $t{file1} = $t{Dir} . '/' . $$s_ref{Files}[$n]; $t{NO} = $n + 1; printf ("%4s ==> ",$t{NO}); print "It is dealing with the file $$s_ref{Files}[$n]\n"; copy($t{file1},"tmp.xls"); # 漢字ファイル名対策 $Book = $Excel->Workbooks->Open("C:\\database\\perl\\tmp.xls"); $Sheet = $Book->Worksheets(1); $array = $Sheet->Range("A1:J600")->{'Value'}; $Book->Close; $t{flag} = 0; $t{N1} = 0; $t{N2} = 0; foreach $ref_array (@$array) { $t{N1}++; $t{N3} = 0; foreach $scalar (@$ref_array) { if ( length($scalar) > 0 ) { $t{N3}++; } } if ( $t{N3} == 0 ) { $t{N2}++; } else { $t{N2} = 0; } if ( $t{N2} == 10 ) { last; } } my $last = 'J' . $t{N1}; $Book = $Excel->Workbooks->Open("C:\\database\\perl\\tmp.xls"); $Sheet = $Book->Worksheets(1); $array = $Sheet->Range("A1:$last")->{'Value'}; $Book->Close; foreach $ref_array (@$array) { foreach $scalar (@$ref_array) { # print "$scalar\n"; # next unless defined($scalar); if ( ref($scalar) ) { $scalar = Variant(VT_DATE, $scalar); $scalar = 'TIME:' . $scalar; } $scalar = $scalar . '==>'; push(@{ $$s_ref{elements}[$n] },$scalar); } # print "\n"; push(@{ $$s_ref{elements}[$n] },$tmp); } # unlink("tmp.xls") or die "Can't delete tmp.xls\n"; # ファイルを削除する # last if ($n == 300); } # undef $Excel; return($s_ref); } __DATA__ NAME ENQ # ENQ INV ORDER PACKING PRO QTN SHIPPING C E_DIR T_DIR #SQL==>070722==>txt SQL==>WORK 2005==>txt ===================================================================================== http://www.kaimei.org/note/mag/perl_w32.html $Excel->{DisplayAlerts} = 'False'; を追加したらうまくいきました。 Excel 2003 および Excel 2002 で、変更していないのに保存を促すメッセージが表示される 対象製品 文書番号 : 289111 最終更新日 : 2005年11月17日 リビジョン : 2.1 この記事は、以前は次の ID で公開されていました: JP289111 現象 ブックを開いて、何も変更せずにこのブックを閉じたときに、次のメッセージが表示されます。 Filename.xls の変更を保存しますか? 以前のバージョンの Excel で保存したファイルに含まれる式は、ファイルを開いたときに自動的に再計算されます。 先頭へ戻る 原因 Microsoft Office Excel 2003 および Microsoft Excel 2002 は、デフォルトでは、以前のバージョンの Excel で最後に保存されたファイルを再計算します。この結果、Excel の計算エンジンに行われたすべての機能強化が、ブック内のすべての数式に確実に適用されます。 先頭へ戻る 解決方法 Excel 2003 または Excel 2002 が、以前のバージョンで保存されたブックを自動的に再計算しないようにするには、次の手順を実行します。 1. [ツール] メニューの [オプション] をクリックします。 注 : [オプション] コマンドを利用できるのは、ブックを開いているときだけです。[オプション] コマンドを利用できない場合、[ファイル] メニューの [新規作成] をクリックし、[新しいブック] 作業ウィンドウの [空白のブック] をクリックします。 2. [計算方法] タブをクリックします。[計算方法] の [手動] をクリックします。[保存前に再計算] チェック ボックスをオフにします。 3. [OK] をクリックします。 main::(excel2txt.pl:33): ($s_ref) = g_excel($s_ref); DB<1> n NO==> 1, It is dealing the file ENQ 061513 SA-2P-3T0041.xls. NO==> 28, It is dealing the file ENQ 6011001 AM-2P-540011.xls. NO==> 34, It is dealing the file ENQ 010201 BRAVE P.12C.xls. NO==> 201, It is dealing the file ENQ 010202 BRAVE P.12B.xls. NO==> 201, It is dealing the file ENQ 010501 BIANCO ZEALAND IZ-03014.xls. Win32::OLE(0.1701) error 0x8001010a: "メッセージ フィルタはアプリケーションがビジーであることを示しています。" in METHOD/PROPERTYGET "" at excel2txt.pl line 86 Win32::OLE::AUTOLOAD('Win32::OLE=HASH(0x1d11054)') called at excel2txt.p l line 86 main::g_excel('HASH(0x1cf6530)') called at excel2txt.pl line 33 Debugged program terminated. Use q to quit or R to restart, use O inhibit_exit to avoid stopping after program termination, h q, h R or h O to get additional info. At the start of your script, place the line Const xlSaveChanges = 1 Assuming the workbook object you've created is named objWorkbook and the application object is named objExcel, finish your script with objWorkbook.Close xlSaveChanges objExcel.Quit Steve <mattsmith2@gmail.com> wrote in message news:1137596511.001119.56270@o13g2000cwo.googlegro ups.com... > Hi, I am trying to edit an excel spreadsheet and then close it using > vbscript. > > the script currently edits the data fine, but when it closes, it gives > the Save prompt. Is there a way to close the spreadsheet saving the new > data automatically without any user input > > Thanks ======================================================================= OLE exception from "Microsoft Office Excel": Workbooks クラスの Open プロパティを取得できません。 Win32::OLE(0.1701) error 0x800a03ec in METHOD/PROPERTYGET "Open" at excel2txt.pl line 109 982 ==> It is dealing with the file ENQ 191601 SA-2P-220063.xls OLE exception from "Microsoft Office Excel": Workbooks クラスの Open プロパティを取得できません。 Win32::OLE(0.1701) error 0x800a03ec in METHOD/PROPERTYGET "Open" at excel2txt.pl line 84 ======================================================================= # Check txt files # checktxt.pl 2007.08.01 use strict; my (%t,$s_ref,$n,$n1,@fld,$file1); # Read setting data while(<DATA>){ if ( /^NAME/ ) { @fld = split; $$s_ref{NAME} = $fld[1]; } elsif (/^SQL/) { chomp; @fld = split(/==>/); $$s_ref{E_DIR} = $fld[1]; $$s_ref{T_DIR} = $fld[2]; } } close(DATA); # Read file's name $t{file1} = $$s_ref{E_DIR} . '-files_div.txt'; open(IN,"../$$s_ref{T_DIR}/$t{file1}") or die "Can't open the file $t{file1}.\n"; while(<IN>) { if (/^$$s_ref{NAME}/){ chomp; @fld = split(/==>/); push(@{ $$s_ref{NOs} }, $fld[1]); push(@{ $$s_ref{Files} }, $fld[2]); } } close(IN); # Do one by one $$s_ref{file1} = $$s_ref{E_DIR} . '-' . lc($$s_ref{NAME}) . '.txt'; #for $n ( 0 .. $#{ $$s_ref{NOs} } ) { for $n ( 0 .. 1000 ) { $$s_ref{NO1} = $$s_ref{NOs}[$n]; $$s_ref{File1} = $$s_ref{Files}[$n]; $t{N1} = sprintf("%4s",$$s_ref{NO1}); $$s_ref{sat1} = 'FILE_SAT:' . $t{N1} . ':'; $$s_ref{end1} = 'FILE_END:' . $t{N1} . ':'; ($s_ref) = check1($s_ref); } sub check1 { my($s_ref) = @_; my (%t,$n); print "It is checking file $$s_ref{File1} ($$s_ref{NO1}) "; @{ $t{last10} } = (); $t{flag} = 0; open(IN,"../txt/$$s_ref{file1}") or die "Can't open the file $$s_ref{file1}\n"; while(<IN>){ if ( /$$s_ref{sat1}/ ... /$$s_ref{end1}/ ) { push(@{ $t{last10} }, $_); $t{flag} = 1; } } close(IN); if ( $t{flag} == 0 ) { print "==>No matching!\n"; exit; } @{ $t{last10} } = @{ $t{last10} }[-11..-2]; $t{flag} = 0; for $n ( 0 .. $#{ $t{last10} } ) { $t{leng} = length($t{last10}[$n]); if ( $t{leng} != 31 ) { $t{flag} = 1; print "\nThere is a problem. Exit.\n"; print "$t{last10}[$n]\n"; exit; } } print " ===>OK.\n"; return($s_ref); } #exit; __DATA__ NAME ENQ # ENQ INV ORDER PACKING PRO QTN SHIPPING C E_DIR T_DIR #SQL==>070722==>txt SQL==>WORK 2005==>txt ======================================================================= Win32::OLE::Variant=SCALAR(0x3b23e2c) ==>2月5日 Win32::OLE::Variantを追加 if ( ref($scalar) ) { $scalar = Variant(VT_DATE, $scalar); $scalar = 'TIME:' . $scalar; }

戻る