• 数据另存为CSV档案(也是一种excel档案)【2】------自主选择路径


    实现自主选择路径,将数据另存为CSV档案的功能。代码如下:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,ShlObj,ComCtrls,ShellAPI,IniFiles,
      ActiveX, wwdbdatetimepicker;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        wwDBDateTimePicker1: TwwDBDateTimePicker;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    function GetSystemPath(Folder: Integer): string;
    var
      PIDL: PItemIDList;//PItemIDList在ShlObj單元。
      Path: LPSTR;//LPSTR在Windows單元。
      AMalloc: IMalloc;//IMalloc在ActiveX單元。
    begin
      Path :=StrAlloc(MAX_PATH);
      SHGetSpecialFolderLocation(Application.Handle, Folder, PIDL);
      if SHGetPathFromIDList(PIDL, Path) then
        Result :=Path;
      SHGetMalloc(AMalloc);
      AMalloc.Free(PIDL);
      StrDispose(Path);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      mysave:TSaveDialog;
      FileName,MYSTR:string;
      LIST1:TStringList;
      I:Integer;
    begin
      FileName:='我的文檔啦';
      mysave:=TSaveDialog.Create(Self);//self這裡是指form1
      mysave.InitialDir:=GetSystemPath(CSIDL_PERSONAL);//CSIDL_PERSONAL在ShlObj單元里,是一個16進制的數:$0005。
      mysave.InitialDir:=GetCurrentDir; //直接用delphi自帶的函數GetCurrentDir(在SysUtils單元里)也能取得文件路徑。
      mysave.Title:='請選擇要保存的位置啦';
      mysave.FileName:=FileName;
      {如何在保存時于文檔名后面加上後綴名‘.csv’?
      答:是mysave.DefaultExt、 mysave.Filter、 mysave.FilterIndex 共同決定的。下面的代碼分別解釋了它們所起的作用:}
    
      mysave.DefaultExt:='CSV';//選‘存檔類型’時這句代碼使文檔名後面有後綴且隨著所選的類型而變化相應的後綴。
      mysave.Filter:='xlsx檔案|*.xlsx|xls檔案|*.xls|csv檔案|*.csv|所有檔案|*.*';//這裡羅列了4種類型。(Filter屬性有Filter Name和Filter兩個值,相當於展示值和存儲值。)
      mysave.FilterIndex:=3;//存檔類型(過濾) 的下標,從1開始,1表示第一條,默認為第一條。這裡為3表示後綴名默認為‘.csv’。
    
      mysave.Options:=mysave.Options+[ofOverwritePrompt];//相同文件名时弹出是否覆盖的对话框
      //FileName:=mysave.GetNamePath;//FileName是空的,這樣不能獲取路徑。。。
      if mysave.Execute then
      begin
        FileName:=mysave.FileName;//獲取文件保存的路徑!!
        mysave.Free;
      end
      else
        mysave.Free;
      LIST1:=TStringList.Create;
      MYSTR:='HAHA,TOTO,DUDU,LINGLING,PYNPYN,KIMO,GIGI,QIQI';
      LIST1.Append(MYSTR);
      for I:=0 TO 10 do
      BEGIN
        LIST1.Append('MY'+FormatFloat('00',I));
      end;
    
      LIST1.SaveToFile(FileName);{根據文件路徑找到剛剛創建并保存的文件,將列表LIST1的每行內容
      按行保存到該文件中(CSV文件會把行中按逗號分隔的內容分割并保存到不同的列單元格!而
      xlsx、xls文件不會識別逗號分割,只會全部保存到一個單元格里)。  }
    
      //下面調用API函數ShellExecute打開程式文檔
      //ShellExecute(Handle,'',PChar(FileName),'','',SW_SHOWNORMAL);//用空字符串的話,後面自主打開excel時會報錯!!
      ShellExecute(Handle,nil,PChar(FileName),nil,nil,SW_SHOWNORMAL);//是PChar類型,所以要用nil。
      //ShellExecute(Handle,null,PChar(FileName),null,null,SW_SHOWNORMAL);//報錯:Incompatible types: 'Variant' and 'PAnsiChar'
    end;

    结果如图:

     

  • 相关阅读:
    Docker的安装、配置及其基本使用
    Java提升七:注解
    Java提升六:泛型
    Java提升五:反射与动态代理
    MySQL中如何将主键默认值设为UUID()
    图解Mybatis框架原理及使用
    Java提升四:Stream流
    Java提升三:函数式接口
    Java提升二:Lambda表达式与方法引用
    java提升一:内部类
  • 原文地址:https://www.cnblogs.com/168-h/p/14743686.html
Copyright © 2020-2023  润新知