FAQ > 金融建模 > 第三方交互 > 其他

Q:多种导出数据(txt/xls/csv/stm)到本地的方法    

  • 一、导出函数说明
    1、WriteFile(字符串写成文本文件)
    函数说明:FAQ:WriteFile
    第四个参数pos的补充说明:
    如果设为-1,则每次导出到文件的末尾(不会覆盖已有的数据)。
    如果设为0,则从文件第一个位置开始导出(会覆盖掉原有位置的数据)。
    如果设为1,则从文件的第二个位置开始导出,同0会覆盖,2,3,…依此类推。
    如果设为-2,-3-4….,则如同设为0的效果。
    Pos返回值:返回本次数据在文件中的最后位置的下一个位置
    范例:将表格数据导出到TXT文件

    //导出到TXT的数据需是一个字符串,换行符为 \r\n   空格符\t
    Dir:='D:\\数据导出测试\\';
    setsysparam(pn_cycle(),cy_day());
    Data:=select ['StockID'],['StockName'],dateTimetostr(['date']) as 'Date',['close'],['vol'] from
    markettable datekey 20170501T to 20170508T of 'SZ000002' end;
    //-------数据格式化(用户根据自己的需要来编辑)---------
       //价格转为两位小数的字符串
    Data[:,'close']:=FloatToStrEx(Data[:,'close'],2);
         //成交量转为整数字符串
    Data[:,'vol']:=IntToStr(Data[:,'vol']);
         //数组->字符串
    DataStr:='';
    cStr:=mcols(Data,1);  //表格列标情况
    for i:=0 to length(Data)-1 do
    begin
        for j:=0 to length(cStr)-1 do
            DataStr:=DataStr$Data[i,cStr[j]]+'\t'; //\t可能空格长度不一,可用'  '固定长度的空格字符串来替代
        DataStr+='\r\n';//换行
    end
    {    //如果不介意列的前后位置,可用下列代码替代上面的双重循环
    for i:=0 to length(Data)-1 do
    DataStr:=DataStr$Array2Str(Data[i],'\t')+'\r\n';
    }
    pos:=-1;
    ret:=Rdo2 WriteFile(rwRaw(),'',Dir$'TxTTest.txt',pos,Length(DataStr),DataStr);
    if ret then
       return '导出成功';
    else return '导出失败';


    2、Exportfile(表格数据写成文件)
    函数说明:FAQ:ExportFile
    范例:将数据导成Excel文件

    Dir:='D:\\数据导出测试\\';
    setsysparam(pn_cycle(),cy_day());
    Data:=select ['StockID'],['StockName'],
    dateTimetostr(['date']) as 'Date',
    ['close'],['vol'] from
    markettable datekey 20170501T to 20170508T of 'SZ000002' end;
    ret:=Rdo2 ExportFile(ftXLS(),'',Dir+'ExcelTest1.xlsx',Data,1,0);
    if ret then
       return '导出成功';
    else return '导出失败';


    范例:将数据导成csv文件

    Dir:='D:\\数据导出测试\\';
    setsysparam(pn_cycle(),cy_day());
    Data:=select ['StockID'],['StockName'],
    dateTimetostr(['date']) as 'Date',
    ['close'],['vol'] from
    markettable datekey 20170501T to 20170508T of 'SZ000002' end;
    ret:=Rdo2 ExportFile(ftCSV(),'',Dir+'CSVTest1.csv',Data,1,0);
    if ret then
       return '导出成功';
    else return '导出失败';


    3、ExportFile2(表格数据写到Excel指定的Sheet或指定位置)
    函数说明及范例:FAQ:2014-04-17-应用专题-第三方交互01:天软金融分析.NET与Excel常见几种交互方式的探索
    范例:指定Sheet,指定位置的导出:(只覆盖指定范围)

    Dir:='D:\\数据导出测试\\';
    setsysparam(pn_cycle(),cy_day());
    Data:=select ['StockID'],['StockName'],
    dateTimetostr(['date']) as 'Date',
    ['close'],['vol'] from
    markettable datekey 20170501T to 20170508T of 'SZ000002' end;
    SheetName:=stockName('SZ000002')$'行情';
    Len:=Length(Data);
    pos:='B2:F'$(2+Len); //若范围比数据大,无数据的地方会被nil值填充,而excel无法识别
    ret:=Rdo2 ExportFile2(ftXLS(),'',Dir+'ExcelTest2.xlsx',Data,1,0,SheetName,pos);
    if ret then
       return '导出成功';
    else return '导出失败';


    二、导成一个文件(小数据导出)
    1、导成txt文件:范例参考导出函数说明1、 WriteFile
    2、导成csv文件:范例参考导出函数说明2、Exportfile范例:将数据导成csv文件
    3、导成excel文件:范例参考导出函数说明3、Exportfile范例:将数据导成Excel文件
    4、导成stm文件(该文件只有天软平台能读取)

    三、分批导出(大数据导出)
    如果需要导出大数据,而内存的限制,我们并不能一次性导出几个月甚至几年的高频数据,那么可以分批次导出,比如使用for循环控制导出的时间段或导出的股票,从而控制导出数据的大小。
    1、导成excel文件
    范例1:将十支股票20160101日到20160120日的交易明细导出到excel中,存放方式,每天一个excel文件,一个excel中,每个sheet存放一支票。

    Dir:='D:\\数据导出测试\\';
    begT:=20160101T;
    endT:=20160120T;
    bk:=getbk('沪深300');
    bk:=bk[0:10];//选取十支
    Tarr:=MarketTradeDayQk(begT,endT);//市场交易日

    for i:=0 to length(Tarr)-1 do
    begin
        FileName:=datetostr(Tarr[i]);
        for j:=0 to length(bk)-1 do
        begin
            setsysparam(pn_stock(),bk[j]);
            if not istradeday(Tarr[i]) then continue;
     //取数
            data:=select ['StockID'],['StockName'],
            datetimetostr(['date']) as 'date',['close'],['vol']
            from tradetable datekey Tarr[i] to Tarr[i]+0.99 of bk[j] end;
            SheetName:=bk[j];
    //导出
            ret:= rdo2 Exportfile2(ftXLS(),'',Dir+FileName+'.xlsx',Data,1,0,SheetName);
            if ret then
               echo '导出'$FileName$'日'$SheetName$'数据成功!';
            else echo '导出'$FileName$'日'$SheetName$'数据失败!';
        end
    end
    return '数据导出完毕!';


    四、多级表头数据导出到excel中
    说明:只支持ExportFile,且第一个参数为ftXls2()
    范例:多级表头数据导出到excel中

    //多级表头
    Dir:='D:\\数据导出测试\\';
    begT:=20170101T;
    endT:=20170120T;
    setsysparam(pn_cycle(),cy_day());
    Tarr:=MarketTradeDayQk(begT,endT);//市场交易日
    bk:=array('SZ000002','SH600000');
    data:=array();
    n:=0;
    for i:=0 to length(Tarr)-1 do
    begin
        data[i,'日期']:=datetostr(Tarr[i]);
        setsysparam(pn_date(),Tarr[i]);
        for j:=0 to length(bk)-1 do
        begin
            setsysparam(pn_stock(),bk[j]);
            sName:=stockname(bk[j]);
            data[i,sName$'@收盘']:=close();
            data[i,sName$'@成交量']:=vol();
            data[i,sName$'@成交金额']:=amount();
        end
    end
    ret:=Rdo2 ExportFile(ftXls2(),'',Dir+'excelTest4.xlsx',data);
    if ret then
       return '导出成功';
    else return '导出失败';