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 で、変更していないのに保存を促すメッセージが表示される 対象製品 文書番號(hào) : 289111 最終更新日 : 2005年11月17日 リビジョン : 2.1 この記事は、以前は次の ID で公開されていました: JP289111 現(xiàn)象 ブックを開いて、何も変更せずにこのブックを閉じたときに、次のメッセージが表示されます。 Filename.xls の変更を保存しますか? 以前のバージョンの Excel で保存したファイルに含まれる式は、ファイルを開いたときに自動(dòng)的に再計(jì)算されます。 先頭へ戻る 原因 Microsoft Office Excel 2003 および Microsoft Excel 2002 は、デフォルトでは、以前のバージョンの Excel で最後に保存されたファイルを再計(jì)算します。この結(jié)果、Excel の計(jì)算エンジンに行われたすべての機(jī)能強(qiáng)化が、ブック內(nèi)のすべての數(shù)式に確実に適用されます。 先頭へ戻る 解決方法 Excel 2003 または Excel 2002 が、以前のバージョンで保存されたブックを自動(dòng)的に再計(jì)算しないようにするには、次の手順を?qū)g行します。 1. [ツール] メニューの [オプション] をクリックします。 注 : [オプション] コマンドを利用できるのは、ブックを開いているときだけです。[オプション] コマンドを利用できない場(chǎng)合、[ファイル] メニューの [新規(guī)作成] をクリックし、[新しいブック] 作業(yè)ウィンドウの [空白のブック] をクリックします。 2. [計(jì)算方法] タブをクリックします。[計(jì)算方法] の [手動(dòng)] をクリックします。[保存前に再計(jì)算] チェック ボックスをオフにします。 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; }

戻る
汤原县| 丹凤县| 麻城市| 邻水| 灌阳县| 五莲县| 扎兰屯市| 珲春市| 太保市| 柞水县| 大城县| 于都县| 赤水市| 双江| 吉林省| 曲阜市| 加查县| 潞城市| 肇源县| 许昌县| 五指山市| 措美县| 同德县| 城市| 天津市| 梁山县| 泽州县| 苏尼特右旗| 徐州市| 双牌县| 独山县| 灵武市| 临夏市| 景东| 财经| 墨竹工卡县| 镇巴县| 防城港市| 萨迦县| 仪陇县| 双柏县|