Python导出MYSQL数据表格(XLSX)后,使用openpyxl无法读取文件

Python导出MYSQL数据表格(XLSX)后,使用openpyxl无法读取文件,提示File is not a zip file。网上查过由于不是保存为真正的XLSX文件导致,请问如何使用Python导出MYSQL的数据为真正有效的XLSX文件?

你先自己创建一个excel试运行代码能否成功,如果成功,那就是你导出的excel有问题了

官方文档上有:xlwt is a library for writing data and formatting information to older Excel files (ie: .xls)。xlwt是一个对旧的excel文件格式xls文档进行读写及格式化信息等操作。所以代码中用xlwt写的文件实际上是一个xls文件。.xls 是二进制的复合文档类型的结构;.xlsx 是用新的基于XML的压缩文件格式,因不是xlsx格式文件,所以在读取时报错“文件不是压缩格式文件”。解决方法,不要用xlwt将数据写入表格,直接使用openpyxl写成xlsx文件。推荐办法是用pandas从数据库中读取表格数据为数据框,df=read_sql(),操作数据后,用df.to_excel保存。

明显是你代码的问题,你python 导出的是个zip 文件而不是excel

导出数据库的代码如下:
conn = pymysql.connect(
host='localhost',
user='root',
passwd='******',
db='*****',
port=3306,
charset='utf8'
)
def read_mysql_to_xlsx(filename):
list_table_head = ['ID','订单号','创建时间','订单状态','商户名称']
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('详情', cell_overwrite_ok=True)
for i in range(len(list_table_head)):
sheet.write(0, i, list_table_head[i])

cur = conn.cursor()
sql = 'select * from 202107'
results = query_all(cur, sql, None)
conn.commit()
cur.close()
conn.close()
row = 1
for result in results:
    col = 0
    print(type(result))
    print(result)
    for item in result:
        print(item)
        sheet.write(row, col, item)
        col += 1
    row += 1
workbook.save(filename)

if name == 'main':
read_mysql_to_xlsx('D:\outputfiles\202107.xlsx')

读取导出表格代码如下:
from openpyxl import load_workbook
df = pd.read_excel(r'D:\outputfiles\202107.xlsx',sheet_name='详情',engine='openpyxl')

book = load_workbook(r'D:\outputfiles\202107.xlsx')
writer = pd.ExcelWriter(r'D:\outputfiles\202107.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

sheet0 = book.create_sheet(title='复核',index=0,)
sheet0['A1'] = 'XXXX'
sheet0['A3'] = 'XXXX:'
sheet0['B3'] = df['商户名称'].values[0]
sheet0['A4'] = '所属月份:'
df.to_excel(writer, sheet_name='详情', startcol=0, startrow=0, index=False, header=True)
wbsheet = book['详情']
namelist = '详情'
writer.save()

看到你说openpyxl 我就猜到原因了

xlwt 支持的是Microsoft Excel versions 95 2003. (也就是xls)
openpyxl 支持的Microsoft Excel versions 2007 (也就是xlsx)

解决办法也很简单,

  1. 如果坚持使用xlwt 生成excel 文件,就使用xlwt 来读取
  2. 如果要使用openpyxl 读取,那就把生成excel的工库改从xlwt改为openpyxl

换句话说:

openpyxl(xlsx) == xlwt + xlwt (xls)