告别Excel崩溃和公式错误!这个skill神器让你像用计算器一样操作表格
还在为Excel公式不计算、日期变数字、格式错乱而抓狂?这个开源项目能让你用Python安全地读写Excel,保留所有公式和样式,就像有个不知疲倦的助手帮你处理表格。
📗 项目亮点
✨ 公式活字典:写入的公式会自动计算,还能保留引用关系
📅 日期不迷路:自动处理Excel奇葩的1900年闰日bug,日期显示不再是一串数字
🎨 格式全保留:字体、颜色、合并单元格、批注,原来啥样还啥样
🔄 双向兼容:既能读也能写,CSV和Excel格式无缝切换
💪 防崩溃机制:编辑大型表格不会因为一个错误就全盘重来

你遇到过这些Excel噩梦吗?
小张是公司的运营专员,每个月都要处理销售报表。上个月,他花了整整一个下午,手动修改了2000多行数据的日期格式,结果保存后第二天打开,所有日期又变成了“45231”这样的数字。
更崩溃的是,当他试图用Python的pandas来处理这些数据时,公式全丢了。老板要的那个“环比增长率”列,本来是公式自动算的,结果导出后成了静态数字,再也没法自动更新。
还有一次,小张想给表格加个简单的备注列,用openpyxl改了3行代码,运行后整个工作簿的样式全乱了,连公司Logo的颜色都变了。
你是不是也遇到过类似的情况?用pandas处理Excel,公式没了;用Excel直接改,几百个文件改到想哭;用openpyxl手写代码,稍微复杂一点就报错。

这个项目能帮你做什么?
这个Excel/XLSX工具包,本质上是一个“最佳实践指南”。它不让你重复造轮子,而是告诉你:什么时候该用pandas,什么时候该用openpyxl,以及怎么用才能不踩坑。
简单说,它把Excel操作分成了三类场景:
🔹 数据分析和清洗:用pandas,快得很🔹 需要保留公式和格式:用openpyxl,稳得很🔹 简单的CSV导入导出:直接Python内置csv模块就够了
这样一来,你再也不用担心用错工具导致表格崩坏了。
手把手教程:5分钟上手
➤ 第一步:安装必备库
打开终端,复制下面这行代码:
pip install openpyxl pandas
openpyxl是处理Excel格式的主力,pandas负责数据运算,两个搭配干活不累。
➤ 第二步:读取现有表格并保留公式
假设你有一个销售报表“sales.xlsx”,里面C列是“销售额”,D列是“成本”,E列是公式“=C2-D2”。
传统方法用pandas读取:
import pandas as pddf = pd.read_excel(‘sales.xlsx’)print(df[‘E列’]) # 输出的是计算后的数值,公式没了
用openpyxl保留公式的方法:
from openpyxl import load_workbook
wb = load_workbook(‘sales.xlsx’)ws = wb.active
print(ws[‘E2’].value) # 输出 ‘=C2-D2’,公式还在!print(ws[‘E2’].value) # 如果你要计算后的值,用ws[‘E2’].value就好了
是不是很简单?openpyxl既能读到公式文本,也能获取计算后的数值。
➤ 第三步:写入公式并保持引用关系
常见错误:直接把计算结果写进单元格
ws[‘F2’] = 1000 # 这是魔法数字,别人看不懂来源
正确做法:写入公式,引用其他单元格
ws[‘F2’] = ‘=C2*0.1’ # 提成 = 销售额 * 10%ws[‘G2’] = ‘=SUM(E2:F2)’ # 总利润 = 利润 + 提成
这样,当C2的销售额改变时,F2和G2会自动重算,不需要你手动改任何数字。
➤ 第四步:正确处理日期
Excel的日期是个大坑。它把日期存成数字(比如2024年1月1日存成45292),还保留了1900年的闰日bug(Excel认为1900年2月29日存在,实际不存在)。
如果你直接用pandas读,可能会得到45292这样的数字。
解决方案:让openpyxl帮你转换
from openpyxl import load_workbook
wb = load_workbook(‘sales.xlsx’, data_only=False) # data_only=False保留公式ws = wb.active
方法1:读取时直接获取日期对象
date_cell = ws[‘A2’]if date_cell.data_type == ‘d’:actual_date = date_cell.value # 这里已经是datetime对象了print(actual_date.strftime(‘%Y-%m-%d’))
方法2:写入日期时用Python的datetime
from datetime import datetimews[‘B2’] = datetime(2024, 3, 15) # openpyxl自动转成Excel日期数字并应用正确格式
➤ 第五步:保留原有格式和样式
这是最让人头疼的部分。很多人用openpyxl改完表格,发现字体、颜色、合并单元格全乱了。
核心原则:不要覆盖整个单元格,只修改你需要改的值。
错误示范:
for row in ws.iter_rows():for cell in row:if cell.column == 3: # 修改C列cell.value = new_value # 这样会清空原有格式!
正确做法:
from openpyxl.styles import PatternFill
for row in ws.iter_rows():for cell in row:if cell.column == 3:
先保存原有样式
original_fill = cell.filloriginal_font = cell.font
修改值
cell.value = new_value
恢复样式
cell.fill = original_fillcell.font = original_font
如果你只是要改数值,用pandas做计算,然后用openpyxl逐个单元格更新,效率反而更高且安全。
➤ 完整实战:修改销售报表并保留所有内容
from openpyxl import load_workbookfrom datetime import datetime
1. 加载工作簿
wb = load_workbook(‘sales_report.xlsx’)ws = wb.active
2. 在最后一行添加汇总
last_row = ws.max_row + 1ws[f’A{last_row}’] = ‘总计’ws[f’B{last_row}’] = datetime.now() # 自动生成当天日期ws[f’C{last_row}’] = f’=SUM(C2:C{last_row-1})’ # 销售额总计ws[f’D{last_row}’] = f’=SUM(D2:D{last_row-1})’ # 成本总计ws[f’E{last_row}’] = f’=C{last_row}-D{last_row}’ # 总利润
3. 保存文件(原格式、原公式全部保留)
wb.save(‘sales_report_updated.xlsx’)
运行完这段代码,你会得到一个带汇总行的新表格,而且原有的字体、颜色、合并单元格、批注全都没变。

同类项目对比
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
简单总结:
-
纯数据分析:用pandas,快就完事了 -
需要保留公式和样式:用openpyxl,但要注意方法 -
日常办公自动化:用这个工具包的建议,两种工具混着用

写在最后
Excel操作之所以让人头疼,是因为大多数人不知道“什么时候该用哪个工具”。pandas快但没格式,openpyxl全能但容易踩坑。
这个项目就像一张Excel操作地图,告诉你每条路通向哪里,哪里有坑。你不需要记住所有细节,只需要知道:要算数据找pandas,要保格式找openpyxl,两者结合才是王道。
下次再被Excel折磨,试试先问问自己:我要的是数值结果,还是活的工作簿?答案会告诉你该用哪个工具。
项目地址:https://clawic.com/skills/excel-xlsx
记住这个黄金法则:让Excel做Excel擅长的事(计算、展示),让Python做Python擅长的事(批量处理、逻辑判断)。
夜雨聆风