使用C#语言开发导出EXCEL ,推荐使用 NPOI框架

1、添加程序包。选择管理NuGet程序包,浏览处搜索NPOI并安装。

2.导出方法

/// <summary>/// DataTable导出到Excel的MemoryStream/// </summary>/// <param name="dtSource">源DataTable</param>/// <param name="strHeaderText">表头文本</param>public static MemoryStream ExportDT(DataTable dtSource, string strHeaderText){HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.CreateSheet("Sheet1") as HSSFSheet;#region 右击文件 属性信息//{//    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();//    dsi.Company = "";//    workbook.DocumentSummaryInformation = dsi;//    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();//    si.Author = ""; //填加xls文件作者信息//    si.ApplicationName = "NPOI测试程序"; //填加xls文件创建程序信息//    si.LastAuthor = "2"; //填加xls文件最后保存者信息//    si.Comments = "说明信息"; //填加xls文件作者信息//    si.Title = "NPOI测试"; //填加xls文件标题信息//    si.Subject = "NPOI测试Demo"; //填加文件主题信息//    si.CreateDateTime = DateTime.Now;//    workbook.SummaryInformation = si;//}#endregionHSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss");//取得列宽int[] arrColWidth = new int[dtSource.Columns.Count];foreach (DataColumn item in dtSource.Columns){arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;arrColWidth[item.Ordinal] = arrColWidth[item.Ordinal] > 40 ? 40 : arrColWidth[item.Ordinal];}for (int i = 0; i < dtSource.Rows.Count; i++){for (int j = 0; j < dtSource.Columns.Count; j++){int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;if (intTemp > arrColWidth[j]){arrColWidth[j] = intTemp;}arrColWidth[j] = arrColWidth[j] > 40 ? 40 : arrColWidth[j];}}int rowIndex = 0;foreach (DataRow row in dtSource.Rows){#region 新建表,填充表头,填充列头,样式if (rowIndex == 65535 || rowIndex == 0){if (rowIndex != 0){sheet = workbook.CreateSheet("Sheet1") as HSSFSheet;}#region 表头及样式{HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;headerRow.HeightInPoints = 40;headerRow.CreateCell(0).SetCellValue(strHeaderText);HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;headStyle.VerticalAlignment = VerticalAlignment.Center;HSSFFont font = workbook.CreateFont() as HSSFFont;font.FontHeightInPoints = 20;font.Boldweight = 700;headStyle.SetFont(font);headerRow.GetCell(0).CellStyle = headStyle;sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));//headerRow.Dispose();}#endregion#region 列头及样式{HSSFRow headerRow = sheet.CreateRow(1) as HSSFRow;HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;HSSFFont font = workbook.CreateFont() as HSSFFont;font.FontHeightInPoints = 10;font.Boldweight = 700;headStyle.SetFont(font);//边框headStyle.BorderBottom = BorderStyle.Thin;headStyle.BorderLeft = BorderStyle.Thin;headStyle.BorderRight = BorderStyle.Thin;headStyle.BorderTop = BorderStyle.Thin;foreach (DataColumn column in dtSource.Columns){headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);headerRow.GetCell(column.Ordinal).CellStyle = headStyle;//设置列宽sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);}//headerRow.Dispose();}#endregionrowIndex = 2;}#endregion#region 填充内容HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;foreach (DataColumn column in dtSource.Columns){HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;//样式//HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;边框//cellStyle.BorderBottom = BorderStyle.THIN;//cellStyle.BorderLeft = BorderStyle.THIN;//cellStyle.BorderRight = BorderStyle.THIN;//cellStyle.BorderTop = BorderStyle.THIN;自动换行//cellStyle.WrapText = true;//cellStyle.VerticalAlignment = VerticalAlignment.Center;newCell.CellStyle.VerticalAlignment = VerticalAlignment.Top;string drValue = row[column].ToString();switch (column.DataType.ToString()){case "System.String": //字符串类型新增的四句话,设置CELL格式为文本格式   //HSSFCellStyle cellStyle2 = workbook.CreateCellStyle() as HSSFCellStyle;//HSSFDataFormat fmt = workbook.CreateDataFormat() as HSSFDataFormat;//cellStyle2.DataFormat = fmt.GetFormat("@");if (drValue.Contains(".png") || drValue.Contains(".PNG")|| drValue.Contains(".jpg")|| drValue.Contains(".JPG")|| drValue.Contains(".jpeg")){AddCellPicture(sheet, workbook, "http://10.71.3.196/MIOS.Web/" + drValue, rowIndex, column.Ordinal);break;}newCell.SetCellValue(drValue);break;case "System.DateTime": //日期类型DateTime dateV;if (DateTime.TryParse(drValue, out dateV)){newCell.SetCellValue(dateV);newCell.CellStyle = dateStyle; //格式化显示}break;case "System.Boolean": //布尔型bool boolV = false;bool.TryParse(drValue, out boolV);newCell.SetCellValue(boolV);break;case "System.Int16": //整型case "System.Int32":case "System.Int64":case "System.Byte":int intV = 0;int.TryParse(drValue, out intV);newCell.SetCellValue(intV);break;case "System.Decimal": //浮点型case "System.Double":double doubV = 0;double.TryParse(drValue, out doubV);newCell.SetCellValue(doubV);break;case "System.DBNull": //空值处理newCell.SetCellValue("");break;default:newCell.SetCellValue(drValue);break;}}#endregionrowIndex++;}using (MemoryStream ms = new MemoryStream()){workbook.Write(ms);ms.Flush();ms.Position = 0;//sheet.Dispose();//workbook.Dispose();return ms;}}

3.插入图片方法

 /// <summary>/// 向sheet插入图片/// </summary>/// <param name="sheet"></param>/// <param name="workbook">文档对象</param>/// <param name="imgPath">网络图片地址</param>/// <param name="row">哪行</param>/// <param name="col">哪列</param>private static void AddCellPicture(ISheet sheet, HSSFWorkbook workbook, string imgPath, int row, int col){Uri uri = new Uri(imgPath); //imgPath :网络图片地址    WebRequest webRequest = WebRequest.Create(uri);using (WebResponse webResponse = webRequest.GetResponse()){//防止发生报错:GDI+中发生一般性错误的解决办法Bitmap bitmap = new Bitmap(webResponse.GetResponseStream()); //读取图片流 Bitmap OldImage = new Bitmap(bitmap);//将图片流复制到新的图片流中 bitmap.Dispose();   //将原来的图片流释放,将图片文件进行解锁。 using (MemoryStream ms = new MemoryStream()){OldImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);byte[] bytes = ms.ToArray();int pictureIdx = 0;if (imgPath.Contains(".png")|| imgPath.Contains(".PNG")){pictureIdx = workbook.AddPicture(bytes, NPOI.SS.UserModel.PictureType.PNG);  //添加图片 }if (imgPath.Contains(".jpg")|| imgPath.Contains(".jpeg")|| imgPath.Contains(".JPG") ){pictureIdx = workbook.AddPicture(bytes, NPOI.SS.UserModel.PictureType.JPEG);  //添加图片 }HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, col, row, col + 1, row + 1);//图片位置,图片左上角为(col, row) HSSFPicture pict = (HSSFPicture)sheet.CreateDrawingPatriarch().CreatePicture(anchor, pictureIdx);//pict.Resize(); //用图片原始大小来显示   }}}

5.生成table,需要改造 个人的 此方法是根据配置(xml)文件自动 查询数据库生成

 public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content){ODataPath path = Request.ODataProperties().Path;IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource;var queryDatas = value.GetType().GetProperty("Query").GetValue(value) as IQueryable;var export_conf = HttpContext.Current.Request.QueryString["export_conf"];if (export_conf.IsEmpty()) export_conf = "Export_" + targetNavigationSource.Name;var export = XmlUtils.GetXml<ExportXml>(HttpContext.Current.Server.MapPath("~/ExportConfig/Excel/"+ export_conf + ".xml"));if (export != null){DataTable table = new DataTable();var dicSysDatas = new Dictionary<string, List<T_SYS_DATA_DETAILEntity>>();export.FileName = FormatReplaceSymbol(export.FileName);export.SheetName = FormatReplaceSymbol(export.SheetName);export.DisplayName = FormatReplaceSymbol(export.DisplayName);//添加列foreach (var field in export.Fields){table.Columns.Add(field.Name, Type.GetType(field.Type, true, true));}//添加行数据ExportApi exportApi = new ExportApi(export);var _formatFun = exportApi.GetType().GetMethod("OnFormat_" + export_conf);Type entityType = null;if (!string.IsNullOrWhiteSpace(export.TableName)){var mdAssembly = typeof(Data.EFContextFactory).Assembly;entityType = mdAssembly.GetType("MIOS.Data.EntityModel." + export.TableName);if (entityType == null) throw new Exception("下载失败,未知的表实体名!!!");}// export.TableNameforeach (var data in queryDatas){if (data == null) continue;var row = table.NewRow();var dItems = SelectExpandToData(data);foreach (var field in export.Fields){var pVal = GetValue(dItems, field.ID);//字段为系统数据定义if (!field.SysData.IsEmpty()){var zhi = (pVal ?? "").ToString();if (!dicSysDatas.ContainsKey(field.SysData)){var sysdatas = Domain.DataCache.FindSysDataDetails(field.SysData, true)?? new List<T_SYS_DATA_DETAILEntity>();dicSysDatas.Add(field.SysData, sysdatas);}pVal = dicSysDatas[field.SysData].Where(p => p.DATA_VALUE == zhi).Select(p => p.DATA_DESC).FirstOrDefault();}if (field.ExistsFormatOptions){var zhi = (pVal ?? "").ToString();//存在格式化选项var option = field.FormatOptions.Where(p => p.key != null && zhi == p.key).FirstOrDefault();if (option != null) pVal = option.value;}if (!string.IsNullOrWhiteSpace(field.CustomFormat) && _formatFun != null){// 存在自定义格式化row[field.Name] = _formatFun.Invoke(exportApi, new object[] { field, dItems });}else{//添加行字段数据row[field.Name] = (pVal == null ? DBNull.Value : pVal);}}table.Rows.Add(row);}if (table.Columns.Count < 256 && table.Rows.Count < 65536){using (var exp = ExcelHelper.ExportDT(table, export.DisplayName)){var exporByt = exp.ToArray();writeStream.Write(exporByt, 0, exporByt.Length);}}else {if (export.FileName.EndsWith(".xls")) export.FileName += "x";using (var exp = ExcelHelper.ExportDT_X(table, export.DisplayName)){var exporByt = exp.ToArray();writeStream.Write(exporByt, 0, exporByt.Length);}}table.Dispose();HttpContext curContext = HttpContext.Current;// 设置编码和附件格式content.Headers.ContentType = new MediaTypeHeaderValue(MIME_TYPE);curContext.Response.ContentEncoding = Encoding.UTF8;curContext.Response.AppendHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(export.FileName, Encoding.UTF8));}}

6.配置文件截图

C#导出图片到EXCEL|【NPOI】导出Excel带图片相关推荐

  1. c语言考试的说说带图片致自己,好听的说说带图片_说说带图片励志致自己

    现在在朋友圈发说说,不配张图都觉得不好看,那么有哪些比较适合配好听一点说说的图片呢?接下来,学习啦小编跟你分享好听的说说带图片,欢迎欣赏致自己的励志说说带图片. 好听的说说带图片 1.愿你如阳光,快乐 ...

  2. fastreport打印ftp图片_C#:使用FastReport打印带图片传参模板的实现方法

    大家都知道,C#打印图片可以直接调用PrintDocument控件的PrintPage事件,通过画刷对image对象直接进行绘制.但是这种方法存在局限,例如如果打印的图片需要按纸张大小进行缩放的话,那 ...

  3. C#NPOI导出Excel详解

    C#NPOI导出Excel详解 开发工具与技术:工具:Visual Studio/C#.Net,技术:C# 作者:刘胜 撰写时间:2019-05-08 NPOI简介 NOP是一个开源的C#读写Exce ...

  4. Excel怎么导出百万级数据

    以前很久没碰到导出上10万数据到Excel.最近两年的业务有导出几十万数据的场景.Excel导出之前一直用NPOI导出的,NPOI的优势是不依赖Office环境.但是早期的NPOI导出操作Excel全 ...

  5. npoi html富文本,c#NPOI导出

    按行列导出数据: HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //命名空间:using NPOI.HSSF.UserModel; Sheet she ...

  6. Winforn中通过NPOI导出Excel时通过XSSFClientAnchor和XSSFPicture添加图片

    场景 Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载: https://blog.csdn.net/B ...

  7. NPOI导出excel(带图片)

    近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...

  8. 用VSCode打开带图片的.md文件

    最近自学python发现一个特别好的教程,里面文档都是.md文件并且带图片的,我用sublime,UE等都能打开 不能显示图片,所以就找到用VSCode打开. 把大象放进冰箱分三步,打开带图片的.md ...

  9. 二维码中加图片(打印带图片的二维码)

    在二维码中,放入图片,遮挡一部分是被允许的. 二维码在少许损伤的情况下还可以读取出来,图片可以放置的位置如图的黄色区域.(具体可以放多大要看二维码生成时的纠错能力) 二维码的纠错级别: 纠错级别越高, ...

  10. C#利用NPOI导出Excel

    C#利用NPOI导出Excel 第一篇文章 View Code 1 using System; 2 using System.Collections.Generic; 3 using System.L ...

最新文章

  1. 博客园Markdown新建笔记
  2. 微软职位内部推荐-Senior Software Engineer
  3. Linux培训之系统升级
  4. 实训课俄罗斯方块之二授课计划总体规划
  5. uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示
  6. JVM第五部分 高效并发
  7. actionscript 3 mysql driver_在ActionScript 3 MySql Driver连接MYSQL数据库经验分享
  8. 怎么样打印cxgrid过滤后的数据
  9. Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)
  10. Paypal如何实现循环扣款(订阅)?
  11. 20191222每日一句
  12. 微信公众号网页开发步骤
  13. C语言删除数组中的重复元素(详细分析版)
  14. 竹子买车商学院,知名汽车人钟志,销售实战培训
  15. java中linechart用法_Line Chart
  16. 程序员客栈 接不到单子_常见(但不常见)单子
  17. 网络攻防技术(摆烂一天)
  18. 算法题 金银铜奖牌排序
  19. py4j开发配置idea+python
  20. 微信公众平台中怎么上传附件?

热门文章

  1. ubuntu20磁盘新建分区与挂载
  2. flutter-学习之发布安卓包APK
  3. JavaScript基础--ECMAScript部分--李南江
  4. 三角形外接球万能公式_【光速解题】如何秒定各类外接球的球心
  5. mybatisplus分页单页pageSize最大设置
  6. override overload
  7. 计算机桌面死机的原因是,假死机(电脑桌面假死或卡死)
  8. Error:Some file crunching failed, see logs for details Error:Execution failed for task ':app:mergeDe
  9. 苹果蓝牙耳机使用说明_苹果蓝牙耳机怎么用,其功能及使用方法介绍
  10. 在虚拟机上搭建中标麒麟Neokylin6桌面版开发环境