一、导出函数说明
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 '导出失败';