用C#实现将多个EXCEL文件合并成一个文件

小驴来这里学习 2012-02-10 10:49:38
我最开始的想法是,将每个excel文件的每个工作表复制到一个新的excel文件当中。
也许是我的方法不对,怎么都实现不了。
然后我换了一种做法,将每个excel文件的每个工作表的内容读出来,依次插入到新的excel文件当中。
这样做的问题是,文件比较大时,效率非常低,而且操作的时候,cpu会到接近100%。

希望大家可以给我提供一些建议。
...全文
2038 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅得_被人砍 2014-06-08
  • 打赏
  • 举报
回复
还是没达到我想要的
一剑枯荣 2013-07-01
  • 打赏
  • 举报
回复
路过学习了,呵呵,谢谢!!
nonocast 2012-02-13
  • 打赏
  • 举报
回复
做不了的
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gaind 的回复:]

12楼的方法是用Microsoft.Office.Interop.Excel.dll 这个COM组件来读取的
在64位机器上可行,但是32位机器上,这个速度会非常慢,32位机器建议用Microsoft.Jet.OLEDB.4.0
[/Quote]
用Microsoft.Jet.OLEDB.4.0怎么做?
nonocast 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gaind 的回复:]

12楼的方法是用Microsoft.Office.Interop.Excel.dll 这个COM组件来读取的
在64位机器上可行,但是32位机器上,这个速度会非常慢,32位机器建议用Microsoft.Jet.OLEDB.4.0
[/Quote]

32bit会非常慢,为什么这样说,常理来说之前在32bit下操作word,powerpoint都很ok,不解为什么这样说
但如果和oledb比起来那是差几个数量级,不过oledb应该做不到lz的功能,纯属个人理解
夏脑 2012-02-13
  • 打赏
  • 举报
回复
利用Office COM
  • 打赏
  • 举报
回复
Thanks
朕赐你肥皂 2012-02-13
  • 打赏
  • 举报
回复
12楼的方法是用Microsoft.Office.Interop.Excel.dll 这个COM组件来读取的
在64位机器上可行,但是32位机器上,这个速度会非常慢,32位机器建议用Microsoft.Jet.OLEDB.4.0
nonocast 2012-02-13
  • 打赏
  • 举报
回复
我这里装的是Office 2007
nonocast 2012-02-13
  • 打赏
  • 举报
回复
http://nonocast.cn/?p=2376
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nonocast 的回复:]

我试着写了一下,感觉这个速度还是可以的,不到万不得已不去碰OPC
[/Quote]
非常感谢你能花时间帮助我。
上面的代码我用的时候会提示我“XX方法没有采用X个参数的重载”,可不可以把引入命名空间的部分也贴出来,这样我好确认我是不是引入了错误的命名空间。
nonocast 2012-02-13
  • 打赏
  • 举报
回复
搞定了?
  • 打赏
  • 举报
回复
我刚刚在你的博客里看到这篇了,谢谢你。
nonocast 2012-02-13
  • 打赏
  • 举报
回复
至少要了解Package格式
http://nonocast.cn/?p=2262
然后Relation
小复杂,之前做XPS的时候我也是直接操作OPC,不过没有Relation,庆幸啊
  • 打赏
  • 举报
回复
刚刚发了。
如果用OPC,我需要了解哪些东西呢?
nonocast 2012-02-13
  • 打赏
  • 举报
回复
如果速度很敏感,那考虑用OPC呗,嘿嘿
你能把excel samples发给我测一下吗,nonocast@gmail.com
  • 打赏
  • 举报
回复


打开一个文件要1分零3秒。
nonocast 2012-02-12
  • 打赏
  • 举报
回复
我试着写了一下,感觉这个速度还是可以的,不到万不得已不去碰OPC

static void Main(string[] args) {
Excel.Application app = new Excel.Application();

Excel._Workbook result = app.Workbooks.Add();
Excel._Workbook wb1 = app.Workbooks.Open(Path.GetFullPath("./Sources/Source1.xlsx"));
Excel._Workbook wb2 = app.Workbooks.Open(Path.GetFullPath("./Sources/Source2.xlsx"));

foreach (Excel._Worksheet each in wb1.Sheets) {
each.Copy(result.Worksheets[1]);
}

foreach (Excel._Worksheet each in wb2.Sheets) {
each.Copy(result.Worksheets[1]);
}

result.SaveAs(@"c:\result.xlsx");

Console.WriteLine("press any key to exit.");
Console.ReadLine();

wb1.Close();
wb2.Close();
app.Quit();
}
nonocast 2012-02-12
  • 打赏
  • 举报
回复
如果文件很大,要求很高的时候,建议你直接操作excel文件
excel文件格式属于OPC,.NET中的System.IO.Packaging可以对应OPC操作
直接操作OPC可以解决你所有问题,关键是要仔细应对那些relation
  • 打赏
  • 举报
回复
尝试用C#操作EXCEL的宏来做,还是很慢很慢。
加载更多回复(9)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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