news 2026/5/15 19:25:14

C#中使用MiniExcel 快速入门:读写 .xlsx 文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#中使用MiniExcel 快速入门:读写 .xlsx 文件

背景介绍

报表绕不开 Excel。传统方案用 Microsoft.Office.Interop,需要安装 Office,且进程管理复杂。MiniExcel是一个轻量级库(< 1MB),通过直接操作 ZIP 压缩包(.xlsx 本质是 ZIP)实现读写,无需 Office 环境,支持 .NET Core / .NET Framework。

本篇覆盖:

  • 基本读写(DataTable / List ⇄ Excel)
  • 写入优化(避免内存膨胀)
  • 样式设置(列宽、行高、背景色)

代码实现

1. 安装与基础读写

dotnetaddpackage MiniExcel
usingMiniExcelLibs;// ===== 读 Excel =====publicvoidReadExcel(){// 读取整个 sheetvarrows=MiniExcel.Query("report.xlsx").ToList();// 读取指定 sheetvarrows2=MiniExcel.Query("report.xlsx",sheetName:"Sheet2").ToList();// 读取为 DataTable(便于筛选)vardt=MiniExcel.QueryAsDataTable("report.xlsx");foreach(DataRowrowindt.Rows){Console.WriteLine($"{row["DeviceId"]}-{row["Value"]}");}}// ===== 写 Excel =====publicvoidWriteSimpleExcel(){vardevices=new[]{new{DeviceId="INJ001",Temperature=85.5,Pressure=1.2},new{DeviceId="INJ002",Temperature=82.3,Pressure=1.1}};// 最简单写法:List 直接写MiniExcel.SaveAs("output.xlsx",devices);// 指定 sheet 名MiniExcel.SaveAs("output.xlsx",devices,sheetName:"生产数据");}

2. 写入优化:分批写入大文件

publicvoidWriteLargeFile(stringfilePath,IEnumerable<ReportRow>rows){// MiniExcel 默认会把所有数据加载到内存// 大数据量时需要分批处理varbatchSize=5000;varbatch=newList<ReportRow>();using(varstream=File.Create(filePath)){boolfirstBatch=true;foreach(varrowinrows){batch.Add(row);if(batch.Count>=batchSize){if(firstBatch){// 第一批:创建文件 + 写入表头stream.Seek(0,SeekOrigin.Begin);MiniExcel.SaveAs(stream,batch,printHeader:true);firstBatch=false;}else{// 后续批次:追加到已有 sheet(通过 sheetName)MiniExcel.AppendExcel(stream,batch,sheetName:"Data");}batch.Clear();}}// 处理剩余数据if(batch.Count>0){if(firstBatch)MiniExcel.SaveAs(stream,batch,printHeader:true);elseMiniExcel.AppendExcel(stream,batch,sheetName:"Data");}}}publicclassReportRow{publicstringDeviceId{get;set;}publicDateTimeTimestamp{get;set;}publicdoubleTemperature{get;set;}publicdoublePressure{get;set;}}

3. 使用模板生成报表

// 报表模板(template.xlsx)包含:// - A1: 标题(已合并单元格)// - A3: 列头(DeviceId, Timestamp, Temperature...)// - A4 以下:数据区(空着,等我们填充)publicvoidGenerateFromTemplate(){stringtemplatePath="template.xlsx";stringoutputPath="report_20240421.xlsx";// 1. 复制模板File.Copy(templatePath,outputPath,overwrite:true);// 2. 读取模板内容(不覆盖格式)vartemplate=MiniExcel.QueryAsDataTable(outputPath);// 3. 准备数据vardata=GetProductionData();// List<ReportRow>// 4. 写入数据(从 A4 开始)MiniExcel.SaveAsByTemplate(outputPath,new{Title="2024年4月21日 生产报表",GenerateDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm"),Data=data// 这个 key 会对应模板中的 Data 区域});}

4. 样式设置

publicvoidWriteWithStyle(){varrows=newList<Dictionary<string,object>>{newDictionary<string,object>{["DeviceId"]="INJ001",["Value"]=85.5},newDictionary<string,object>{["DeviceId"]="INJ002",["Value"]=82.3}};// 设置列配置varcolumns=newDictionary<string,MiniExcelColumnAttribute>{["DeviceId"]=newMiniExcelColumnAttribute{Name="设备编号",Width=15},["Value"]=newMiniExcelColumnAttribute{Name="测量值",Width=12,Format="0.00"}};// 写入并设置列宽MiniExcel.SaveAs("styled.xlsx",rows,configurations:columns);}// 自定义样式(需要底层操作)publicvoidWriteWithCustomStyle(stringfilePath){varconfig=newMiniExcelConfiguration{SheetName="Report"};usingvarstream=File.Create(filePath);stream.Seek(0,SeekOrigin.Begin);// MiniExcel 支持通过 .xlsx 的 shared strings 和 styles.xml// 完整样式控制建议用 ClosedXML 或 EPPlus}

5. 读取时处理合并单元格

publicvoidReadMergedCells(){// MiniExcel 默认会返回合并单元格的值到每一行// 如果需要识别合并区域,手动解析varcells=MiniExcel.GetCells("merged.xlsx").ToList();varmergedRanges=cells.Where(c=>c.MergeCount>0).Select(c=>new{c.Value,StartRow=c.Row,EndRow=c.Row+c.MergeCount-1,StartCol=c.Column,EndCol=c.Column+1// 简化:默认横向合并}).ToList();foreach(varminmergedRanges){Console.WriteLine($"合并区域:{m.Value}({m.StartRow}-{m.EndRow})");}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 19:24:06

Hyper-V导入win11时,出现出现“win11无法启动”、“win11无法初始化、”“hyper-v 无法解包密钥保护程序”

解决方法&#xff1a;从旧主机导出证书并导入到新主机 在旧 Hyper-V 主机上&#xff1a; 按下WinR&#xff0c;输入mmc点击 “文件” → “添加 / 删除管理单元”选择 “证书”&#xff0c;点击 “添加”选择 “计算机账户” → “下一步” → “本地计算机” → “完成” → “…

作者头像 李华
网站建设 2026/5/15 19:20:04

4. 大型场馆大空间挡烟垂壁选型与布设

大型场馆、商业综合体、中庭展厅这类大空间建筑&#xff0c;空间跨度大、层高较高&#xff0c;传统隔断无法满足排烟分区要求&#xff0c;合理选用与布设挡烟垂壁&#xff0c;是解决大空间防排烟难题的核心途径。大空间场景在挡烟垂壁选型上&#xff0c;需优先适配大跨度、高空…

作者头像 李华
网站建设 2026/5/15 19:16:04

S19|MCP 与插件:多 Agent 平台 —— 外部能力总线,让外部工具安全接入

在前十八章&#xff0c;我们的 Agent 已经拥有完整的内部能力体系&#xff1a;循环、工具、计划、子代理、技能、压缩、权限、Hook、记忆、提示词流水线、错误恢复、任务系统、后台任务、定时调度、多 Agent 团队、团队协议、自主代理、Worktree 隔离&#xff0c;所有工具都写在…

作者头像 李华
网站建设 2026/5/15 19:15:04

STM32F103+DAC0832波形发生器保姆级教程:从Proteus仿真到Keil代码调试全流程

STM32F103DAC0832波形发生器全流程实战&#xff1a;从电路设计到代码调试的深度解析 在嵌入式系统开发领域&#xff0c;波形发生器是一个兼具教学价值与实践意义的经典项目。本文将带领读者完成一个基于STM32F103微控制器与DAC0832数模转换器的完整开发流程&#xff0c;涵盖Pro…

作者头像 李华