tnblog
首页
视频
资源
登录

使用NPOI导出excel(包括图片)

12766人阅读 2019/4/25 9:04 总访问:144468 评论:5 收藏:0 手机
分类: C#

Excl模板导出相信我们都会,那么模板上要导出图片呢?


嗯~还是来个例子:


准备工作:


首先要引用NPOI包:

然后获取数据集(我这里以导出用户信息为例子):

  1. using BaseUtility;
  2. using DataAccess.Repository;
  3. using IService.UserManage;
  4. using Model.EntityModel;
  5. using Model.ResultModel;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Data.SqlClient;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace Service.UserManage
  14. {
  15.     /// <summary>
  16.     /// 用户信息操作
  17.     /// </summary>
  18.     public class UserService : RepositoryFactory<GetDataResult>, IUserService
  19.     {
  20.         /// <summary>
  21.         /// 根据用户code获取用户信息
  22.         /// </summary>
  23.         /// <param name="usercode"></param>
  24.         /// <returns></returns>
  25.         public GetDataResult GetUserInfoByCode(string usercode)
  26.         {
  27.             GetDataResult result = new GetDataResult();
  28.             try
  29.             {
  30.                 var watch = CommonHelper.TimerStart();
  31.                 StringBuilder sql = new StringBuilder();
  32.                 sql.Append("select UserName Name,UserCode,CreateTime,HeadImg,Remark Memo from UserInfo");
  33.                 sql.Append(" where UserCode = @UserCode");
  34.                 SqlParameter[] parameters = {
  35.                             new SqlParameter("@UserCode", usercode),
  36.                         };
  37.                 DataSet ds = Repository().FindDataSetBySql(sql.ToString(), parameters);
  38.                 if (ds.Tables.Count > 0)
  39.                 {
  40.                     // 将dt转换为model
  41.                     result.Return_Data = BaseUtility.TableToList.GetModel(ds.Tables[0],new UserInfo());
  42.                     result.Return_ID = 0;
  43.                     result.Return_Mess = "请求成功!";
  44.                     result.CostTime = CommonHelper.TimerEnd(watch);
  45.                 }
  46.             }
  47.             catch (Exception ex)
  48.             {
  49.                 result.Return_ID = 999;
  50.                 result.Return_Mess = ex.Message;
  51.             }
  52.             return result;
  53.         }
  54.     }
  55. }

导出工具类核心代码:

  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.UserModel;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Globalization;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Reflection;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace BaseUtility.Files
  13. {
  14.     /// <summary>
  15.     /// 功能描述:
  16.     ///     Excel操作类
  17.     /// </summary>
  18.     public class ExcelHelper
  19.     {
  20.         private static string GetCellValue(ICell cell)
  21.         {
  22.             if (cell == null)
  23.             {
  24.                 return string.Empty;
  25.             }
  26.             switch (cell.CellType)
  27.             {
  28.                 case CellType.Boolean:
  29.                     return cell.BooleanCellValue.ToString();
  30.                 case CellType.Error:
  31.                     return cell.ErrorCellValue.ToString();
  32.                 case CellType.Numeric:
  33.                     if (DateUtil.IsCellDateFormatted(cell))
  34.                     {
  35.                         return cell.DateCellValue.ToString("yyyy/MM/dd HH:mm:ss");
  36.                     }
  37.                     return cell.NumericCellValue.ToString(CultureInfo.InvariantCulture);
  38.                 case CellType.Formula:
  39.                     HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
  40.                     return eva.Evaluate(cell).StringValue;
  41.                 case CellType.String:
  42.                 case CellType.Unknown:
  43.                     return cell.StringCellValue ?? cell.RichStringCellValue.String;
  44.                 case CellType.Blank:
  45.                 default:
  46.                     return string.Empty;
  47.             }
  48.         }
  49.         /// <summary>
  50.         /// 根据excel模板导出数据和图片
  51.         /// </summary>
  52.         /// <typeparam name="TEntity"></typeparam>
  53.         /// <param name="templatefile">模板文件</param>
  54.         /// <param name="Model">实体</param>
  55.         /// <param name="bytes">图片字节流</param>
  56.         /// <param name="sheetName">输出文件名</param>
  57.         /// <param name="cells">单元格对象</param>
  58.         /// <returns></returns>
  59.         public static byte[] ExportList<TEntity>(string templatefile, TEntity model,List<Byte[]> bytes, string sheetName, IList<EntityCell> cells)
  60.         {
  61.             IWorkbook workbook;
  62.             using (var file = new FileStream(templatefile, FileMode.Open, FileAccess.Read))
  63.             {
  64.                 workbook = WorkbookFactory.Create(file);
  65.             }
  66.             ISheet sheet = workbook.GetSheetAt(0);
  67.             //插入图片
  68.             WriteInImg(workbook, sheet, bytes);
  69.             workbook.SetSheetName(0, sheetName);
  70.             foreach (var cell in cells)
  71.             {
  72.                 ICell item = sheet.GetRow(cell.RowIndex).GetCell(cell.ColumnIndex);
  73.                 item.SetCellValue(cell.CellValue);
  74.             }
  75.             ICellStyle cellStyle = workbook.CreateCellStyle();
  76.             cellStyle.WrapText = true;
  77.             Type entityType = typeof(TEntity);
  78.             Type descAttType = typeof(DescriptionAttribute);
  79.             List<PropertyInfo> columnProperty = entityType
  80.                     .GetProperties()
  81.                     .Where(o => o.IsDefined(descAttType, false))
  82.                     .ToList();
  83.             for (int n = 0; n < sheet.LastRowNum + 1; n++)
  84.             {
  85.                 List<string> columnBindList = sheet.GetRow(n).Cells.Select(GetCellValue).ToList();
  86.                 IRow row = sheet.GetRow(n);
  87.                 if (columnBindList.Count > 0)
  88.                 {
  89.                     for (int i = 0; i < row.LastCellNum; i++)
  90.                     {
  91.                         //得到当前单元格
  92.                         ICell cell = row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK);
  93.                         string cellvalues = cell.StringCellValue;
  94.                         if (string.IsNullOrEmpty(cellvalues))
  95.                         {
  96.                             continue;
  97.                         }
  98.                         foreach (PropertyInfo header in typeof(TEntity).GetProperties())
  99.                         {
  100.                             PropertyInfo property = null;
  101.                             //这里匹配模板中值,然后填充
  102.                             if (cellvalues.Contains("{" + header.Name + "}"))
  103.                             {
  104.                                 property = header;
  105.                             }
  106.                             //property = columnProperty.FirstOrDefault(o => cellvalues.Contains("{"));
  107.                             if (property == null)
  108.                             {
  109.                                 continue;
  110.                             }
  111.                             string a = property.Name;
  112.                             //判断当前属性的数据类型
  113.                             object value = property.GetValue(model, null);
  114.                             //得到当前单元格
  115.                             //ICell cell = row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK);
  116.                             cell.SetCellValue(value + "");
  117.                         }
  118.                     }
  119.                 }
  120.             }
  121.             using (var ms = new MemoryStream())
  122.             {
  123.                 workbook.Write(ms);
  124.                 ms.Flush();
  125.                 ms.Position = 0;
  126.                 return ms.ToArray();
  127.             }
  128.         }
  129.         /// <summary>
  130.         /// 填充图片
  131.         /// </summary>
  132.         /// <param name="workbook"></param>
  133.         /// <param name="sheet"></param>
  134.         /// <param name="bytes"></param>
  135.         private static void WriteInImg(IWorkbook workbook, ISheet sheet, List<byte[]> bytes)
  136.         {
  137.             int count = 0;
  138.             int i = 1;
  139.             for (int j = 0; j < bytes.Count; j++)
  140.             {
  141.                 byte[] _byte = bytes[j];
  142.                 int pictureIdx = workbook.AddPicture(_byte, PictureType.PNG);
  143.                 HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
  144.                 //cout 15 代表起始坐标(X,Y) i 19代表结束坐标(X,Y) 我这里是以我的模板调的,模板图片位置不一样就改变这个值
  145.                 HSSFClientAnchor anchor = new HSSFClientAnchor(0010230, count, 7, i, 11);
  146.                 i = 2 + i;
  147.                 count = count + 2;
  148.                 HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
  149.             }
  150.         }
  151.     }
  152.     /// <summary>
  153.     /// 单元格对象
  154.     /// </summary>
  155.     public class EntityCell
  156.     {
  157.         /// <summary>
  158.         /// 行下标
  159.         /// </summary>
  160.         public int RowIndex;
  161.         /// <summary>
  162.         /// 列下标
  163.         /// </summary>
  164.         public int ColumnIndex;
  165.         /// <summary>
  166.         /// 单元格内容
  167.         /// </summary>
  168.         public string CellValue;
  169.     }
  170. }

写一个控制器,调用测试:

  1. using BaseUtility.Files;
  2. using BLL.UserManage;
  3. using Model.EntityModel;
  4. using Model.ResultModel;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Web;
  9. using System.Web.Mvc;
  10. namespace Admin.Controllers
  11. {
  12.     public class ExportExcelController : Controller
  13.     {
  14.         // GET: ExportExcel
  15.         public ActionResult ExportExcelIndex()
  16.         {
  17.             GetDataResult result = UserBLL.GetUserInfoByCode("aojiancc");
  18.             UserInfo user = new UserInfo();
  19.             if (result.Return_ID == 0)
  20.             {
  21.                 user = result.Return_Data;
  22.             }
  23.             //获取图片,并获取转化为字节流
  24.             List<byte[]> bytes = new List<byte[]>();
  25.             if (!string.IsNullOrEmpty(user.HeadImg))
  26.             {
  27.                 string flePath = user.HeadImg;//头像路径
  28.                 string[] pathleng = flePath.Split('~');
  29.                 flePath = pathleng[1];
  30.                 string dataDir = AppDomain.CurrentDomain.BaseDirectory;
  31.                 flePath = flePath.Substring(1, flePath.Length - 1);
  32.                 flePath = dataDir + flePath;
  33.                 byte[] vs = System.IO.File.ReadAllBytes(flePath);
  34.                 if (vs.Length > 0)
  35.                 {
  36.                     bytes.Add(vs);
  37.                 }
  38.             }
  39.             //输出excel名称
  40.             string cellValue = string.Format(user.Name+"用户信息报告({0:yyyy年MM月dd日})", DateTime.Now.ToString("yyyy-MM-dd"));
  41.             string fileName = string.Format(user.Name + "用户信息报告({0:yyyy年MM月dd日}).xls", DateTime.Now.ToString("yyyy-MM-dd"));
  42.             //模板路径
  43.             string templatefile = Server.MapPath("~/ExcelTemplet/用户信息报告输出模板.xls");
  44.             //单元格对象设置
  45.             List<EntityCell> cells = new List<EntityCell>
  46.             {
  47.                 /*new EntityCell
  48.                 {
  49.                     CellValue = cellValue,
  50.                     ColumnIndex = 0,
  51.                     RowIndex = 0
  52.                 }*/
  53.             };
  54.             //调用输出方法
  55.             byte[] buffer = ExcelHelper.ExportList<UserInfo>(templatefile, user, bytes, fileName, cells);
  56.             //byte[] buffer = ms.ToArray();
  57.             string contentType = "application/vnd.ms-excel";
  58.             return File(buffer, contentType, fileName);
  59.         }
  60.     }
  61. }

模板样式:

运行效果:


评价

青春年华

2020/3/9 11:33:05

给你个赞吧

忘掉过去式

2020/4/29 17:23:42

原来就是你 博主才回叫我们做的这个  这个锅你背顶了 丢不掉的那种[嘻嘻]

饰心:@忘掉过去式哈哈o(╯□╰)o

2020/5/6 13:02:22 回复

忘掉过去式:@饰心不过还好现在出来了 哈哈哈

2020/5/6 14:12:23 回复

剑轩

2020/8/5 12:26:19

哈哈哈,这会正好同事问我怎么使用npoi导出包含图片的excel,直接把你这篇文章搜出来丢给他

NET Core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

使用OLEDB读取不同版本Excel的连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

C 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

使用爬虫刷csdn博客访问量

首先了解一下常见反爬虫的检测方法频率监测:有些网站会设置一种频率监测的机制,对于同一IP,若在一定时间内访问的速度超...

Idea下使用maven搭建SSM(一):SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

Idea下使用maven搭建SSM(二):MyBatis

开发Web应用,数据的存储和处理往往离不开数据库和SQL语句。在使用Java开发的Web应用中,自然也少不了连接数据库的步骤。在...

使用 微软自带语音合成类库

//引入语音合成名称空间 usingSystem.Speech.Synthesis; classA { voidtest1() { //实例化并指定字符串播放合成读音 ...

如何使用图标像使用文字一样,使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务,提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

使用OutLook发送邮件

publicstaticvoidOutlook(stringSubject,stringTextBody,stringFromAdd,stringFromPass,stringTo,stringCC,List&lt;string&...

SQL Server 中使用游标

--声明一个游标 DECLAREMyCursorCURSOR FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo//定义一个叫MyCursor的游标,...

Windows使用wireshark抓包小心得

wireshrak是个网络抓包工具,常用。但是在数据较大的网络环境中直接使用软件抓包会导致wireshark卡死。为什么呢 ?网卡瞬间...

Oracle自定义函数的简单使用

一.最最最简单的返回一个数字的函数createorreplacefunctionfun_show returnint--申明返回值 as begin return1; end;...

Oracle事务的简单使用

事务:  事务是一个整体,这些操作要么全部执行成功,要么全部不执行。使用事务的原因:保证数据的安全有效。事务的四个特...

Oracle使用游标

其实游标就是把查询的结果放入游标中,然后在去游标里边读取。相当于使用游标做了一个中转,而游标是可以作为参数进行传递...
Decorating heart
排名
22
文章
14
粉丝
21
评论
27
腾讯防水墙
赖成龙 : 学长你有下载好的js文件吗
使用 JSON WEB TOKEN (jwt) 验证
饰心 : 由于最近换了新的工作环境,还在挖煤中。后续会增加博客更新频率。
腾讯防水墙
饰心 : @剑轩,快去给tnblog弄一个
使用select2实现下拉框中显示图片
剑轩 : 秀啊.....,飞常不错
使用select2实现下拉框中显示图片
饰心 : 嗯~刚好差不多下班
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
两情若是久长时,又岂在朝朝暮暮。