请选择 进入手机版 | 继续访问电脑版
楼主: cwjcw81
1739 3

使用xlwings合并同一目录下的Excel [推广有奖]

  • 1关注
  • 2粉丝

博士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
7223 个
通用积分
28.1875
学术水平
4 点
热心指数
7 点
信用等级
5 点
经验
9902 点
帖子
121
精华
0
在线时间
294 小时
注册时间
2014-12-1
最后登录
2024-2-2

cwjcw81 在职认证  发表于 2020-2-15 20:58:15 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. 其实合并同一目录下的多个Excel文件,理论上用VBA是最好的,因为可以在复制粘贴的时候连格式一起,用python不好的地方就在于要把格式一起复制过去是很困难的。
  2. 当然如果对格式没什么太高的要求,那么使用xlwings合并Excel就绝对是一个很好的选择了
  3. 以下是实现代码,考虑到了excel内有多个sheet和标题行只需要复制一次的情况。

  4. import xlwings as xw
  5. import os
  6. # 以上是导入两个必要的库,xlwings用来操作excel,os用来遍历文件夹
  7. # 代码能运行的大前提是所有的excel的sheet数量是相同的,且每个sheet的字段都是相同的

  8. app = xw.App(visible=False,add_book=False)
  9. # 打开Excel,如果visible用false,则只在后台运行,add_book用false,不会新建一个空白的工作簿

  10. # 先要遍历文件夹
  11. path = r'd:\1' # 定义路径,OS提供了两种遍历文件夹的办法
  12. # 例子中,文件夹1内有excel文件若干和一个子文件夹

  13. # files1 = os.listdir(path)
  14. # # 这是第一种,会遍历路径下所有文件包括子文件夹,结果以列表给出,但仅仅能给出文件名/子文件名,无法对二者进行区分
  15. # # for file in files1:
  16. # #     print(os.path.join(path,file))

  17. files2 = os.walk(path)
  18. # 这是第二种,通过walk函数,返回root(路径),dirs(子目录),files(文件名)三个元组,本例中我们用walk来遍历
  19. def summary():
  20.     for root , dirs , files in os.walk(path):
  21.         for f in range(len(files)): # 遍历文件夹的设定到此结束,下面要开始使用xlwings进行调用
  22.             wb = app.books.open(os.path.join(root,list(files)[f])) # 打开excel工作表
  23.             sheet_count = wb.sheets.count # 查看wb里面一共有多少sheets,为遍历wb里的sheets做准备
  24.             if f == 0: # 考虑到标题行,直接将第一个打开的工作簿另存为新工作簿
  25.                 wb.save(path + '\\' + 'new.xlsx') # 将第一个打开的wb另存为一个新的工作簿new.xlsx用于汇总
  26.                 wb.close() # 关闭wb
  27.             else: # 当第二个工作簿打开的时候
  28.                 newwb = app.books.open(path + '\\' + 'new.xlsx') # 先把新建的汇总工作簿打开
  29.                 for s in range(sheet_count): # 开始遍历sheets
  30.                     sht = wb.sheets[s]
  31.                     nrow = sht.used_range.last_cell.row # 定义源工作簿中最后一行
  32.                     ncol = sht.used_range.last_cell.column # 定义源工作簿中最后一列
  33.                     newrow = newwb.sheets[s].range('A65536').end('up').row # 定义目标工作簿中最后一行
  34.                     newwb.sheets[s].range('A'+str(newrow+1)).value = sht.range((2,1),(nrow,ncol)).value
  35.                     # 将“源工作簿”中要复制的内容赋值给“目标工作簿”
  36.                 newwb.save(path + '\\' + 'new.xlsx') # sheets遍历结束后,保存源工作簿
  37.                 wb.close()
  38.                 # newwb.close() # 将打开的工作簿关闭,进入下一个循环
  39.         app.quit() # 退出Excel
  40. summary()
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分经验 收起 理由
cheetahfly + 100 精彩帖子

总评分: 经验 + 100   查看全部评分

hubert18 发表于 2020-2-16 10:56:07 |显示全部楼层 |坛友微信交流群
65536应改成1048576吧。

使用道具

cwjcw81 在职认证  发表于 2020-2-16 21:47:35 |显示全部楼层 |坛友微信交流群
hubert18 发表于 2020-2-16 10:56
65536应改成1048576吧。
嗯,这其实只是一个最基础的东西,肯定不可能直接copy,需要改的。

使用道具

wxz0716 发表于 2020-2-17 08:06:05 |显示全部楼层 |坛友微信交流群
感谢分享!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 09:12