C# 数据导出成Excel的流

news/2024/9/28 6:56:45

导出的帮助类

public class ExcelHelper
{/// <summary>/// 将给定的模型列表转换为 Excel 内存流,第一行和第二行是居中对齐加粗的/// </summary>/// <typeparam name="T">模型类型</typeparam>/// <param name="models">模型列表</param>/// <param name="firstRow">Excel 第一行数据</param>/// <param name="secondRow">Excel 第二行数据</param>/// <returns>Excel 内存流</returns>public static MemoryStream ExportExcelStream<T>(List<T> models, string firstRow, string secondRow){NPOIMemoryStream ms = new NPOIMemoryStream();//使用自定义类IWorkbook workbook = Parse(models, firstRow, secondRow);workbook.Write(ms);ms.Position = 0;return ms;}/// <summary>/// 将数据导出到Excel内存流中/// </summary>/// <typeparam name="T">类型参数</typeparam>/// <param name="models">要导出的数据列表</param>/// <param name="firstRow">第一行的信息</param>/// <param name="secondRow">第二行的信息</param>/// <param name="hashtable">Hashtable类型的参数</param>/// <returns>Excel内存流</returns>public static MemoryStream ExportExcelStream<T>(List<T> models, string firstRow, string secondRow,Hashtable hashtable){NPOIMemoryStream ms = new NPOIMemoryStream();//使用自定义类IWorkbook workbook = Parse(models, hashtable, firstRow, secondRow);workbook.Write(ms);ms.Position = 0;return ms;}/// <summary>///     内存流保存到Excel文件中/// </summary>/// <param name="stream"></param>/// <param name="filePath"></param>/// <returns></returns>public static string ConvertStreamToExcel(MemoryStream stream, string filePath){using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)){byte[] buffer = new byte[stream.Length];stream.Read(buffer, 0, buffer.Length);fileStream.Write(buffer, 0, buffer.Length);}return filePath;}/// <summary>///     将数据传输对象列表解析为HSSFWorkbook对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="models"></param>/// <param name="firstRow"></param>/// <param name="secondRow"></param>/// <returns></returns>private static HSSFWorkbook Parse<T>(List<T> models, string firstRow = "", string secondRow = ""){var book = new HSSFWorkbook();var sheet = book.CreateSheet();var headerStyle = GetHeaderStyle(book);headerStyle.Alignment = HorizontalAlignment.Center;headerStyle.BorderBottom = BorderStyle.Thin;headerStyle.BorderLeft = BorderStyle.Thin;headerStyle.BorderRight = BorderStyle.Thin;headerStyle.BorderTop = BorderStyle.Thin;var itemStyle = GetItemStyle(book);itemStyle.Alignment = HorizontalAlignment.Center;itemStyle.BorderBottom = BorderStyle.Thin;itemStyle.BorderLeft = BorderStyle.Thin;itemStyle.BorderRight = BorderStyle.Thin;itemStyle.BorderTop = BorderStyle.Thin;var properties = typeof(T).GetProperties();var columns = properties.Select(x => new ColumnEntry{Property = x,Header = x.GetCustomAttribute<ExportHeaderAttribute>()}).Where(x => x.Header != null).OrderBy(x => x.Header.Order).ToList();//  列数var columnCount = columns.Count();//  行数var rowCount = models.Count();SetColumnWith(sheet, columnCount);WriteMergeRow(0, firstRow, 0, columnCount - 1);WriteMergeRow(1, secondRow, 0, columnCount - 1);WriteRow(2, columns.Select(x => x.Header.Name).ToList());for (var rowIndex = 3; rowIndex <= rowCount + 2; rowIndex++){var values = new List<string>();var model = models[rowIndex - 3];foreach (var column in columns){var value = column.Property.GetValue(model)?.ToString();values.Add(value);}WriteRow(rowIndex, values);}return book;void WriteRow(int rowIndex, List<string> rows){var row = sheet.CreateRow(rowIndex);if (rowIndex == 0){//  设置表头高度row.Height = row.Height;}for (int i = 0; i < columnCount; i++){var cell = row.CreateCell(i);if (rowIndex == 2){//  设置表头单元格样式cell.CellStyle = headerStyle;cell.SetCellValue(rows[i]?.ToString());}else{cell.CellStyle = itemStyle;if (double.TryParse(rows[i], out double tryNumberValue)){cell.SetCellType(CellType.Numeric);//cell.CellStyle.DataFormat = book.CreateDataFormat().GetFormat("#.######");cell.SetCellValue(tryNumberValue);}else{cell.SetCellValue(rows[i]?.ToString());}}}}void WriteMergeRow(int rowIndex, string rowValue, int fromCell, int toCell){var row = sheet.CreateRow(rowIndex);if (rowIndex == 0){//  设置表头高度row.Height = row.Height;}var cell = row.CreateCell(0);cell.CellStyle = headerStyle;cell.SetCellValue(rowValue);var region = new NPOI.SS.Util.CellRangeAddress(rowIndex, rowIndex, 0, columnCount - 1);HSSFRegionUtil.SetBorderBottom(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderTop(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderLeft(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderRight(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);row.Sheet.AddMergedRegion(region);}}/// <summary>///     将数据传输对象列表解析为HSSFWorkbook对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="models"></param>/// <param name="hashtable"></param>/// <param name="firstRow"></param>/// <param name="secondRow"></param>/// <returns></returns>private static HSSFWorkbook Parse<T>(List<T> models,Hashtable hashtable ,string firstRow = "", string secondRow = ""){var book = new HSSFWorkbook();var sheet = book.CreateSheet();var headerStyle = GetHeaderStyle(book);headerStyle.Alignment = HorizontalAlignment.Center;headerStyle.BorderBottom = BorderStyle.Thin;headerStyle.BorderLeft = BorderStyle.Thin;headerStyle.BorderRight = BorderStyle.Thin;headerStyle.BorderTop = BorderStyle.Thin;var itemStyle = GetItemStyle(book);itemStyle.Alignment = HorizontalAlignment.Center;itemStyle.BorderBottom = BorderStyle.Thin;itemStyle.BorderLeft = BorderStyle.Thin;itemStyle.BorderRight = BorderStyle.Thin;itemStyle.BorderTop = BorderStyle.Thin;var properties = typeof(T).GetProperties();var columns = properties.Select(x => new ColumnHeaderEntity{Property = x,Header = hashtable[x.Name].ToString()}).Where(x => x.Header != null).ToList();//  列数var columnCount = columns.Count();//  行数var rowCount = models.Count();SetColumnWith(sheet, columnCount);WriteMergeRow(0, firstRow, 0, columnCount - 1);WriteMergeRow(1, secondRow, 0, columnCount - 1);WriteRow(2, columns.Select(x => x.Header).ToList());for (var rowIndex = 3; rowIndex <= rowCount + 2; rowIndex++){var values = new List<string>();var model = models[rowIndex - 3];foreach (var column in columns){var value = column.Property.GetValue(model)?.ToString();values.Add(value);}WriteRow(rowIndex, values);}return book;void WriteRow(int rowIndex, List<string> rows){var row = sheet.CreateRow(rowIndex);if (rowIndex == 0){//  设置表头高度row.Height = row.Height;}for (int i = 0; i < columnCount; i++){var cell = row.CreateCell(i);if (rowIndex == 2){//  设置表头单元格样式cell.CellStyle = headerStyle;cell.SetCellValue(rows[i]?.ToString());}else{cell.CellStyle = itemStyle;if (double.TryParse(rows[i], out double tryNumberValue)){cell.SetCellType(CellType.Numeric);//cell.CellStyle.DataFormat = book.CreateDataFormat().GetFormat("#.######");cell.SetCellValue(tryNumberValue);}else{cell.SetCellValue(rows[i]?.ToString());}}}}void WriteMergeRow(int rowIndex, string rowValue, int fromCell, int toCell){var row = sheet.CreateRow(rowIndex);if (rowIndex == 0){//  设置表头高度row.Height = row.Height;}var cell = row.CreateCell(0);cell.CellStyle = headerStyle;cell.SetCellValue(rowValue);var region = new NPOI.SS.Util.CellRangeAddress(rowIndex, rowIndex, 0, columnCount - 1);HSSFRegionUtil.SetBorderBottom(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderTop(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderLeft(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);HSSFRegionUtil.SetBorderRight(BorderStyle.Thin, region, (HSSFSheet)row.Sheet, book);row.Sheet.AddMergedRegion(region);}}/// <summary>///     获取表头样式/// </summary>/// <param name="book"></param>/// <returns></returns>private static ICellStyle GetHeaderStyle(HSSFWorkbook book){ICellStyle cellStyle = book.CreateCellStyle();IFont font = book.CreateFont();font.Color = new HSSFColor.Black().Indexed;font.IsBold = true;cellStyle.SetFont(font);cellStyle.FillPattern = FillPattern.SolidForeground;return cellStyle;}/// <summary>///     获取内容单元格样式/// </summary>/// <param name="book"></param>/// <returns></returns>private static ICellStyle GetItemStyle(HSSFWorkbook book){var style = book.CreateCellStyle();var font = book.CreateFont();//font.FontName = "方正舒体";font.Color = new HSSFColor.Black().Indexed;//font.IsItalic = true;//font.FontHeightInPoints = 16;font.IsBold = false;style.SetFont(font);//style.FillBackgroundColor = new HSSFColor.Grey50Percent().Indexed;//style.FillForegroundColor = 0;style.FillPattern = FillPattern.SolidForeground;//((XSSFColor)style.FillForegroundColorColor).SetRgb(new byte[] { 0, 176, 240 });return style;}/// <summary>///     设置列宽/// </summary>/// <param name="sheet"></param>/// <param name="columnCount"></param>private static void SetColumnWith(ISheet sheet, int columnCount){int num = 4096;for (int i = 0; i < columnCount; i++){sheet.SetColumnWidth(i, num);}}
}

导出需要用到的Model

    public class ColumnHeaderEntity{public PropertyInfo Property { get; set; }public string Header { get; set; }}public class ColumnEntry{public PropertyInfo Property { get; set; }public ExportHeaderAttribute Header { get; set; }}public class ExportHeaderAttribute : Attribute
{//// 摘要://     列名称public string Name { get; }//// 摘要://     列顺序public short Order { get; }public ExportHeaderAttribute(string name): this(name, -1){}public ExportHeaderAttribute(string name, short order){Name = name;Order = order;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/47008.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

场景: kettle中http post步骤如何发送http请求且传递body参数? 解决方案: http post步骤中直接设置Request entity field字段即可。 1、手边没有现成的post接口,索性用python搭建一个简单的接口,关键代码如下(安装python环境略):from flask import Flask, request, jso…

Dynamics CRM 365 验证客户端的网络容量和吞吐量

如何检查延迟 Customer Engagement 应用包括一个基本的诊断工具,用于分析客户端与组织的连接并生成报告。若要运行诊断工具,请按照下列步骤操作。在用户的计算机或设备上,启动 Web 浏览器,然后登录到组织。 输入以下 URL https://myorg.crm.dynamics.com/tools/diagnostics…

博客园美化教程 可自制(附代码)

博客美化 由于有小伙伴需要这些好看的代码,我就把自己从网上整合的一些代码分享给各位。 主要参考了凌云_void大佬的博客 申请JS权限 第一步你需要申请一个博客, 审核通过之后在博客后台的设置中找到申请js权限 理由积极向上即可 通过后就可以开始后门的步骤了,差不多半个小…

中考后刷题补题合集

T1(莫队,增量式维护答案) https://www.luogu.com.cn/problem/P1494 1731。 看上一篇总结的莫队。双倍经验。QAQ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std;typed…

go gin web服务器使用fvbock/endless优雅地重启或停止

gin使用fvbock/endless gin 正常使用注册路由时: package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run() // 监听并…

typroa图片上传脚本

typroa的图片上传脚本,针对Telegraph-Image项目,适用于macOS和Linux系统。安装json处理器macOSbrew install jqLinux:# Debian/Ubuntu apt install jq -y​ 脚本配置 编辑脚本,在以下位置填入你的图床url: # 自定义URL部分 base_url=""注意:网址url后不需要加 …

HTML中的文本居中

本文将详细介绍如何在HTML中实现文本居中,包括使用不同的HTML标签和CSS属性来达到这一目的。HTML中的文本居中 参考:html center text 在网页设计中,文本居中是一种常见的布局需求,用于提高页面的美观性和用户体验。HTML(HyperText Markup Language)作为构建网页内容的标…

HbuilderX 4.15版本 text标签不能用v-html渲染,会失效

如题,注意uni-notice-bar组件,里面用了标签v-html渲染,所以4.15版本的uni-notice-bar组件不要用,坑