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