Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年06月18日] [更新 2013年12月17日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
指定範囲のセルのデータをテキスト保存
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







行単位でテキスト保存


指定したセル範囲のデータを、クリップボードを経由でテキストとして取得して保存します。コード内の TStringList に、取得したデータがタブ区切りのテキストで格納されています。データのいろいろな加工に利用できます。
セル内の文字列に改行がある場合は、正常に取得できません。別の工夫が必要です。当然ですが、一番確実なのは、速度をある程度犠牲にしてもセル値ごとに処理することです。セルの文字列に [TAB] 文字やカンマが入っている場合は特にそうです。セルの文字列ごとにダブルクォーテーションで囲まないと正常に取出せないことがあります。セルの値が単独の数値の場合は、ダブルクォーテーションで囲まなくても、取出したあとから表示形式等を整えることができます。


図1
テスト用データ
図2
保存されたテキストファイル

リスト1 
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  ARange    : Txlf2000Range;
  ClipBoard : TClipBoard;
  SL        : TStringList;
  pFalse    : OleVariant;
begin
  ARange := xlfExcelSheet.Range['B6', 'F12'];
  ARange.Copy(EmptyParam);

  ClipBoard := TClipBoard.Create;
  SL        := TStringList.Create;
  try
    SL.Add(ClipBoard.AsText);
    SL.SaveToFile('CellText.txt');
    ClipBoard.Close;

    //コピー動作の点滅を消す
    //これを消さないと作業中の状態となり、終了時に例外が発生する
    pFalse := False;
    xlfExcelApp.CutCopyMode[0] := pFalse;
  finally
    Clipboard.Free;
    SL.Free;
  end;
end;




単一区切り文字でテキスト保存


同じくクリップボード経由でテキストファイルに保存します。各々のセル値ごとに改行が入り、単一の区切り文字として取得できます。こちらの方は [TAB] の処理が不要となります。項目数とデータの行数があらかじめがわかっていれば後処理がしやすいこともあるかも知れません。


図3
保存されたテキストファイル

リスト2 
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
var
  ARange    : Txlf2000Range;
  ClipBoard : TClipBoard;
  SL        : TStringList;
  pFalse    : OleVariant;
begin
  ARange := xlfExcelSheet.Range['B6', 'F12'];
  ARange.Copy(EmptyParam);

  ClipBoard := TClipBoard.Create;
  SL        := TStringList.Create;
  try
    SL.DelimitedText := ClipBoard.AsText;
    SL.SaveToFile('CellText.txt');
    ClipBoard.Close;

    //コピー動作の点滅を消す
    //これを消さないと作業中の状態となり、終了時に例外が発生する
    pFalse := False;
    xlfExcelApp.CutCopyMode[0] := pFalse;
  finally
    Clipboard.Free;
    SL.Free;
  end;
end;




選択中のセル範囲のデータをテキスト保存


現在選択中のセルのデータを対象とする例です。


図4
選択範囲を保存
図5
保存されたテキストファイル

リスト3 
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  ARange    : Txlf2000Range;
  ClipBoard : TClipBoard;
  SL        : TStringList;
  pFalse    : OleVariant;
begin
  ARange := Txlf2000Range(xlfExcelApp.Selection[0]);
  ARange.Copy(EmptyParam);

  ClipBoard := TClipBoard.Create;
  SL        := TStringList.Create;
  try
    SL.Add(ClipBoard.AsText);
    SL.SaveToFile('CellText.txt');
    ClipBoard.Close;

    //コピー動作の点滅を消す
    //これを消さないと作業中の状態となり、終了時に例外が発生する
    pFalse := False;
    xlfExcelApp.CutCopyMode[0] := pFalse;
  finally
    Clipboard.Free;
    SL.Free;
  end;
end;