如何把多个Excel文件合并成一个Excel文件(特急!!!)

时间:2022-09-25 19:56:07
所有Excel文件的数据结构相同,现想把所有数据合并到一个Excel文件里,请问如何编写程序?由于文件数量非常大(可能上千个),每个文件有几百行数据,故需考虑性能问题.十万火急!!!请高手指点!

16 个解决方案

#1


可以把这些Excel文件做为数据库文件,然后遍历记录,插入到一个工作表内.
一般是采用ole方式,但如果数据超过2000条就不要采用这种方式了.
只要把数据取出来,然后放到文本里面.
然后利用Excel把文本数据读进来.

#2


我试过把多个Excel文件的数据全部读出到StringGrid里,然后再把StringGrid的数据导出到Excel,但速度很慢,假设三个文件(每个有300行,15列),时间就需要5分钟.

#3


再好代码示范

#4


最好有代码示范

#5


代码不好写,思路倒有:
 lurel(城市陌生人) 兄说的不错,把所有记录先合并到一个数据库表中,再从这张表 ole 到 Excel 中就可以了,数据格式一样,在数据库中操作很方便嘛!

#6


不知你是都插入到一个sheet里面还是一个文件插入一个sheet,如果插入到一个sheet,注意excel有65535行数限制。

思路如下:
OLE操作(可以参见ccrun老妖网站);打开一个excel A,打开要插入的B,获取行数,建立rang,复制,到A中粘贴,打开C获取行数,建立rang,复制,设置A中起始单元格,粘贴……

用rang操作比一行一行的读取写入要快的多

 lurel(城市陌生人) 的方法应该也可以

#7


谢lvjack提醒
能否一个sheet到了65535后剩余的自动插入到下一个sheet

#8


请问如何复制rang和粘贴rang

#9


1.能否一个sheet到了65535后剩余的自动插入到下一个sheet
自己根据读到的行数计算
2.请问如何复制rang和粘贴rang等等事宜详见老妖写的OLE操作Excel
老妖没有写到的自己用Excel录制一下宏然后根据宏的代码改写为OLE操作的代码

#10


lvjack说的思路比较可行
但我想知道如何操作rang的复制和粘贴

#11


老妖的文章http://www.ccrun.com/article/go.asp?i=635&d=g75jbn

#12


老妖的文章没有写到如何操作rang的复制和粘贴

#13


我代码中的一部分(粘贴的),你自己参考,另外仔细看看Excel中录制的宏,把我的代码改改就作出复制的了

#define   PG   OlePropertyGet
#define   PS   OlePropertySet
#define   FN   OleFunction
#define   PR   OleProcedure
//-------------------------------------

  rng="A"+AnsiString(row+2);
  vExcel.Exec(PropertyGet("Range")<<rng.c_str()).Exec(Procedure("Select"));
  Clipboard()->SetTextBuf(sl->Text.c_str());
  vExcel.PG("ActiveSheet").PR("Paste");

#14


用ADOConnection吧.

#15


用OLE太慢了!个人建议还是先都转成文本文件,然后合并,然后。。。

#16


对了,用ADOConnection也好了

#1


可以把这些Excel文件做为数据库文件,然后遍历记录,插入到一个工作表内.
一般是采用ole方式,但如果数据超过2000条就不要采用这种方式了.
只要把数据取出来,然后放到文本里面.
然后利用Excel把文本数据读进来.

#2


我试过把多个Excel文件的数据全部读出到StringGrid里,然后再把StringGrid的数据导出到Excel,但速度很慢,假设三个文件(每个有300行,15列),时间就需要5分钟.

#3


再好代码示范

#4


最好有代码示范

#5


代码不好写,思路倒有:
 lurel(城市陌生人) 兄说的不错,把所有记录先合并到一个数据库表中,再从这张表 ole 到 Excel 中就可以了,数据格式一样,在数据库中操作很方便嘛!

#6


不知你是都插入到一个sheet里面还是一个文件插入一个sheet,如果插入到一个sheet,注意excel有65535行数限制。

思路如下:
OLE操作(可以参见ccrun老妖网站);打开一个excel A,打开要插入的B,获取行数,建立rang,复制,到A中粘贴,打开C获取行数,建立rang,复制,设置A中起始单元格,粘贴……

用rang操作比一行一行的读取写入要快的多

 lurel(城市陌生人) 的方法应该也可以

#7


谢lvjack提醒
能否一个sheet到了65535后剩余的自动插入到下一个sheet

#8


请问如何复制rang和粘贴rang

#9


1.能否一个sheet到了65535后剩余的自动插入到下一个sheet
自己根据读到的行数计算
2.请问如何复制rang和粘贴rang等等事宜详见老妖写的OLE操作Excel
老妖没有写到的自己用Excel录制一下宏然后根据宏的代码改写为OLE操作的代码

#10


lvjack说的思路比较可行
但我想知道如何操作rang的复制和粘贴

#11


老妖的文章http://www.ccrun.com/article/go.asp?i=635&d=g75jbn

#12


老妖的文章没有写到如何操作rang的复制和粘贴

#13


我代码中的一部分(粘贴的),你自己参考,另外仔细看看Excel中录制的宏,把我的代码改改就作出复制的了

#define   PG   OlePropertyGet
#define   PS   OlePropertySet
#define   FN   OleFunction
#define   PR   OleProcedure
//-------------------------------------

  rng="A"+AnsiString(row+2);
  vExcel.Exec(PropertyGet("Range")<<rng.c_str()).Exec(Procedure("Select"));
  Clipboard()->SetTextBuf(sl->Text.c_str());
  vExcel.PG("ActiveSheet").PR("Paste");

#14


用ADOConnection吧.

#15


用OLE太慢了!个人建议还是先都转成文本文件,然后合并,然后。。。

#16


对了,用ADOConnection也好了