目标:.NET导出Excel文件(含多张图片)

文章目录

  • 前言
  • 一、导出Excel图片
  • 二、使用步骤
    • 1.引用NPOI
    • 2.代码
  • 总结

前言

NPOI作为国人开发的开源项目,文档完善,更新及时,为.NET开发者提供了便利,主要用于生成Excel报表,搜索引擎模块中Excel中的文本提取,批量生成Excel文件,基于Excel文件模板生成新的Excel等多方面。


一、导出Excel图片

放在前面:我开发时遇到的最大问题是,导出的Excel仅显示最后一张图片,后面会给出解决方法

二、使用步骤

1.引用NPOI

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;

2.代码

点击导出 调用的方法:

        protected void Button3_Click(object sender, System.EventArgs e){string sql = "执行的sql语句";DataSet ds = DBFunction.GetDs("DataBaseDSN", sql);if (ds.Tables[0].Rows.Count <= 0){OtherFunction.Alert("没有检测到要导出的数据!", Label1);return;}try{ExportExcel(ds, "EXCEL文件名");          }catch (Exception ex){OtherFunction.Alert("数据导出失败!" + ex.ToString(), Label1);}}

NPOI导出Excel

        public void ExportExcel(DataSet ds, string FileName){DataTable dtXmlb = ds.Tables[0];HSSFWorkbook wb = new HSSFWorkbook();NPOI.SS.UserModel.Sheet sheet;NPOI.SS.UserModel.Row row;NPOI.SS.UserModel.Cell cell;string sheetName;try{HSSFPalette palette = wb.GetCustomPalette();//第一行 标题行 字体样式HSSFFont headFont = (HSSFFont)wb.CreateFont();headFont.FontName = "等线";headFont.FontHeightInPoints = 10;headFont.Boldweight = (short)FontBoldWeight.BOLD;//headFont.Color = palette.FindColor(0, 0, 255).GetIndex();//第二行 详情行 字体样式HSSFFont titleFont = (HSSFFont)wb.CreateFont();titleFont.FontName = "等线";titleFont.FontHeightInPoints = 10;titleFont.Boldweight = (short)FontBoldWeight.BOLD;// 为标题单元格添加样式HSSFCellStyle headStyle = (HSSFCellStyle)wb.CreateCellStyle();headStyle.VerticalAlignment = VerticalAlignment.CENTER;headStyle.Alignment = HorizontalAlignment.CENTER;headStyle.SetFont(headFont);// 为详情单元格添加样式HSSFCellStyle titleStyle = (HSSFCellStyle)wb.CreateCellStyle();titleStyle.VerticalAlignment = VerticalAlignment.CENTER;titleStyle.Alignment = HorizontalAlignment.LEFT;titleStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;titleStyle.FillForegroundColor = palette.FindColor(204, 204, 255).GetIndex();titleStyle.SetFont(titleFont);HSSFCellStyle cellStyle = (HSSFCellStyle)wb.CreateCellStyle();cellStyle.VerticalAlignment = VerticalAlignment.CENTER;cellStyle.Alignment = HorizontalAlignment.CENTER;int rowIndex = 0;sheetName = "这里是sheet名字";sheet = wb.CreateSheet(sheetName);row = sheet.CreateRow(rowIndex);row.Height = 650;cell = row.CreateCell(0);cell.SetCellValue("这里是标题行名字");sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 8));//合并居中(标题)cell.CellStyle = headStyle;HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();for (int j = 1; j <= dtXmlb.Rows.Count; j++){for (int k = 0; k < dtXmlb.Columns.Count; k++){if (k == 0)//详情{if (j == 1){rowIndex++;}else{rowIndex = rowIndex + 12;}NPOI.SS.UserModel.Row contentrow = sheet.CreateRow(rowIndex);contentrow.Height = 500;Cell contentcell = contentrow.CreateCell(k);sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 8));//合并居中contentcell.CellStyle = titleStyle;contentcell.SetCellValue(dtXmlb.Rows[j - 1][k].ToString());}else if (k == 1)//图1{rowIndex++;NPOI.SS.UserModel.Row contentrow = sheet.CreateRow(rowIndex);Cell contentcell = contentrow.CreateCell(k);sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex + 11, 0, 3));//合并居中contentcell.CellStyle = cellStyle;AddCellPicture(sheet, wb, patriarch, dtXmlb.Rows[j - 1][k].ToString(), rowIndex, rowIndex + 12, 0, 4);}else if (k == 2) //图2{sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex + 11, 5, 8));//合并居中AddCellPicture(sheet, wb, patriarch, dtXmlb.Rows[j - 1][k].ToString(), rowIndex, rowIndex + 12, 5, 9);}}}}catch (Exception e){OtherFunction.Alert("数据导出失败!" + e.ToString(), Label1);return;}// 输出到Excelusing (MemoryStream ms = new MemoryStream()){wb.Write(ms);System.Web.HttpContext.Current.Response.Clear();FileName = (System.Web.HttpUtility.UrlEncode(FileName)).Replace("+", " ");System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", FileName + DateTime.Now.ToString("yyyyMMddHHmmssfff")));System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());wb = null;ms.Close();ms.Dispose();System.Web.HttpContext.Current.Response.End();}}

导出图片的方法:

        private void AddCellPicture(NPOI.SS.UserModel.Sheet sheet, HSSFWorkbook workbook, HSSFPatriarch patriarch, string fileUrl, int firstRow, int lastRow,int firstCol,int lastCol){try{//校验地址if (fileUrl == null || fileUrl == "" || fileUrl.IndexOf("/") == -1 || fileUrl.IndexOf(".") == -1){return;}string[] arr = fileUrl.Split(new Char[] { '/' });string fileName = arr[arr.Length - 1];string fileLocation = HttpContext.Current.Server.MapPath("~/download");string fullPath = Path.Combine(fileLocation, Path.GetFileName(fileName));//本地没有,下载文件保存到本地if (!File.Exists(fullPath)){WebClient webClient = new WebClient();webClient.DownloadFile(fileUrl, fullPath);}//从本地取if (!string.IsNullOrEmpty(fullPath)){byte[] bytes = System.IO.File.ReadAllBytes(fullPath);int pictureIdx = workbook.AddPicture(bytes, NPOI.SS.UserModel.PictureType.JPEG);//HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, firstCol, firstRow, lastCol, lastRow);HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);}return;}catch (Exception e) {throw e;}}

下载图片的方法里注释了一行:
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();

原因是:
每张表只能有一个HSSFPatriarch对象,如果把它的创建放在导出图片方法中,那么最后的图片会消掉之前的图片。

解决方法:将HSSFPatriarch对象放在for循环前定义,以参数方式带入方法中使用

总结

参考博客:
https://blog.csdn.net/lxrj2008/article/details/80003726

NPOI导出一行多张图片相关推荐

  1. Winform中通过NPOI导出Excel时通过ICellStyle和IDataFormat格式化日期显示格式

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

  2. c# Npoi导出Excel并合并行列

    在工作开发中,客户经常要求数据库中数据导出到Excel表格.以前方法是引用office相关组件,如果客户没有安装office,功能就会遇到问题. 现在用Npoi导出Excel,导出表格是合并行列,如图 ...

  3. NPOI 导出添加批注功能

    这个问题在网上搜,都是说如下即可: //添加批注 HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch(); HSSFCom ...

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

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

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

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

  6. Winform中使用NPOI导出Excel时XSSFWorkbook wb = new XSSFWorkbook()报错

    场景 在使用NPOI导出xlsx格式的Excel时提示: NPOI.POIXMLException类型的未经处理的异常在NPOI.OOXML.dll中发生. 注: 博客主页: https://blog ...

  7. NPOI 导出 excel 性能测试

    NPOI 导出 excel 性能测试 Intro 网上看到很多人说 NPOI 的性能不行,自己写了一个 NPOI 的扩展库,于是想尝试看看 NPOI 的性能究竟怎么样,道听途说始终不如自己动手一试. ...

  8. .NET Core使用NPOI导出复杂Word详解

    最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第三方框架 ...

  9. WeihanLi.Npoi 导出支持自定义列内容啦

    WeihanLi.Npoi 导出支持自定义列内容啦 Intro 之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求,起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导 ...

  10. Npoi导出excel整理(附源码)

    前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...

最新文章

  1. sequence_lenth构建神经网络填充数据理解
  2. 51CTO采访Cisco专家何凌:实现整体虚拟化
  3. 脑机接口创造“第六感”:激活特定神经元,大鼠训练出新感官,逃出水迷宫,像用视觉一样轻松...
  4. C++ Opengl 绘制图像字符源码
  5. word List29
  6. Eclipse把默认为Gbk的编码变为UTF-8
  7. Python列表基础
  8. 【渗透测试实战】PHP语言有哪些后门?以及利用方法
  9. html5动画在线制作工具,KoolShow-KoolShow(HTML5动画制作工具) v2.4.4 官方版-CE安全网...
  10. 数据库系统概论第五版第二章答案王珊
  11. Excel-VBA 快速上手(三、数组和字典)
  12. linux vrrp 配置命令,虚拟路由器冗余协议(VRRP)简单实验
  13. Web前端——什么是web前端,什么是HTML及其常用标签
  14. linux 杂项设备,浅谈 MISC杂项设备
  15. Vue3技术4之watch监视属性、watch时value问题
  16. 拼多多在海外暂时不会上线砍一刀功能;微软落户中国三十周年;JDK 19 GA发布|极客头条
  17. Win7、Win8、Win10系统USB-Blaster驱动程序无法安装的解决办法
  18. 电容笔买什么牌子好?2022电容笔品牌排行榜
  19. drawLine(self, Union[QPointF, QPoint], Union[QPointF, QPoint]): argument 1 has unexpected type ‘floa
  20. 软件系统维护是一项不吸引人的工作_工作流程管理系统六大特点,助您工作更高效...

热门文章

  1. multiprocessing.Pool(pool.map pool.apply pool.apply_async poo.map_async)
  2. 区块链学习——HyperLedger-Fabric v0.6环境搭建详细过程
  3. ffmpeg时间戳校正到相同或+1
  4. golang调用aliyun的语音通话
  5. 什么是ESP/MSR 分区,如何建立ESP/MSR 分区
  6. SqlServer中的Top * With Ties
  7. 阿里云服务器 —— linux是什么样子的呢(适合新手,建议收藏!)
  8. 计算机的作业与程序,网络提交的计算机程序作业出现抄袭现象的对策探索
  9. php 判断非负整数,PHP-检测负数
  10. pandas concat “InvalidIndexError: Reindexing only valid with uniquely valued Index objects“