喫茶XRAYトップページ


[1993] エクセルからCSVへ保存返信 削除
2008/11/4 (火) 12:03:44 kouji
はじめまして、
delphiをはじめて間もないものです。

今回、エクセルデータを読み込んでDBへ更新をしているのですが
エクセルデータが、15000件ほどあり時間が掛かってしまうため
1度CSVへ変換をして、やろうと思っております。

現在

  objExcel := Null;
  try
    //Excel起動
    objExcel := CreateOleObject('Excel.Application');
    objExcel.Visible := False;
  except
    on EOleSysError do begin
      MessageBox(Handle,'Excelが起動できません。','警告',MB_OK);
      objExcel := unAssigned;
      Exit;
    end;
  end;
  try
   //ExcelBook オープン
   wPath := Trim(MltEdit1.Value);
   objBook := objExcel.WorkBooks.Open(wPath);
  except
    on EOleSysError do begin
      MessageBox(Handle,'指定されたファイルを開けません。','警告',MB_OK);
      objExcel.DisplayAlerts := False;//メッセージダイアログを表示しない
      objExcel.Quit;
      objExcel := unAssigned;
      Exit;
    end;
  end;
  try
    wEditName := Copy(wPath, 1 ,   Length(wPath)-4);
    objBook.SaveAs (wEditName + '.csv'
//                 ,xlcsv
                 );
  finally
    Screen.Cursor   := crDefault;
    objExcel.DisplayAlerts := False;
    objExcel.Quit;
    objExcel := unAssigned;
  end;


※wpathは、Diialogで選択しています。

ここまでは、分るのですが、
セーブしたものを開こうとすると
「テキストファイルではありません」とでてしまい
開けません。

本当に初歩ですが、切羽詰っているので
ご教授のほどよろしくお願いいたします。



[1994] Re:エクセルからCSVへ保存返信 削除
2008/11/4 (火) 16:35:14 Mr.XRAY
▼ koujiさん,こんにちは.

>     wEditName := Copy(wPath, 1 ,   Length(wPath)-4);
>     objBook.SaveAs (wEditName + '.csv'
> //                 ,xlcsv
>                  );


xlcsvのところがコメントアウトになっていますが,xlcsvを指定しないと
csvでは保存しません.Excelファイルで保存することになります.
開発環境(Windows,Delphi,Excelのバージョン)はどうなっていますか.

以下の環境で確認しました.
Windows XP(SP2) + Delphi7 Pro + Excel2000
Excelを非表示で実行(この方が高速)していますが,表示する必要がなければ
M & IさんのXBiffを利用するとものすごく高速になりますよ.

http://homepage3.nifty.com/m-and-i/tips/tipspage.htm#component
http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s1661

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ComObj,Excel2000;

procedure TForm1.Button1Click(Sender: TObject);
var
   objExcel  : OleVariant;
   objBook   : OleVariant;
   wPath     : String;
   wEditName : String;
begin
    //Excelオブジェクト生成
  objExcel := CreateOleObject('Excel.Application');
  objExcel.Visible := False;
  objExcel.DisplayAlerts := False;
 
  OpenDialog1.InitialDir := ExtractFileDir(ParamStr(0));
  try
    if OpenDialog1.Execute then begin
      //ExcelBook オープン
      wPath := OpenDialog1.FileName;//  Trim(MltEdit1.Value);
      try
       objBook := objExcel.WorkBooks.Open(wPath);
      except
        on EOleSysError do begin
          MessageBox(Handle,'指定されたファイルを開けません。','警告',MB_OK);
          objExcel.Quit;
          objExcel := unAssigned;
          exit;
        end;
      end;

      //拡張子を変更するだけならこれでOK
      wEditName := ChangeFileExt(wPath,'.csv');
      objBook.SaveAs (wEditName,xlcsv);
    end;
  finally
    Screen.Cursor   := crDefault;
    objExcel.Quit;
    objExcel := unAssigned;
  end;
end;

end.


[1995] Re2:エクセルからCSVへ保存返信 削除
2008/11/4 (火) 16:55:37 Kouji
▼ Mr.XRAYさん こんにちは、
早速のお返事をいただきましてありがとうございました。
何の説明もなく大変申し訳ありませんでした。

> ▼ koujiさん,こんにちは.
>
> >     wEditName := Copy(wPath, 1 ,   Length(wPath)-4);
> >     objBook.SaveAs (wEditName + '.csv'
> > //                 ,xlcsv
> >                  );
>
> xlcsvのところがコメントアウトになっていますが,xlcsvを指定しないと
> csvでは保存しません.Excelファイルで保存することになります.
> 開発環境(Windows,Delphi,Excelのバージョン)はどうなっていますか.

●開発環境は、

 WindowsXp(SP2),
 Delphi2005,
 Excel(自分のは、2003、納品するお客様は2007になります)

>
> 以下の環境で確認しました.
> Windows XP(SP2) + Delphi7 Pro + Excel2000
> Excelを非表示で実行(この方が高速)していますが,表示する必要がなければ
> M & IさんのXBiffを利用するとものすごく高速になりますよ.
>
> http://homepage3.nifty.com/m-and-i/tips/tipspage.htm#component
> http://mrxray.on.coocan.jp/bbs/DelphiBBS/mrxray_delphifan_coffe.cgi?tree=s1661
>
> unit Unit1;
>
> interface
>
> uses
>   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
>   Dialogs, StdCtrls;
>
> type
>   TForm1 = class(TForm)
>     Button1: TButton;
>     OpenDialog1: TOpenDialog;
>     procedure Button1Click(Sender: TObject);
>   private
>     { Private 宣言 }
>   public
>     { Public 宣言 }
>   end;
>
> var
>   Form1: TForm1;
>
> implementation
>
> {$R *.dfm}
>
> uses ComObj,Excel2000;
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
>    objExcel  : OleVariant;
>    objBook   : OleVariant;
>    wPath     : String;
>    wEditName : String;
> begin
>     //Excelオブジェクト生成
>   objExcel := CreateOleObject('Excel.Application');
>   objExcel.Visible := False;
>   objExcel.DisplayAlerts := False;
>
>   OpenDialog1.InitialDir := ExtractFileDir(ParamStr(0));
>   try
>     if OpenDialog1.Execute then begin
>       //ExcelBook オープン
>       wPath := OpenDialog1.FileName;//  Trim(MltEdit1.Value);
>       try
>        objBook := objExcel.WorkBooks.Open(wPath);
>       except
>         on EOleSysError do begin
>           MessageBox(Handle,'指定されたファイルを開けません。','警告',MB_OK);
>           objExcel.Quit;
>           objExcel := unAssigned;
>           exit;
>         end;
>       end;
>
>       //拡張子を変更するだけならこれでOK
>       wEditName := ChangeFileExt(wPath,'.csv');
>       objBook.SaveAs (wEditName,xlcsv);
>     end;
>   finally
>     Screen.Cursor   := crDefault;
>     objExcel.Quit;
>     objExcel := unAssigned;
>   end;
> end;
>
> end.


●昨日より、この文章を見て一人でてんぱっておりました。
 MrXRAY様のご指摘通り、直したらCSVがすぐに出来ました。
 ありがとうございました。
 現在、プログラムにも問題はあると思いますが
 3分半くらい掛かってしまうため
 すぐにテストを行ってみます。
 本当にありがとうございました。

 また何かあったらご質問させて頂きたいと思いますので
 よろしくお願いいたします。

 Kouji


[1996] Re3:エクセルからCSVへ保存返信 削除
2008/11/4 (火) 17:13:21 Mr.XRAY
▼ Koujiさん

> ●開発環境は、
>
>  WindowsXp(SP2),
>  Delphi2005,
>  Excel(自分のは、2003、納品するお客様は2007になります)


この開発環境だと,Excel2007関係の情報は得られませんので,
usse にはExcelXPがいいかも知れません.
(もしあればExcel2003)

高速化にはXBiffもそうですが,エクセルクリエータを使用しても非常に
高速になります.ただし,有料で,実行ファイルと同じフォルダにDllが
必要です.XBiffの方は計測していませんが,エクセルクリエータでは,
ExcelのOLEObjectに比べて,ほぼ100倍近くの速度が得られます.

クライアントの要求がどんな仕様なのかはわかりませんが,変換の作業が
それほど必要なければ我慢していただくというのもひとつの考え方かも
しれませんね (^_^;)

INCM/CMT
Cyclamen v3.82