打开就是表格?
其实.xlsx是一个 ZIP 压缩包 + XML 数据库 + 样式仓库 + 公式引擎 的综合体!
今天 10 分钟,带你拆完 Excel 文件格式 → 读写库 → 性能技巧 → 自动化案例🔧
1️⃣ Excel 文件格式家谱:一眼认全👨👩👧👦
| 后缀 | 年代 | 本质 | 特性 |
|---|---|---|---|
.xls | 1997-2003 | 二进制复合文档(BIFF) | 行限 65k,列限 256,体积大,已淘汰🗿 |
.xlsx | 2007+ | ZIP + XML(OpenXML) | 行 1,048,576,列 16,384,默认压缩 50% |
.xlsm | 2007+ | 同 xlsx + VBA 宏 | 可运行宏,安全警告⚠️ |
.xlsb | 2007+ | 二进制压缩(BIFF12) | 读写更快,体积更小,大数据首选🚀 |
.xlst / .xml | - | 纯 XML(SpreadsheetML) | 无压缩,人眼可读,适合服务器流式生成 |
2️⃣ xlsx 底层揭秘:把 Excel 改后缀→解压就能看到!🪛
cp book.xlsx book.zip
unzip book.zip -d book_xml
tree book_xml
book_xml/
├── [Content_Types].xml ← 全局内容类型
├── _rels/ ← 关系描述
├── xl/
│ ├── workbook.xml ← 工作簿/工作表列表
│ ├── worksheets/
│ │ └── sheet1.xml ← 真正单元格数据
│ ├── styles.xml ← 字体/颜色/边框
│ ├── sharedStrings.xml ← 字符串去重池(省空间)
│ └── theme/ ← 主题颜色
└── docProps/ ← 作者/创建时间/最后保存者
结论:Excel = 小型文件数据库 + 样式引擎 + 关系索引📦
3️⃣ 行、列、单元格极限速查📏
| 版本 | 最大行 | 最大列 | 单格字符 | 单工作表单元格总数 |
|---|---|---|---|---|
.xlsx | 1,048,576 | 16,384 (XFD) | 32,767 | ~1.7 百亿 |
.xls | 65,536 | 256 (IV) | 32,767 | 1,677 万 |
超过极限?→ Power BI / CSV / 数据库 分表/分区☁️
4️⃣ 公式与函数:Excel 的“灵魂引擎”⚙️
- 公式以
=开头,存纯字符串在 XML,打开时才计算→结果缓存在单元格 - 函数 > 500 个,分类:
财务 → IRR、NPV
逻辑 → IF、AND、OR
文本 → LEFT、MID、TEXTJOIN
查找 → VLOOKUP、XLOOKUP、INDEX/MATCH
数学 → SUMIFS、AGGREGATE
动态数组 → UNIQUE、FILTER、SORT(Office 365)🚀
新宠:LET + LAMBDA → 自定义函数可递归📈
5️⃣ 样式 & 主题:单元格化妆间💄
- 六件套:数字格式、对齐、字体、边框、填充、保护
- 条件格式:色阶、数据条、图标集(基于公式)
- 主题:一键换全局配色,保证视觉一致性🌈
6️⃣ Python 读写库全景:选哪个?🐍
| 库 | 优点 | 缺点 | 场景 |
|---|---|---|---|
| pandas | 一行读写,DataFrame 生态 | 样式/宏丢失 | 数据分析、ETL |
| openpyxl | 纯 Python,支持 样式/公式/图表 | 慢,大文件内存高 | 报表自动化、模板填充 |
| xlsxwriter | 写功能极强,图表、宏、格式全支持 | 只写 | 服务器生成报告 |
| xlrd/xlwt | 老库轻量 | 仅 .xls 或旧 .xlsx | legacy 兼容 |
| pyxlsb | 专门读 .xlsb 二进制 | 只读 | 超大数据提速 |
| win32com | 调用真实 Excel COM | Windows+Office 独占 | 复杂 VBA、一键打卡 |
7️⃣ pandas 极速读写:一行搞定📈
import pandas as pd
# 读
df = pd.read_excel('sale.xlsx',
sheet_name='2024',
usecols=['日期', '销售额'],
dtype={'销售额': float},
parse_dates=['日期'])
# 写(带索引、样式丢不了)
df.to_excel('out.xlsx',
sheet_name='report',
index=False,
engine='openpyxl') # 也可 'xlsxwriter'
大表 → read_excel(..., engine='calamine') Rust 后端,2 倍提速⚡️
8️⃣ openpyxl 样式实战:模板填充🎨
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
ws = wb.active
ws.append(['产品', 'Q1', 'Q2'])
ws.append(['A', 100, 120])
# 标题行加粗+背景色
for cell in ws[1]:
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill('solid', fgColor='4F81BD')
cell.alignment = Alignment(horizontal='center')
wb.save('styled.xlsx')
9️⃣ 性能黑科技:别让 Excel 拖垮服务器🚀
| 技巧 | 说明 | 代码 |
|---|---|---|
| 只读模式 | openpyxl.load_workbook(..., read_only=True) | 流式迭代,内存↓10 倍 |
| 批量写 | xlsxwriter write_row() | 逐行→逐单元格快 5 倍 |
| 分 sheet | >50 万行拆多 sheet | 避免单表爆格 |
| 存 .xlsb | df.to_excel('big.xlsb', engine='pyxlsb') | 体积↓50%,读↑3 倍 |
| 别用 VLOOKUP | 改用 INDEX/MATCH 或 Power Query | 计算提速 10 倍+ |
🔟 自动化场景:一键日报/月报📧
# 1. 凌晨跑 SQL → DataFrame
# 2. DataFrame → Excel(含透视表+图)
# 3. 邮件发出
from datetime import date
import win32com.client as win32 # 需 Windows+Outlook
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'boss@company.com'
mail.Subject = f'销售日报 {date.today()}'
mail.Attachments.Add(os.path.abspath('report.xlsx'))
mail.Send()
无 Windows?SMTP + pandas + xlsxwriter 同样稳📬
1️⃣1️⃣ Excel ≠ 数据库:临界点提醒⚠️
| 量级 | 建议 |
|---|---|
| < 10 MB / < 20 万行 | Excel 毫无压力 |
| 10-50 MB | 考虑 Power Query 流式加载 |
| > 50 MB / > 100 万行 | 上 Power BI、数据库、CSV/Parquet |
🏁 一句话总结(背它!)
“.xlsx = ZIP + XML 小型数据库”
**pandas 读写最快,openpyxl 管样式,xlsxwriter 造报告,.xlsb 大数据起飞!**🛫