StringGridの内容をCSV形式で保存するには?また、保存の際に、自動で.csvのファイル拡張子を付与するには?

解決


ふみ  2009-07-26 21:08:30  No: 35257

こんにちは。

StringGridの中身をCSVデータとして保存したいのですが、
その際に、『自分の好きな名前』で『デスクトップ』に保存できるようにしたいと考えています。

ソース1では、CSV形式での保存は行えるのですが、
名前をつけるやり方とデスクトップの指定方法が分かりません。
opendialog,savedialogを使うと思うのですが、
上手く組み合わせることが出来ずに困っています。

ソース2では、理想どおりの結果を出力できるはずなんですが、
実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。
・間違っている部分がどこか?
・保存する際に自動で端子に.csvを付与するにはどうすれば良いか?

//'C:\Windows\デスクトップ\*.csv'

アドバイス頂けると助かります。
宜しくお願いしします。

-----------ソース1:------------------------------------------
procedure TForm2.GridSaveCSV(SGrid:TStringGrid; fName: String);
 var stList :TStringList;
 ARow :Integer;
begin
 stList:=TStringList.Create;
 try
  for ARow:=0 to SGrid.RowCount-1 do
  stList.Add(SGrid.Rows[ARow].CommaText);
  stList.SaveToFile(fName);
 finally
  stList.Free;
 end;
end;

//CSVFileからStringGridへ読込み1

procedure TForm2.GridLoadCSV(SGrid:TStringGrid; fName:string);
 var stList: TStringList;
     ARow: Integer;
begin
  stList:=TStringList.Create;
 try
  stList.LoadFromFile(fName);
  SGrid.RowCount:= stList.Count;
  for ARow:=0 to stList.Count-1 do
  SGrid.Rows[ARow].CommaText:= stList[ARow];
 finally
  stList.Free;
 end;
end;

procedure TForm2.Button3Click(Sender: TObject);
var
 fName: String;
begin
 fName := 'csvtest.csv';
 GridSaveCSV(StringGrid1,fName);
end;
--------------------------------------------------------------

-----------ソース2:------------------------------------------
procedure TForm2.Button8Click(Sender: TObject);
var
 F   : TextFile;
 Str : String;
 CellA,CellB,CellC,CellD,CellE : String;
 RowCNT : Integer;
begin
 if not SaveDialog1.Execute then exit;

 if FileExists(SaveDialog1.FileName) then
                           //↑ここのFileNameの使い方が良く分かりません><
                           //保存するときに、自動で.csvが付与されるようにしたいと思っています。
    if Application.MessageBox('上書きしますか','注意',MB_YESNO ) = 7
    then exit;                                                //_

 AssignFile(F,SaveDialog1.FileName);
 Rewrite(F);
 RowCNT := 0;

 try
  while not (StringGrid1.Cells[0,RowCnt] = '') do
  begin
   CellA := StringGrid1.Cells[0,RowCnt];
   CellB := StringGrid1.Cells[1,RowCnt];
   CellC := StringGrid1.Cells[2,RowCnt];
   CellD := StringGrid1.Cells[3,RowCnt];
   CellE := StringGrid1.Cells[4,RowCnt];
   Str   := Format('%s,%s,%s,%s,%s',[CellA,CellB,CellC,CellD,CellE]);
            //↑ここのFormatの使い方が良く分かりません。
            //  この辺りが怪しいと思っています。
   WriteLn (F,Str);
   Inc(RowCNT);
  end;
 finally CloseFile(F);
 end;
end;


TS  2009-07-26 23:16:07  No: 35258

特種フォルダの取得
https://www.petitmonte.com/bbs/answers?question_id=5778

csv形式ファイルの設定について
https://www.petitmonte.com/bbs/answers?question_id=1169


igy  2009-07-26 23:58:12  No: 35259

>ソース2では、理想どおりの結果を出力できるはずなんですが、
>実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。
>・間違っている部分がどこか?

StringGridのセルにデータが格納されている場合、正しく出力されます。

 while not (StringGrid1.Cells[0,RowCnt] = '') do
とあるので、StringGrid1.Cells[0,0] になにも格納されていない場合、
空の結果が出力されると思います。

>・保存する際に自動で端子に.csvを付与するにはどうすれば良いか?

TSaveDialogの DefaultExt プロパティ を指定するのは、どうですか?


ふみ  2009-07-27 07:36:07  No: 35260

TSさん、参考になるリンクの紹介をありがとうございます!

igyさん、間違い部分についてのご指摘をありがとうございます!
ご指摘どおり、何も出力されない原因は、Cells[0,0]が空行('')のためでした。ここ数週間、色々調べながら悩んでいたので、とても助かりました。

>ソース2では、理想どおりの結果を出力できるはずなんですが、
>実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。
>・間違っている部分がどこか?

×  while not (StringGrid1.Cells[0,RowCnt] = '') do  の部分を
○  for RowCnt:=0 to StringGrid1.RowCount-1 do  

と書き替えることで、想定通りの結果を出力できました。

>・保存する際に自動で端子に.csvを付与するにはどうすれば良いか?
SaveDialogのDefaultEXTをcsvに変え、
Fillerプロパティのフィルタ名を「csv形式で出力」、フィルタを「*.csv」に設定するで想定どおりの出力が出来ました!

本当にありがとうございました!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加