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)
解决办法也很简单,
换句话说:
openpyxl(xlsx) == xlwt + xlwt (xls)