#include"xlsxwriter.h"#include<time.h>#include<stdio.h>// 模拟温度数据结构typedef struct { char timestamp[32]; // 时间戳 float temperature; // 温度值 int status; // 状态:0-正常,1-警告,2-报警} TempRecord;// 模拟生成温度数据voidgenerate_temp_data(TempRecord *records, int count){ time_t now = time(NULL); for (int i = 0; i < count; i++) { // 生成时间戳 time_t t = now - (count - i) * 10; // 每10秒一条 struct tm *tm_info = localtime(&t); strftime(records[i].timestamp, 32, "%Y-%m-%d %H:%M:%S", tm_info); // 生成温度值(模拟20-80度之间的波动) records[i].temperature = 35.0f + (float)(rand() % 450) / 10.0f; // 根据温度设置状态 if (records[i].temperature < 50.0f) { records[i].status = 0; // 正常 } else if (records[i].temperature < 70.0f) { records[i].status = 1; // 警告 } else { records[i].status = 2; // 报警 } }}intmain(){ // 模拟100条温度数据 const int RECORD_COUNT = 100; TempRecord records[RECORD_COUNT]; generate_temp_data(records, RECORD_COUNT); // 创建工作簿 lxw_workbook *workbook = workbook_new("temperature_report.xlsx"); // ========== 创建各种格式 ========== // 标题格式:大号、粗体、蓝色背景 lxw_format *title_format = workbook_add_format(workbook); format_set_bold(title_format); format_set_font_size(title_format, 16); format_set_bg_color(title_format, LXW_COLOR_BLUE); // Excel蓝 format_set_font_color(title_format, LXW_COLOR_WHITE); format_set_align(title_format, LXW_ALIGN_CENTER); format_set_align(title_format, LXW_ALIGN_VERTICAL_CENTER); // 表头格式:粗体、灰色背景 lxw_format *header_format = workbook_add_format(workbook); format_set_bold(header_format); format_set_bg_color(header_format, LXW_COLOR_GRAY); format_set_border(header_format, LXW_BORDER_THIN); format_set_align(header_format, LXW_ALIGN_CENTER); // 普通数据格式 lxw_format *data_format = workbook_add_format(workbook); format_set_border(data_format, LXW_BORDER_THIN); format_set_align(data_format, LXW_ALIGN_CENTER); // 温度数字格式:保留1位小数 lxw_format *temp_format = workbook_add_format(workbook); format_set_border(temp_format, LXW_BORDER_THIN); format_set_align(temp_format, LXW_ALIGN_CENTER); format_set_num_format(temp_format, "0.0"); // 警告格式:黄色背景 lxw_format *warning_format = workbook_add_format(workbook); format_set_border(warning_format, LXW_BORDER_THIN); format_set_bg_color(warning_format, LXW_COLOR_YELLOW); format_set_align(warning_format, LXW_ALIGN_CENTER); format_set_num_format(warning_format, "0.0"); // 报警格式:红色背景、白色字体 lxw_format *alarm_format = workbook_add_format(workbook); format_set_border(alarm_format, LXW_BORDER_THIN); format_set_bg_color(alarm_format, LXW_COLOR_RED); format_set_font_color(alarm_format, LXW_COLOR_WHITE); format_set_align(alarm_format, LXW_ALIGN_CENTER); format_set_num_format(alarm_format, "0.0"); // 统计格式:粗体、绿色 lxw_format *stat_format = workbook_add_format(workbook); format_set_bold(stat_format); format_set_font_color(stat_format, LXW_COLOR_GREEN); format_set_align(stat_format, LXW_ALIGN_CENTER); // ========== 数据表工作表 ========== lxw_worksheet *data_sheet = workbook_add_worksheet(workbook, "温度数据"); // 设置列宽 worksheet_set_column(data_sheet, 0, 0, 20, NULL); // 时间列 worksheet_set_column(data_sheet, 1, 1, 12, NULL); // 温度列 worksheet_set_column(data_sheet, 2, 2, 12, NULL); // 状态列 // 写入标题 worksheet_merge_range(data_sheet, 0, 0, 0, 2, "温度监控数据报表", title_format); worksheet_set_row(data_sheet, 0, 30, NULL); // 设置行高 // 写入表头 worksheet_write_string(data_sheet, 2, 0, "时间", header_format); worksheet_write_string(data_sheet, 2, 1, "温度(°C)", header_format); worksheet_write_string(data_sheet, 2, 2, "状态", header_format); // 写入数据 float sum = 0, max_temp = 0, min_temp = 100; int warning_count = 0, alarm_count = 0; for (int i = 0; i < RECORD_COUNT; i++) { int row = i + 3; // 根据状态选择格式 lxw_format *current_format = data_format; const char *status_str = "正常"; if (records[i].status == 1) { current_format = warning_format; status_str = "警告"; warning_count++; } else if (records[i].status == 2) { current_format = alarm_format; status_str = "报警"; alarm_count++; } // 写入数据 worksheet_write_string(data_sheet, row, 0, records[i].timestamp, data_format); worksheet_write_number(data_sheet, row, 1, records[i].temperature, current_format); worksheet_write_string(data_sheet, row, 2, status_str, data_format); // 统计计算 sum += records[i].temperature; if (records[i].temperature > max_temp) max_temp = records[i].temperature; if (records[i].temperature < min_temp) min_temp = records[i].temperature; } float avg_temp = sum / RECORD_COUNT; // 添加空行 int stat_row = RECORD_COUNT + 4; // 写入统计信息 worksheet_write_string(data_sheet, stat_row, 0, "统计信息", header_format); worksheet_merge_range(data_sheet, stat_row, 0, stat_row, 2, "", header_format); worksheet_write_string(data_sheet, stat_row + 1, 0, "平均温度", data_format); worksheet_write_number(data_sheet, stat_row + 1, 1, avg_temp, stat_format); worksheet_write_string(data_sheet, stat_row + 1, 2, "°C", data_format); worksheet_write_string(data_sheet, stat_row + 2, 0, "最高温度", data_format); worksheet_write_number(data_sheet, stat_row + 2, 1, max_temp, stat_format); worksheet_write_string(data_sheet, stat_row + 2, 2, "°C", data_format); worksheet_write_string(data_sheet, stat_row + 3, 0, "最低温度", data_format); worksheet_write_number(data_sheet, stat_row + 3, 1, min_temp, stat_format); worksheet_write_string(data_sheet, stat_row + 3, 2, "°C", data_format); worksheet_write_string(data_sheet, stat_row + 4, 0, "警告次数", data_format); worksheet_write_number(data_sheet, stat_row + 4, 1, warning_count, stat_format); worksheet_write_string(data_sheet, stat_row + 4, 2, "次", data_format); worksheet_write_string(data_sheet, stat_row + 5, 0, "报警次数", data_format); worksheet_write_number(data_sheet, stat_row + 5, 1, alarm_count, stat_format); worksheet_write_string(data_sheet, stat_row + 5, 2, "次", data_format); // 添加自动筛选 worksheet_autofilter(data_sheet, 2, 0, RECORD_COUNT + 2, 2); // ========== 图表工作表 ========== lxw_worksheet *chart_sheet = workbook_add_worksheet(workbook, "温度趋势图"); // 创建图表 lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_LINE); chart_title_set_name(chart, "温度变化趋势"); chart_set_size(chart, 800, 400); // 添加数据系列 lxw_chart_series *series = chart_add_series(chart, "=温度数据!$A$4:$A$103", // X轴:时间 "=温度数据!$B$4:$B$103"); // Y轴:温度 chart_series_set_name(series, "温度(°C)"); // 设置Y轴范围 chart_set_y_axis(chart, 15, 85, 10); // 插入图表 worksheet_insert_chart(chart_sheet, 1, 1, chart); // ========== 保存并关闭 ========== workbook_close(workbook); printf("报表生成成功:temperature_report.xlsx\n"); printf("共 %d 条数据\n", RECORD_COUNT); printf("平均温度:%.1f°C\n", avg_temp); printf("最高温度:%.1f°C\n", max_temp); printf("最低温度:%.1f°C\n", min_temp); return 0;}