stock-backend / app /utils /export.py
fromozuzhouzzz
Initial commit
fed8648
Raw
History Blame Contribute Delete
3.13 kB
import csv
import io
from datetime import datetime
from flask import send_file
import xlsxwriter
from flask import current_app
def export_to_csv(data, headers):
"""导出数据到CSV文件"""
output = io.StringIO()
writer = csv.writer(output)
writer.writerow(headers)
for row in data:
writer.writerow([row.get(header.lower().replace(' ', '_')) for header in headers])
output.seek(0)
return send_file(
io.BytesIO(output.getvalue().encode('utf-8')),
mimetype='text/csv',
as_attachment=True,
download_name=f'export_{datetime.now().strftime("%Y%m%d_%H%M%S")}.csv'
)
def export_to_excel(data, headers, sheet_name='Sheet1'):
"""导出数据到Excel文件"""
try:
# 创建一个内存中的Excel文件
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet(sheet_name)
# 设置表头格式
header_format = workbook.add_format({
'bold': True,
'align': 'center',
'valign': 'vcenter',
'fg_color': '#D7E4BC',
'border': 1
})
# 设置数据格式
data_format = workbook.add_format({
'align': 'left',
'valign': 'vcenter',
'border': 1
})
# 写入表头
for col, header in enumerate(headers):
worksheet.write(0, col, header, header_format)
worksheet.set_column(col, col, 15) # 设置列宽
# 写入数据
for row, item in enumerate(data, start=1):
for col, header in enumerate(headers):
try:
# 确保数据类型正确
value = item.get(header, '')
if isinstance(value, (int, float)):
worksheet.write_number(row, col, value, data_format)
else:
worksheet.write_string(row, col, str(value), data_format)
except Exception as e:
current_app.logger.error(f"Error writing cell [{row},{col}]: {str(e)}")
worksheet.write_string(row, col, str(value), data_format)
workbook.close()
output.seek(0)
# 设置响应头
response = send_file(
output,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
as_attachment=True,
download_name=f'inventory_{datetime.now().strftime("%Y%m%d_%H%M%S")}.xlsx'
)
# 添加CORS头
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
response.headers.add('Access-Control-Expose-Headers', 'Content-Disposition')
return response
except Exception as e:
current_app.logger.error(f"Error in export_to_excel: {str(e)}")
raise