好久没有更新,今天看到有信息邀请泛舟回答这样睇问题:
python实现多个Excel表格合并为同一个表格的不同sheet,并且将sheet名字命名为原表名?
Ps:知乎竟然把相关问题关了,真无语。
这个就是一个跨文件复制Sheet 的问题,在泛舟能力理解之内,python 的包例如openpyxl是接近无解的.当然可以强行一个一个数据复制,但还有格式一样复制过去,十分麻烦.
相反,用win32com 接口,就方便很多,就是一句命令的问题.
泛舟刚刚好近来在能这个Excel方面的,于是写了以下代码.
泛舟把原问题做了简化处理,泛舟的代码是这样的:获取指定文件夹内的所有文件列表, 新建一个Excel文件,根据文件列表判断,如果是excel文件,则复制第一张Sheet,插入新建表,再改名为读取文件的文件名,然后一直循环到读取完所有表,然后保存新建表.
泛舟这里简化了原来问题,原来问题如果一个Excel 文档有多个表格的情况,没有处理,如果按原来的表名重命名,那么重复表名,也没有处理,这个留个各位读者自己想办法完善.
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 14 12:02:42 2019
python 调用 win32com 处理 excel 文件
@author: 浩海泛舟
"""
import win32com.client as 包_win32工具
import os as 包_系统工具
def 方法_获取文件目录(文件路径):
文件集 = 包_系统工具.listdir(文件路径)
return 文件集
def 方法_跨文件复制表(文件路径,文件集):
excel工具 = 包_win32工具.Dispatch('Excel.Application')
excel工具.visible = 1 # 此行设置打开的Excel表格为可见状态;忽略则Excel表格默认不可见
目标文件 = excel工具.Workbooks.Add() #新建立excel文件
目标表_集合 = 目标文件.Worksheets
for 文件名 in 文件集:
文件名分解 = 文件名.split('.')
print(文件名分解)
if 文件名分解[-1] == 'xlsx' or 文件名分解[-1] == 'xls':
文件 = excel工具.Workbooks.Open(文件路径 + ''+ 文件名)
表_集合 = 文件.Worksheets
表_集合(1).Copy(None,目标表_集合(1)) #跨表复制,插入第一个表之后,记得 Copy 首字母大写
目标表_集合(2).Name = 文件名分解[0] #由于新表总是在第二个表,所以第二个表改名就可了.
文件.Close(SaveChanges=0)
else:
pass
目标文件.SaveAs(文件路径 + r'处理后的文件.xlsx')
目标文件.Close(SaveChanges=0)
def 方法_主程序(文件路径):
文件集 = 方法_获取文件目录(文件路径)
方法_跨文件复制表(文件路径,文件集)
return
if __name__ == '__main__':
文件路径 = r"你的文档路径"
方法_主程序(文件路径)
【效果视频】
感谢你的阅读,望勿喷.