python操作excel

需求

某网站导出的excel表需要先变换格式才能整合进新表。

每次都要手动:取消单元格合并->筛选->升序排列->删除多余列。

处理前

修改前

处理后

修改后

让程序来做这些枯燥而重复的工作!

考虑到vba只能对单个excel执行,而c++库太少,python有丰富现成的库,所以选择python作为实现语言。

过程:

①读取文件路径作为变量。

②拆分带有合并的单元格。

③A6~AH14范围内,按A6升序排列。

④删除多余列。

⑤保存并退出。

面向过程,当脚本使用。

代码如下:

filename : dataProcess.py

import xlwings as xw
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()

root.withdraw()
f_path = filedialog.askopenfilename()
print('\n获取的文件地址:',f_path)

app = xw.App(visible=True, add_book=False)
# app.display_alerts = False
app.screen_updating =True


wb = app.books.open(f_path)
sht1 = wb.sheets[0]  # 按索引获取工作表

# #拆分单元格
sht1.range('A1:AH14').api.UnMerge()

# 排序A6~AH14范围内,按A6来排序
sht1.range('A6:AH14').api.Sort(Key1=sht1.range('A6').api, Order1=1, Orientation=1)

# 删除多余列
sht1.range('B1').api.EntireColumn.Delete()
sht1.range('C1:H1').api.EntireColumn.Delete()
sht1.range('D1:I1').api.EntireColumn.Delete()
sht1.range('E1:G1').api.EntireColumn.Delete()
sht1.range('F1:J1').api.EntireColumn.Delete()
sht1.range('G1:M1').api.EntireColumn.Delete()

sht1 = wb.sheets.active

wb.save()
wb.close()
app.quit()

input("按<Enter>键退出")

其他

因为需要移植到其他电脑上也可以使用,使用pyinstaller将dataProcess.py文件打包为exe可执行文件,让无python环境的主机也能运行。

pyinstaller .\dataProcecss.py
  • -F 指定生成单一文件
  • -w 生成的exe执行不显示终端
  • -c 生成的exe执行显示终端
  • -i 指定.ico文件,作为该exe文件的图标

此时会在当前目录下生成build和dist文件夹,还有dataProcess.spec文件。

pyinstaller不打包第三方库(xlwings),需要自己手动修改dataProcess.spec文件,来追加。

1.查找第三方xlwins包位置

pip show xlwings

image-20221002083109393

2.在dataProcess.spec文件的data里面追加。

('C:\\Users\\ezhonghu\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\site-packages\\xlwings','.')

image-20221002083220531

windows下的路径需要把单斜杠改为双斜杠

3.追加打包

pyinstaller .\dataProcess.py