DoddleReport
public class ExcelReportWriter : IReportWriter
中自定义Sheet名字
report.RenderHints["SheetName"] = "Test Sheet";
var sheetName = report.RenderHints[SheetName] as string ?? "Data";
private void WriteReport(Report report, XLWorkbook workbook) { var sheetName = report.RenderHints[SheetName] as string ?? "Data";//需要传入,否则默认 IXLWorksheet worksheet; int duplicateNameCount = 0; var originalSheetName = sheetName; while (workbook.Worksheets.TryGetWorksheet(sheetName, out worksheet))//判断是否有这个sheet { sheetName = originalSheetName + ++duplicateNameCount; } worksheet = workbook.Worksheets.Add(sheetName); worksheet.SetShowRowColHeaders(true); var orientation = report.RenderHints.Orientation == ReportOrientation.Portrait ? XLPageOrientation.Portrait : XLPageOrientation.Landscape; worksheet.PageSetup.PageOrientation = orientation; // Set the paper size to what the render hint is set to if (report.RenderHints[PaperSize] != null) { worksheet.PageSetup.PaperSize = (XLPaperSize)Enum.Parse(typeof(XLPaperSize), report.RenderHints[PaperSize].ToString()); } if (report.RenderHints.FreezePanes) worksheet.SheetView.Freeze(report.RenderHints.FreezeRows, report.RenderHints.FreezeColumns); // Render the header var fieldsCount = report.DataFields.Count(f => !f.Hidden); int rowCount = RenderHeader(worksheet, fieldsCount, report.TextFields, report.RenderHints); // Render all the rows foreach (var row in report.GetRows()) { rowCount++; var dataRow = worksheet.Row(rowCount); RenderRow(rowCount, row, dataRow); } // Render the footer RenderFooter(worksheet, fieldsCount, report.TextFields, report.RenderHints, rowCount); // TODO: AdjustToContents renders horribly when deployed to an Azure Website, need to determine why // Adjust the width of all the columns for (int i = 0; i < fieldsCount; i++) { var reportField = report.DataFields.Where(f => !f.Hidden).Skip(i).Take(1).Single(); var width = new int[] { reportField.DataStyle.Width, reportField.FooterStyle.Width, reportField.HeaderStyle.Width }.Max(); var adjustToContents = report.RenderHints[AdjustColumnWidthToContents] as bool? ?? true; if (adjustToContents || width > 0) { var column = worksheet.Column(i + 1); if (adjustToContents && width > 0) { column.AdjustToContents(width.PixelsToUnits(column.Style.Font), double.MaxValue); } else if (adjustToContents) { column.AdjustToContents(1, 50, 5.0, 100.0); } else { column.Width = width.PixelsToUnits(column.Style.Font); } } } worksheet.Columns().AdjustToContents(); // Check if the current writer needs to append another report to the report we just generated if (ReportsToAppend.ContainsKey(report)) { foreach (var reportToAppend in ReportsToAppend[report]) { WriteReport(reportToAppend, workbook); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」