|
# 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(){
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() {
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
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(){
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() {
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(){
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;
}
|