急!数据库查询导入excel速度太慢问题!

qdrnocking 2010-10-25 07:17:42
使用ADO查询后导入到excel速度较慢,怎么能够快一些呢!?记录一般在数千条!
我是用的方法:

while(!ADOQuery1->Eof)
{
ExcelApp.OlePropertyGet("Rows",i+2).OlePropertySet("RowHeight",16);
for( int j=0;j<m;j++)
{
Sheet1.OlePropertyGet("Cells",i+2,j+1)
.OlePropertySet("Value",
ADOQuery1->FieldByName(
DBGrid1->Columns->Items[j]->FieldName)->AsString.c_str());
}
DataModule1->ADOQuery1->Next();

如何能够快速的导入到excel文件中!谢谢
...全文
299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdrnocking 2010-10-27
  • 打赏
  • 举报
回复
To BCBPLC
谢谢,我刚回来,等晚上试一下!
现在给分!
BCBPLC 2010-10-27
  • 打赏
  • 举报
回复
我做的程序,导出功能全是这样做的,
代码简单,速度快,何乐不为
BCBPLC 2010-10-27
  • 打赏
  • 举报
回复
我做的程序,导出功能全是这样做的,
代码简单,速度快,何乐不为
qdrnocking 2010-10-26
  • 打赏
  • 举报
回复
XLSReadWrite 怎么使用?
好像在BCB6上无法安装吧!
xuanyanlan 2010-10-26
  • 打赏
  • 举报
回复
XLSReadWrite比CX还快
我下个试下
xjq2003 2010-10-26
  • 打赏
  • 举报
回复
Ole速度确实很慢,
用些文件的方法导出excel比Ole快100倍。
文件名保存为.csv格式
数据格式为:
1,2,3
4,5,6
……
就可以了
ddllyt19890617 2010-10-26
  • 打赏
  • 举报
回复
我是菜鸟,膜拜大神
GoAwayZ 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bcbplc 的回复:]
该程序有通用性
[/Quote]
BCBPLC 2010-10-26
  • 打赏
  • 举报
回复
该程序有通用性
BCBPLC 2010-10-26
  • 打赏
  • 举报
回复
把无用的语句去掉更短,把数据库的表dataset,导出文件名为xls的文件
速度极快,算法简单
void TDataModule1::dataset_Export(TADODataSet *dataset,String xls)
{
String tab=char(9); // 格与格之间的分隔符
String lf="\r\n"; // 下一行

TFileStream *fs=new TFileStream(xls,fmCreate);
for (int i=0;i<dataset->FieldCount;i++)
{
String fd=dataset->Fields->Fields[i]->FieldName;
fd="\""+fd+"\""+tab;
fs->Write((void *)fd.c_str(),fd.Length());
}
fs->Write((void *)lf.c_str(),lf.Length());

dataset->First();
while (!dataset->Eof)
{
for (int i=0;i<dataset->FieldCount;i++)
{
String fd=dataset->Fields->Fields[i]->FieldName;
TField *zd=dataset->FieldByName(fd);
String zdv=zd->AsString+tab;
fs->Write((void *)zdv.c_str(),zdv.Length());
}
fs->Write((void *)lf.c_str(),lf.Length());
dataset->Next();
}
delete fs;
}
BCBPLC 2010-10-26
  • 打赏
  • 举报
回复
最快的是导出文本格式的电子表格,既快又简单,唯一不足的是格式有点不好,
写一段供楼主参考:
void TDataModule1::MDB_Export(TADODataSet *dataset,String xls)
{
String tab=char(9);
String lf="\r\n";

TFileStream *fs=new TFileStream(xls,fmCreate);
for (int i=0;i<dataset->FieldCount;i++)
{
String fd=dataset->Fields->Fields[i]->FieldName;
fd="\""+fd+"\""+tab;
fs->Write((void *)fd.c_str(),fd.Length());
}
fs->Write((void *)lf.c_str(),lf.Length());

dataset->DisableControls();
void *SavePlace =dataset->GetBookmark();
dataset->First();
while (!dataset->Eof)
{
for (int i=0;i<dataset->FieldCount;i++)
{
String fd=dataset->Fields->Fields[i]->FieldName;
TField *zd=dataset->FieldByName(fd);
String zdv=zd->AsString+tab;
fs->Write((void *)zdv.c_str(),zdv.Length());
}
fs->Write((void *)lf.c_str(),lf.Length());
dataset->Next();
}
dataset->GotoBookmark(SavePlace);
dataset->FreeBookmark(SavePlace);
dataset->EnableControls();
delete fs;
}
zzbinfo 2010-10-25
  • 打赏
  • 举报
回复
用这种ole的就是慢,用第三方控件试试,如果数据量太大的话存成csv文件,各个字段用逗号格开
周药师 2010-10-25
  • 打赏
  • 举报
回复
XLSReadWrite操作excel很快的
你用XLSReadWrite控件试试
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。   Bootcfg   bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。   含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。   用法:   bootcfg /default  设置默认引导项。   bootcfg /add    向引导列表中添加 Windows 安装。   bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。   注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。   bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。   注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。   bootcfg /list   列出引导列表中已有的条目。   bootcfg /disableredirect 在启动引导程序中禁用重定向。   bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]   在启动引导程序中通过指定配置启用重定向。   范例: bootcfg /redirect com1 115200 bootcfg /redirect useBiosSettings   hkdsk   创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。   含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。   vol [drive:] [ chkdsk [drive:] [/p] [/r]   参数  无   如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。   注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart   创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。   diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]   参数 无   如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。   /add   创建新的分区。   /delete   删除现有分区。   device_name   要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:   DeviceHardDisk0   drive_name   以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:   D:   partition_name   以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:   DeviceHardDisk0Partition1    大小   要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。   范例   下例将删除分区: diskpart /delete Device HardDisk0 Partition3 diskpart /delete F:   下例将在硬盘上添加一个 20 MB 的分区:   diskpart /add Device HardDisk0 20   Fixboot

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧