Python中如何将数据库的数据写入Excel并导出

写入 excel 用的是 xlsxwriter 包,当每次导出的数据量较大的时候(可能是 50w-100W 行之间),生成的 excel 文件就会出现打不开的情况,提示需要修复文件,修复完也无法打开;
之后又尝试使用 openpyxl 包,还是一样的打不开文件;
有大佬可以帮忙解答这个问题吗?
Python中如何将数据库的数据写入Excel并导出

16 回复

你的 excel 是有固定格式嘛, 如果没有固定格式的话 append 到一个 csv 里面吧


这个问题很常见,用pandas配合openpyxlxlsxwriter库就能轻松搞定。下面是一个完整的例子,假设你用SQLAlchemy连接数据库。

import pandas as pd
from sqlalchemy import create_engine

# 1. 建立数据库连接 (这里以SQLite为例,其他数据库替换连接字符串即可)
# 格式:'数据库类型+驱动://用户名:密码@主机:端口/数据库名'
engine = create_engine('sqlite:///example.db')  # 连接SQLite文件

# 2. 用pandas直接执行SQL查询,结果就是DataFrame
query = "SELECT * FROM your_table_name"  # 替换为你的表名和查询条件
df = pd.read_sql_query(query, engine)

# 3. 将DataFrame写入Excel文件
output_file = 'output_data.xlsx'
df.to_excel(output_file, index=False, engine='openpyxl')  # index=False不写入行索引

print(f"数据已成功导出到: {output_file}")

关键点说明:

  • pandas.read_sql_query:核心函数,直接执行SQL并把结果转为DataFrame。
  • to_excelindex=False很重要,否则会多出一列索引。
  • engine='openpyxl':指定写入引擎,处理.xlsx格式。

如果你用的是其他数据库,比如MySQL或PostgreSQL:

# MySQL示例
engine = create_engine('mysql+pymysql://user:password@localhost/db_name')

# PostgreSQL示例  
engine = create_engine('postgresql://user:password@localhost/db_name')

更灵活的控制(比如指定工作表名、格式):

with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
    df.to_excel(writer, sheet_name='Sheet1', index=False)
    # 可以继续写入多个DataFrame到不同sheet
    # df2.to_excel(writer, sheet_name='Sheet2', index=False)

用pandas就对了,简单省事。

Excel 单个工作表的上限大约是 104 万行,但一般不建议做那么大的,不能分割么?超过上限的肯定打不开,大文件的话可以试试 64 位的 Excel。

excel 有最大行限制。
试一下用 csv 格式?

先用 navicate 导出成 excel 看看能不能打开,不能的话就不是包的问题了

这行数也太多了吧,试一下用 HDF5 ?

没有固定的格式,我尝试过使用 pandas 的 to_csv 方法直接生成 csv 文件,也打不开

应该是没有超过 EXCEL 上限的,使用的是 2013 版的 office,数据量也是控制在 100 万以下。

试了 csv 也不行

我们是 SQLserver 的数据库,用 SQLserver 导出是可以打开的

你是用什么程序去打开 csv 的?

只能使用 excel 表格的格式,其他格式的业务部门用不了

用的是 office 打开的

解决不了,只能找微软了。
EXCEL 文件超过 40M 大小可靠性就变得非常不好了。很容易丢损坏丢数据。

如果是带中文的数据,csv 编码 gbk 或者用数据–导入来添加( 13 以上版本可能需要添加传统向导),不直接双击。有些时候中文版的 Excel 直接双击打开会把 UTF-8 编码的中文数据乱码掉,然后导致行数判断失败,就不停的要修复但是修复不成功。

另外,这么大的数据量用 Excel 真的不合适。

先尝试把 Excel 切成几个小文件。再读取呢?

回到顶部