1. 初识EPPlus:你的Excel自动化神器
第一次接触EPPlus是在一个深夜加班赶报表的时候。当时我面对着几十张需要手动调整格式的Excel表格,突然意识到必须找个自动化解决方案。EPPlus这个开源库就像救命稻草一样出现在我眼前——它不需要安装Office组件,完全免费,而且用C#就能轻松操控Excel文件。
安装EPPlus简单到令人发指。打开Visual Studio的NuGet包管理器,搜索"EPPlus"点击安装,三秒钟搞定。最新版(5.8+)已经支持.NET Core,这意味着你可以在跨平台项目中使用它。我特别喜欢它处理xlsx文件的干净利落,不像某些库会留下临时文件。
// 基础引用 using OfficeOpenXml; using System.IO;这个库最让我惊喜的是性能。实测生成包含10万行数据的Excel文件,EPPlus比传统COM互操作快20倍以上,内存占用还更低。有次我帮财务部门改造月度报表系统,原本需要半小时的手工操作,用EPPlus自动化后3秒就能生成完美格式的报表。
2. 从零创建专业Excel文件
2.1 基础文件创建套路
创建新Excel文件的代码模板我已经用得滚瓜烂熟。这里有个小技巧:使用FileInfo对象比直接传文件路径更可靠,特别是处理网络路径时。第一次用记得处理目录不存在的情况,我吃过这个亏。
public void CreateBasicExcel() { var file = new FileInfo(@"D:\Reports\Sales_Q1.xlsx"); if (file.Directory?.Exists == false) { file.Directory.Create(); } using (var package = new ExcelPackage(file)) { // 默认会创建空Workbook var sheet = package.Workbook.Worksheets.Add("销售数据"); // 基础内容写入示例 sheet.Cells["A1"].Value = "2023年第一季度销售报表"; sheet.Cells["A2"].Value = "生成时间:" + DateTime.Now.ToString("yyyy-MM-dd"); package.Save(); } }2.2 样式设置的黄金法则
设置样式时我总结出三个原则:先整体后局部、先格式后内容、使用命名范围。看这段我给表头设置样式的代码:
// 设置全局默认样式 sheet.Cells.Style.Font.Name = "微软雅黑"; sheet.Cells.Style.Font.Size = 10; // 表头特殊样式 var headerRange = sheet.Cells["A3:F3"]; headerRange.Style.Font.Bold = true; headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid; headerRange.Style.Fill.BackgroundColor.SetColor(Color.LightGray); headerRange.Style.Border.BorderAround(ExcelBorderStyle.Medium);有个坑要注意:设置背景色前必须先指定PatternType,否则颜色不生效。这是我调试半小时才发现的隐藏规则。
3. 数据读写的高级技巧
3.1 高效数据写入的四种姿势
根据数据量不同,我常用这几种写入方式:
单元格级写入:适合零星数据
sheet.Cells["B5"].Value = "固定文本";行列索引写入:适合循环处理
for(int row=2; row<100; row++){ sheet.Cells[row, 1].Value = row-1; }范围批量写入:性能最佳
var dataArray = new object[100,10]; //...填充数组 sheet.Cells["A2:J101"].LoadFromArrays(dataArray);实体类集合导入:最优雅
List<Product> products = GetProducts(); sheet.Cells["A2"].LoadFromCollection(products);
3.2 读取数据的避坑指南
读取数据时最容易遇到空值异常。我的防御性编程方案:
using (var package = new ExcelPackage(existingFile)) { var sheet = package.Workbook.Worksheets[0]; int totalRows = sheet.Dimension?.Rows ?? 0; for (int row = 2; row <= totalRows; row++) { // 安全读取方式 var productName = sheet.Cells[row, 1].Text; // 而不是.Value.ToString() var price = sheet.Cells[row, 2].GetValue<decimal?>() ?? 0; // 处理数据... } }特别提醒:读取大文件时,把ExcelPackage放在using语句中,确保及时释放资源。有次我忘记处理,导致服务器内存泄漏。
4. 专业报表的样式魔法
4.1 条件格式化的实战应用
EPPlus的条件格式比Excel原生功能还强大。这是我给财务报表做的温度计式进度条:
var range = sheet.Cells["B2:B10"]; var cf = range.ConditionalFormatting.AddDatabar(Color.Blue); cf.ShowValue = true; cf.MinValue.Type = eExcelConditionalFormattingValueObjectType.Num; cf.MinValue.Value = 0; cf.MaxValue.Type = eExcelConditionalFormattingValueObjectType.Percent; cf.MaxValue.Value = 100;4.2 图表生成的秘密配方
自动生成图表是EPPlus的杀手锏。这段代码生成柱状图:
var chart = sheet.Drawings.AddChart("销售趋势", eChartType.ColumnClustered); chart.SetPosition(1, 0, 5, 0); chart.SetSize(800, 400); // 绑定数据范围 var series = chart.Series.Add("B2:B10", "A2:A10"); series.Header = "月度销售额"; // 样式调整 chart.Title.Text = "年度销售趋势"; chart.Legend.Position = eLegendPosition.Right;有个小技巧:先用Excel设计好图表,记录下所有参数设置,再在代码中复现,比直接写代码调试效率高得多。
5. 企业级报表解决方案
5.1 模板引擎的设计思路
我经手过的ERP系统中,最成功的报表方案是采用模板占位符机制:
- 用Excel设计美观的模板文件
- 在特定位置标注占位符如{{SalesData}}
- 代码读取模板后替换内容
public void GenerateFromTemplate() { var templateFile = new FileInfo("Templates/ReportTemplate.xlsx"); var outputFile = new FileInfo("Output/FinalReport.xlsx"); using (var package = new ExcelPackage(templateFile)) { var sheet = package.Workbook.Worksheets["Data"]; // 替换占位符 foreach (var cell in sheet.Cells) { if (cell.Text.StartsWith("{{") && cell.Text.EndsWith("}}")) { string placeholder = cell.Text.Trim('{', '}'); cell.Value = GetDataFromDatabase(placeholder); } } package.SaveAs(outputFile); } }5.2 性能优化实战记录
处理十万级数据时,我总结出这些优化技巧:
禁用计算链式更新
package.Workbook.CalcMode = ExcelCalcMode.Manual;批量操作后统一计算
sheet.Cells["A1:Z10000"].Calculate();使用Value2而不是Value
sheet.Cells[1,1].Value2 = 123.45; // 性能更好关闭自动调整列宽
sheet.View.ShowGridLines = false;
在最近的项目中,通过这些优化将报表生成时间从45秒降到了3秒。