Python 使用 xlwt 模块将多行多列数据循环写入 Excel 文档的操作

Jasper
Jasper
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何使用 Python 的 xlwt 模块,通过循环方式将多行多列数据高效写入 Excel 文档。文章提供了完整的代码示例,展示了如何解析 XML 数据并提取主机名与 IP 地址,利用 xlwt 的 write 方法逐行逐列写入数据,最终保存为 xls 格式文件。

Python xlwt 写入 Excel 核心代码实现

直接查看以下代码实现部分。


#!/usr/bin/python
# -*- coding: utf-8 -*-

import xlwt
import re

def host_regex(dataline):
 host_regex = r"<host>(.*?)</host>"
 host = re.findall(host_regex, dataline)
 if host:
  return host[0]

def ip_regex(dataline):
 ip_regex = r"<ip>(.*?)</ip>"
 ip = re.findall(ip_regex, dataline)
 if ip:
  return ip[0]

with open("zbx_export_hosts.xml", "r", encoding="utf8") as f:
 lines = f.readlines()
 alldatas = []
 hostlist = []
 iplist = []
 for line in lines:
  host = host_regex(line)
  ip = ip_regex(line)

  if host is not None:
   hostlist.append(host)
  if ip is not None:
   iplist.append(ip)
 hosts_ip = []
 # 构造数据结构,形如:[[a,b],[c,d],...]
 multi_list = map(list, zip(hostlist, iplist))
 for multi in multi_list:
  hosts_ip.append(multi)
 workbook = xlwt.Workbook()
 worksheet = workbook.add_sheet('test')
 # 关键代码
 for hi in enumerate(hosts_ip):
  for num in range(len(hi[1])):
   # 行、列、值
   worksheet.write(hi[0], num, hi[1][num])

 workbook.save('excelwrite.xls')

注意:代码中存在少量冗余行,为保持逻辑清晰未做删除处理。

Python 写入 xlsx 大量数据的问题与优化

补充知识:关于通过 Python 写入 xlsx 格式大量数据的问题探讨。

以往批量生成数据文件时,通常通过 C 程序直接按逗号分隔方式写入文本文件并保存为 csv 格式。然而,部分业务人员习惯使用 xls 格式查看数据表,因此提出需求进行改造。对于数据量小于 100w 的情况,要求将报表格式统一改为 xlsx 文件。

考虑到报表文件处理的便捷性,决定采用 Python 实现。起初使用了 openpyxl 库,该库提供强大的 xlsx 读写 API,能方便地实现读写操作。但在实际测试中发现,处理大行数 xlsx 文件时内存占用极高,例如 8 个字段、50w 行数据在运行过程中内存占用高达 10G,这超出了应用服务器的承受能力。

为此寻求优化方案,经查阅资料发现,openpyxl 在创建 xlsx 表时指定 write_only 参数是处理大数据写入的官方解决方案。以下引用官网范例:启用此参数后,无法通过 ws.cell(row=i, column=j).value = ? 的方式赋值,只能使用 append 方式追加行。关于设置只写模式下的单元格样式,可参考官网文档。

openpyxl write_only 模式示例


>>> from openpyxl import Workbook
>>> wb = Workbook(write_only=True)
>>> ws = wb.create_sheet()
>>>
>>> # now we'll fill it with 100 rows x 200 columns
>>>
>>> for irow in range(100):
...  ws.append(['%d' % i for i in range(200)]) #可以先将一行的数据写在一个list中,直接ws.append(list)
>>> # save the file
>>> wb.save('new_big_file.xlsx') # doctest: +SKIP

然而,仅按上述范例修改 write_only 参数后,发现内存占用并未缓解。仔细阅读官网说明后发现关键提示:“When you want to dump large amounts of data make sure you have lxml installed.” 原来 openpyxl 安装时并未将 lxml 作为强依赖,它只是一个可选包。经查证,服务器上确实未安装 lxml 包。

为解决此问题,先在测试环境安装 lxml,但安装过程并不顺利。

首先需要安装 libxml2 和 libxslt。由于没有 root 权限,均需通过源码安装且只能安装在用户目录。需要注意的是,libxml2 安装时需指定 --with-python='python 安装目录',而 libxslt 安装时需指定 libxml2 的安装目录。

最后安装 lxml 时也存在较多坑点,主要在于指定 libxml2 和 libxslt 的路径。安装 lxml 时,先执行 python3 setup.py build_ext -i -I${libxml2includepath} -L${libxml2libpath} -I${libxsltincludepath} -L${libxsltlibpath},再执行 python3 setup.py install。

全部安装完成后,openpyxl 写入 xlsx 不再显著增加内存。数据先写入 tmp 目录的一个临时文件,待调用 save 方法时再保存为正式文件。

此外,在解决此问题的过程中,还了解到 writexlsx 库也可处理大文件 xlsx 的写入,且安装依赖较少,非常推荐且简洁,官网有详细介绍。

操作大文件时,指定 {'constant_memory': True} 即可。

writexlsx 大文件处理示例


filename = 'test.xlsx'
wb = xlsxwriter.Workbook(filename, {'constant_memory': True})
ws = wb.add_worksheet('大文件')
i = 0
data= []
data.append('中文')
data.append(1323)
data.append('abc')
ws.write_row(i, 0, data)
i = i + 1
wb.close() #直接关闭即可,不需要额外save

以上关于 Python 使用 xlwt 模块将多行多列数据循环写入 Excel 文档的操作即为全部内容,希望能对大家有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。