Python 之 Excel 表格常用操作
示例文件 test.xlsx
将各个表单拆分成单独的 Excel 文件
import os.path
import openpyxl
import pandas
def handle_excel(file_path):
dirname = os.path.dirname(file_path)
basename = os.path.basename(file_path).split(".")[0]
wb = openpyxl.load_workbook(file_path)
sheet_names = wb.sheetnames
print(sheet_names)
for sheet_name in sheet_names:
sheet_info = pandas.read_excel(file_path, dtype='str', sheet_name=sheet_name)
new_file_path = os.path.join(dirname, f"{basename}_{sheet_name}.xlsx")
print(new_file_path)
sheet_info.to_excel(new_file_path, index=False)
if __name__ == '__main__':
file_path = os.path.join(os.getcwd(), "test.xlsx")
handle_excel(file_path)
['Sheet1', 'Sheet2']
E:\lky_project\tmp_project\test_project\test_Sheet1.xlsx
E:\lky_project\tmp_project\test_project\test_Sheet2.xlsx
数据分组后按分组结果生成多个 Excel
import os.path
import openpyxl
import pandas
def handle_excel(file_path):
dirname = os.path.dirname(file_path)
basename = os.path.basename(file_path).split(".")[0]
wb = openpyxl.load_workbook(file_path)
sheet_names = wb.sheetnames
print(sheet_names)
sheet_name = sheet_names[1]
sheet_info = pandas.read_excel(file_path, dtype='str', sheet_name=sheet_name)
group_info = sheet_info.groupby("省份")
for key, value in group_info:
print(key, value)
new_file_path = os.path.join(dirname, f"{basename}_{sheet_name}_{key}.xlsx")
print(new_file_path)
value.to_excel(new_file_path, index=False)
if __name__ == '__main__':
file_path = os.path.join(os.getcwd(), "test.xlsx")
handle_excel(file_path)
['Sheet1', 'Sheet2']
四川
序号 省份 月份 金额
0 1 四川 1 10
1 2 四川 2 20
E:\lky_project\tmp_project\test_project\test_Sheet2_四川.xlsx
陕西
序号 省份 月份 金额
2 3 陕西 1 30
E:\lky_project\tmp_project\test_project\test_Sheet2_陕西.xlsx
对 Excel 有效使用区域进行截图保存
import os.path
import xlwings
from PIL import ImageGrab, Image
from xlwings._xlwindows import COMRetryObjectWrapper, App
from win32com.client import DispatchEx
def handle_excel(file_path):
_xl = COMRetryObjectWrapper(DispatchEx("ket.Application"))
impl = App(visible=False, add_book=False, xl=_xl)
app = xlwings.App(visible=False, add_book=False, impl=impl) # 如果运行中不想看到打开 Excel 的操作,设置 visible 为 False
wb = app.books.open(file_path)
sheet = wb.sheets["Sheet1"]
all = sheet.used_range # 获取表格数据使用范围
# all = sheet.range("Sheet1!$A$1:$E$4") # 带表单名称
# all = sheet.range("$A$1:$E$4") # 也可以自定义数据范围,通过对角元素的坐标进行范围限定
print(all)
all.api.CopyPicture() # 复制使用范围
sheet.api.Paste() # 粘贴
pic = sheet.pictures[0] # 获取当前图片
pic.api.Copy() # 复制图片到剪切板
img = ImageGrab.grabclipboard() # 获取剪切板的图片数据
x, y = img.size
p = Image.new('RGBA', img.size, (255, 255, 255)) # 重新设置背景颜色,不然背景是透明的
p.paste(img, (0, 0, x, y), img) # 将截图粘贴到图片对象
p.save("test.png") # 图片保存
pic.delete() # 删除 sheet 表单粘贴的图片,避免截图影响 Excel 原始数据
# wb.save() # 保存退出
wb.close()
app.quit()
if __name__ == '__main__':
file_path = os.path.join(os.getcwd(), "test_Sheet2_四川.xlsx")
handle_excel(file_path)
当然,也可以自定义数据截图范围。
上传文件自动选择
这个和 Excel 没有关系,夹带的私货。
在打开的 windows 窗口自动选择文件并确认
import os.path
import time
import win32con
import win32gui
# 自动选择文件并确认
def file_upload(file):
retry_times = 3
while retry_times > 0:
time.sleep(3)
dialog = win32gui.FindWindow('#32770', '打开')
if dialog:
break
retry_times -= 1
time.sleep(3)
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindowEx(dialog, 0, 'Button', None)
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, file)
time.sleep(1)
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
time.sleep(1)
return True
if __name__ == '__main__':
file = os.path.join(os.getcwd(), "test.txt")
print(file)
file_upload(file)
pip 本地安装依赖包出现 ERROR: No matching distribution found for 报错时:
pip install --no-build-isolation --no-index --find-links=./ fairscale