如何使用Python代码创建表格

发布时间:2026/10/11 21:53:48

如何使用Python代码创建表格 前言很多初学者看到「用 Python 创建表格」这个说法会犯嘀咕Python 语言本身并没有一种叫「表格」的内置类型。list、tuple、dict、set 都是数据结构它们能装数据但不会自己变成一张有行列、有边框的表格。所以这个题目的真实含义是——用 Python 生成一个「表格文件」比如 Excel 的工作簿、Word 里的表格或者 HTML 的 table 元素。本文把范围限定在最常见的场景用 Python 代码创建一个 Excel 表格文件.xlsx。这个场景同时牵扯「数据结构」和「文件格式」两件事是最容易踩坑的地方。还有一个非常普遍的误解以为装上某个库之后就能读写所有 Excel 文件。实际上.xlsExcel 97-2003 的旧二进制格式与.xlsx2007 年之后的 OOXML 格式是两种完全不同的东西底层一个是 OLE 复合文档、一个是 zip 压缩的 XML 包用错库会直接抛异常。本文先讲清格式差异再给出可以照着敲的代码骨架。还要提醒一句网上不少 Excel 自动化的老教程是 Python 2 时代的产物。Python 2.7 已于 2020 年 1 月 1 日停止维护而如今这些表格处理库的新版本早已不再支持 Python 2。照抄老代码时会遇到print x这种语句写法Python 3 里必须写成print(x)、dict.iteritems()这类已被移除的方法Python 3 用.items()以及xrangePython 3 里range本身就是惰性的。看到这些写法请直接按 Python 3 改写不要试图装回 Python 2。需要提前说明Excel 相关的库都是第三方库必须先安装本机没有装任何第三方库因此下面的代码是按官方文档逐行推演的骨架具体参数与返回值以 openpyxl 官方文档为准。一、「表格」的三种含义先分清楚同一个词在不同语境里指向完全不同的东西选错工具白忙一场你想要的「表格」落地的文件/格式常用库关键限制数据表二维数据.xlsx / .xls / .csvopenpyxl、xlrd、csvopenpyxl 只认 xlsx带排版的文档表格.docxpython-docx「行列」是排版概念网页里的表格HTML 的 table 元素模板引擎或字符串拼接是文本不是二进制CSV 其实只是一行行逗号分隔的纯文本它没有单元格样式、没有多个工作表、也没有公式严格说它不算「表格文件」只是一张二维数据的平面铺开。如果你只关心数据本身CSV 就够了一旦需要多个 sheet、公式、合并单元格、数据验证就必须上 xlsx。二、xlsx 的本质一个 zip 压缩的 XML 包这一点必须先建立直觉后面所有的坑都源于它。OOXML 系列文件.xlsx、.docx、.pptx本质上都是 ZIP 容器里面按固定目录结构存放若干 XML 部件。openpyxl 官方教程里就有一句原话OOXML 文件本质上是 ZIP 文件你也可以用任意解压工具打开它。一个 .xlsx 解开之后大致是这样xl/workbook.xml 工作簿结构有哪些工作表、顺序如何xl/worksheets/sheet1.xml 第一张工作表的单元格数据xl/sharedStrings.xml 共享字符串池重复文本只存一份xl/styles.xml 字体、填充、边框等样式[Content_Types].xml 各部件的内容类型声明理解了这一点三个结论就顺理成章不能用普通的文本方式读写 xlsx。它不是文本文件open(a.xlsx, w)会把文件写坏。改一行数据不需要重算整张表。但反过来说任何库把整个工作簿加载进内存再整体写回代价都和文件大小成正比。同样是「Excel 文件」扩展名不同则内部结构完全不同所以库的适用范围被卡得很死。三、选库点名的三种各自负责什么库能读能写是否需要本机装 Excel说明openpyxl.xlsx / .xlsm.xlsx / .xlsm不需要纯 Python 实现最常用xlrd仅 .xls新版本已弃读 xlsx不能不需要老 .xls 专用维护状态不佳xlwings.xlsx 等.xlsx 等必须装它驱动真实的 Excel 进程其中 xlwings 的定位一定要拎清它不是「更快的 openpyxl」而是「用 Python 遥控一个真实的 Excel 程序」。官方文档写得很明确——xlwings 开源版需要本机安装 Excel因此只能在 Windows 和 macOS 上工作。它适合需要真实 Excel 计算引擎、需要跑宏、需要所见即所得地操作界面的场景纯数据处理用它反而是绕远路。四、写代码创建一个最简单的表格下面是创建并保存一个 xlsx 的最小骨架。第一行注释标了适用版本后面每个代码块同样如此。# 适用于 Python 3.8# 需要先安装pip install openpyxl# 具体参数与返回值以 openpyxl 官方文档为准from openpyxl import Workbook# 新建工作簿。Workbook() 一定自带至少一个工作表wb Workbook()# 取当前活动工作表默认是索引 0 的那一张ws wb.active# 给工作表改名名字在同一个工作簿内必须唯一ws.title 销售汇总# 按 A1 记号写入行用字母、列用数字ws[A1] 商品ws[B1] 数量# 按行列号写入row 与 column 都是 1 起算ws.cell(row2, column1, value苹果)ws.cell(row2, column2, value30)# 保存。文件不存在就新建存在就被覆盖官方文档明确说不会警告wb.save(销售汇总.xlsx)要点有三个。第一Workbook()新建出来的工作簿永远已经含有一张工作表不需要自己先建。第二单元格两种写法等价ws[B2]与ws.cell(row2, column2)指向同一个格子只是前者更直观、后者便于循环。第三wb.save()只接受合法的 xlsx/xlsm 扩展名写成.xls会得到一个打不开的文件。五、批量写入把二维数据装进表格手工一个个写单元格毫无意义真实场景都是从列表或字典批量灌数据。ws.append()按行追加是效率最高的写法# 适用于 Python 3.8# 需要先安装pip install openpyxl# 具体参数与返回值以 openpyxl 官方文档为准from openpyxl import Workbookrows [(姓名, 部门, 工时),(张三, 研发, 168),(李四, 测试, 152),(王五, 运维, 176),]wb Workbook()ws wb.activews.title 工时表# append 接收一个序列按顺序写到当前最后一行的下一行for row in rows:ws.append(row)# 列宽是纯显示属性不设也能存ws.column_dimensions[A].width 12wb.save(工时表.xlsx)print(已写出共, ws.max_row, 行)如果数据量很大几十万行量级openpyxl 提供了写入优化的模式# 适用于 Python 3.8# 需要先安装pip install openpyxl# 具体参数与返回值以 openpyxl 官方文档为准from openpyxl import Workbook# write_only 模式内存占用低但限制很多wb Workbook(write_onlyTrue)# 注意写模式的新工作簿不含任何工作表必须自己建ws wb.create_sheet(大表)for i in range(1000):ws.append([i, i * 2, i * 3])wb.save(大表.xlsx)官方文档对写模式列了三条硬限制务必记住新建的 write_only 工作簿不含工作表必须用 create_sheet() 自己建行只能用append()添加不能用cell()或iter_rows()定位写入而且一个写模式工作簿只能保存一次保存后再save()或append()会抛WorkbookAlreadySaved异常。常见坑点搞错行列起点写出 A0❌ws[A0] 1或ws.cell(row0, column0)——xlsx 的行列号从 1 开始0 不是合法坐标。 ✅ws[A1] 1、ws.cell(row1, column1, value1)行列一律 1 起算。用 openpyxl 去读老的 .xls❌openpyxl.load_workbook(旧表.xls)直接报错因为 openpyxl 只处理 OOXML 格式。 ✅ 先确认文件真实格式.xls属旧二进制格式.xlsx才是 OOXML。要么用能读 xls 的库要么先用 Excel 另存为 xlsx。扩展名和真实格式不一致时比如把 xls 改名成 xlsx同样会失败。原地覆盖正在用的文件❌wb.save(已有报表.xlsx)直接覆盖原文件。官方文档明确说这个操作不会警告一旦中途出错原文件和数据一起没了。 ✅ 先存成新文件名确认内容无误后再人工替换批量脚本里给输出文件加上时间戳前缀。没赋值就把整片区域「扫」一遍❌ 用for row in ws[A1:Z1000]之类的方式遍历一大片空白区域会把每个格子都真正创建出来内存白白涨上去。官方文档专门警告过这一点。 ✅ 只访问真正有数据的范围例如用ws.iter_rows(values_onlyTrue)并配合ws.max_row、ws.max_column限定边界。在 write_only 模式里用常规写法❌wb Workbook(write_onlyTrue)之后直接ws wb.active或者用ws[A1] 1定位写入。 ✅ 写模式必须ws wb.create_sheet(名字)行只能用ws.append(...)且整个工作簿只能保存一次。以为 CSV 和 xlsx 可以随便互换❌ 把带多个工作表、带公式、带合并单元格的表格「另存为 CSV」再交给 Python 处理结果多出来的 sheet、公式结果、样式全丢了。 ✅ 明确数据用途只要纯数据且单表用标准库 csv 就够需要多表、公式、样式就老老实实用 xlsx 库。把样式和数据的写入顺序搞反❌ 先wb.save()再想给单元格补样式发现改的是内存对象文件里没有变化。 ✅ 所有单元格值与样式的修改都在内存里完成后最后一次性wb.save()。已经写出的文件要改就得重新打开、修改、再保存。照抄 Python 2 时代的老教程❌ 从旧教程里抄print 已保存、dict.iteritems()、xrange(10)这类写法在 Python 3 下要么语法错误、要么属性不存在。 ✅ 一律改写成 Python 3 的等价写法print(...)、.items()、range(...)并确认所用库的当前版本是否还支持你本机的 Python 版本。总结要做的事推荐做法关键提醒生成新 xlsxopenpyxl 的Workbook()默认自带一张工作表批量灌数据ws.append(序列)行从 1 起算只追加不定位超大文件写入Workbook(write_onlyTrue)须 create_sheet只能保存一次读旧 .xls换合适的库或先另存openpyxl 不认 xls驱动真实 Excelxlwings本机必须有 Excel一句话总结Python 里「创建表格」不是一个函数调用而是「选对格式、选对库、按行列号写入、最后整体保存」这一串动作。先把 xlsx 其实是 zip 包这件事装进脑子绝大多数格式类报错都能自己解释清楚而所有第三方库的具体参数与返回值请以各自官方文档为准。
延伸阅读

更多相关文章

2026/10/11 21:53:48

如何利用Python提取pdf中的表格数据(附实战案例)

前言 用 Python 从 PDF 里抠表格,是自动化办公里最容易「预期落空」的一项任务。很多人上手前的预期是:装一个库,调用一个「提取表格」的方法,拿到一个干净的二维数组。真实情况是——提取出来的东西常常串行、错列、把两列合成一…

2026/10/11 21:48:48

大模型时代的具身智能:VLA模型、本地部署与落地避坑指南

简介:这份《大模型时代的具身智能》PDF报告面向人工智能、机器人方向的研究者与学习者,系统梳理了具身智能从古至今的发展脉络与核心技术框架。内容从公元前9世纪偃师造人、阿基塔斯蒸汽飞鸟、达芬奇人形机器人草图讲起,串联1961年Unimate、1…

2026/10/11 21:48:48

基于MCP架构的YOLO远程训练系统:自然语言控制实战指南

简介:基于MCP架构的YOLO训练系统是一套面向目标检测开发者的分布式训练解决方案,核心亮点在于通过客户端-服务器模式将单机YOLO训练拆分为可协作的服务端与客户端组,并利用消息通信协议完成数据与指令传递。用户无需精通编程,可直…

2026/10/11 22:54:16

智能赛车道红绿灯图像分类实战:光照突变与小目标鲁棒性方案

简介:本资源是面向计算机视觉初学者与智能交通项目开发者的红绿灯图像分类数据集,专为训练轻量级分类模型(如YOLOv5分类头)设计,解决智能赛车道场景下交通信号识别的实操需求。数据集共2000个文件,含1998张…

2026/10/11 22:54:16

前端必知:Node.js模块系统、包管理与自动化脚本实战指南

Node.js 这个词,前端圈子里几乎天天挂在嘴边。但真正把它的来龙去脉讲清楚的人,说实话不多。我自己带过不少前端新人,发现一个很普遍的现象:大家会用 npm install 装包,会用 vite 启动项目,但一旦问到“nod…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑