📊 Excel 文件全景手册:从“单元格”到“xlsx 底层结构”一次看懂!

88 阅读4分钟

打开就是表格?
其实 .xlsx 是一个 ZIP 压缩包 + XML 数据库 + 样式仓库 + 公式引擎 的综合体!
今天 10 分钟,带你拆完 Excel 文件格式 → 读写库 → 性能技巧 → 自动化案例🔧

微信图片_20251014151033_10_20.jpg

1️⃣ Excel 文件格式家谱:一眼认全👨‍👩‍👧‍👦

后缀年代本质特性
.xls1997-2003二进制复合文档(BIFF)行限 65k,列限 256,体积大,已淘汰🗿
.xlsx2007+ZIP + XML(OpenXML)行 1,048,576,列 16,384,默认压缩 50%
.xlsm2007+同 xlsx + VBA 宏可运行宏,安全警告⚠️
.xlsb2007+二进制压缩(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️⃣ 行、列、单元格极限速查📏

版本最大行最大列单格字符单工作表单元格总数
.xlsx1,048,57616,384 (XFD)32,767~1.7 百亿
.xls65,536256 (IV)32,7671,677 万

超过极限?→ Power BI / CSV / 数据库 分表/分区☁️


4️⃣ 公式与函数:Excel 的“灵魂引擎”⚙️

  • 公式= 开头,存纯字符串在 XML,打开时才计算→结果缓存在单元格
  • 函数 > 500 个,分类:
财务   → IRR、NPV
逻辑   → IF、ANDOR
文本   → LEFT、MID、TEXTJOIN
查找   → VLOOKUP、XLOOKUP、INDEX/MATCH
数学   → SUMIFS、AGGREGATE
动态数组 → UNIQUEFILTER、SORT(Office 365)🚀

新宠:LET + LAMBDA → 自定义函数可递归📈


5️⃣ 样式 & 主题:单元格化妆间💄

  • 六件套:数字格式、对齐、字体、边框、填充、保护
  • 条件格式:色阶、数据条、图标集(基于公式)
  • 主题:一键换全局配色,保证视觉一致性🌈

6️⃣ Python 读写库全景:选哪个?🐍

优点缺点场景
pandas一行读写,DataFrame 生态样式/宏丢失数据分析、ETL
openpyxl纯 Python,支持 样式/公式/图表慢,大文件内存高报表自动化、模板填充
xlsxwriter写功能极强,图表、宏、格式全支持只写服务器生成报告
xlrd/xlwt老库轻量.xls 或旧 .xlsxlegacy 兼容
pyxlsb专门读 .xlsb 二进制只读超大数据提速
win32com调用真实 Excel COMWindows+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避免单表爆格
存 .xlsbdf.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 大数据起飞!**🛫