使用NPOI导出图片到EXCEL
1、首先引用NPOI

2、本例用到的引用

3、在Controller里面添加导出方法
public ActionResult ExportMsgData(string term)
{ //为list赋值
MsgListToExcelForXLSXModel1(list, "");
return Content("");
}
4、导出基础方法
public void MsgListToExcelForXLSXModel1(List<BackMsgProblemList> dt, string file)
{
XSSFWorkbook xssfworkbook = new XSSFWorkbook();
ISheet sheet = xssfworkbook.CreateSheet("Test");
DataTable tblDatas = new DataTable("Datas");
DataColumn dc = null; //赋值给dc,是便于对每一个datacolumn的操作
dc = tblDatas.Columns.Add("编号", Type.GetType("System.Int32"));
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = ;//起始为1
dc.AutoIncrementStep = ;//步长为1
dc.AllowDBNull = false;//
dc = tblDatas.Columns.Add("问题标题", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题状态名称", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片一", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片二", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片三", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片四", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片五", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("问题图片六", Type.GetType("System.String")); dc = tblDatas.Columns.Add("报验图片一", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("报验图片二", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("报验图片三", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("报验图片四", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("报验图片五", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("报验图片六", Type.GetType("System.String")); dc = tblDatas.Columns.Add("复检图片一", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("复检图片二", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("复检图片三", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("复检图片四", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("复检图片五", Type.GetType("System.String"));
dc = tblDatas.Columns.Add("复检图片六", Type.GetType("System.String"));
//表头
IRow row = sheet.CreateRow();
for (int i = ; i < tblDatas.Columns.Count; i++)
{ ICell cell = row.CreateCell(i);
cell.SetCellValue(tblDatas.Columns[i].ColumnName);
//自动适应宽度
sheet.AutoSizeColumn(i);
sheet.SetColumnWidth(i, sheet.GetColumnWidth(i));
} //数据
for (int i = ; i < dt.Count(); i++)
{
IRow row1 = sheet.CreateRow(i + );
ICell cell = row1.CreateCell();
cell.SetCellValue(i + );
cell = row1.CreateCell();
cell.SetCellValue(dt[i].RIP_Name);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].PB_AllName);
var arry = dt[i].PB_AllName.Split('>');
cell = row1.CreateCell();
cell.SetCellValue(arry.Length > ? arry[] : "");
cell = row1.CreateCell();
cell.SetCellValue(arry.Length > ? arry[] : "");
cell = row1.CreateCell();
cell.SetCellValue(arry.Length > ? arry[] : "");
cell = row1.CreateCell();
cell.SetCellValue(arry.Length > ? arry[] : "");
cell = row1.CreateCell();
cell.SetCellValue(dt[i].AName);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].BD_Name);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].U_Name);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].H_Code);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].RIP_DistributName);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].RIP_SeverityName);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].HCIC_AddDateStr);
cell = row1.CreateCell();
cell.SetCellValue(dt[i].RectificationNum.ToString());
cell = row1.CreateCell();
cell.SetCellValue(dt[i].QuestionStateName);
if (dt[i].ContentAccListForCreate != null && dt[i].ContentAccListForCreate.Count > )
{
MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForCreate, );
}
if (dt[i].ContentAccListForInspection != null && dt[i].ContentAccListForInspection.Count > )
{
MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForInspection, );
}
if (dt[i].ContentAccListForCheck != null && dt[i].ContentAccListForCheck.Count > )
{ MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForCheck, );
}
}
/*不能使用如下方法生成Excel,因为在xssfworkbook.Write(stream);操作后会关闭流,导致报错【不能操作已关闭的流】*/
////转为字节数组
//MemoryStream stream = new MemoryStream();
//xssfworkbook.Write(stream);
//var buf = stream.ToArray(); ////保存为Excel文件
//using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
//{
// fs.Write(buf, 0, buf.Length);
// fs.Flush();
//}
/*可以使用下面方式导出-这里数据量多会报错【发现XX.xlsx中部分内容有问题,是否让我们尽量尝试恢复】*/
//MemoryStream stream = new MemoryStream();
//xssfworkbook.Write(stream); //Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
//Response.BinaryWrite(stream.ToArray());
//xssfworkbook = null;
//stream.Close();
//stream.Dispose();
/*最终推荐下面方式*/
HttpContext curContext = HttpContext.Current; MemoryStream ms = new MemoryStream();
xssfworkbook.Write(ms);
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode("aaa.xlsx", Encoding.UTF8) + ".xlsx");
curContext.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.BinaryWrite(ms.ToArray());
ms.Close();
ms.Dispose();
curContext.Response.End();
}
5、插入图片方法
private void MsgInsetImg(ISheet sheet, IRow row1, List<BackMsgProblemList> dt, int i, XSSFWorkbook xssfworkbook, List<string> ContentAccList, int colnum)
{
for (int j = ; j < ; j++)
{
//设置图片那的宽高
sheet.SetColumnWidth(colnum + j, );
row1.Height = ;
if (ContentAccList.Count <= j)
{
break;
}
var dPath = ImageShow + ContentAccList[j];
try
{ System.Drawing.Image imgOutput = System.Drawing.Bitmap.FromFile(dPath);
System.Drawing.Image img = imgOutput.GetThumbnailImage(, , null, IntPtr.Zero);
//图片转换为文件流
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Bmp);
BinaryReader br = new BinaryReader(ms);
var picBytes = ms.ToArray();
ms.Close(); //插入图片
if (picBytes != null && picBytes.Length > )
{
var rows = i + ;
var cols = colnum + j;
/* Add Picture to Workbook, Specify picture type as PNG and Get an Index */
int pictureIdx = xssfworkbook.AddPicture(picBytes, NPOI.SS.UserModel.PictureType.PNG); //添加图片
/* Create the drawing container */
XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
/* Create an anchor point */
XSSFClientAnchor anchor = new XSSFClientAnchor(, , , , cols, rows, , ); /* Invoke createPicture and pass the anchor point and ID */
XSSFPicture picture = (XSSFPicture)drawing.CreatePicture(anchor, pictureIdx);
/* Call resize method, which resizes the image */
picture.Resize(); picBytes = null;
}
}
catch (Exception ex)
{ log.Fatal("--图片导出失败:当前文件路径:" + dPath);
} }
}
6、导出成果

说明:这里采用的是Excel2007以上版本即:XSSFWorkbook,目前XSSFWorkbook版本的资料较少,希望能帮助大家。
备注:excel宽高采用的不是像素,经过计算大约为宽:36.53125=1像素 高:15.05217391304348=1像素

使用NPOI导出图片到EXCEL的更多相关文章
- NPOI导出数据到Excel
NPOI导出数据到Excel 前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...
- 使用NPOI导出,读取EXCEL(可追加功能)
使用NPOI导出,读取EXCEL,具有可追加功能 看代码 using System; using System.Collections.Generic; using System.Text; usin ...
- 基于NPOI导出和导入Excel
概述 NPOI,顾名思义,就是POI的.NET版本.NPOI就是用.NET语言编写的一套数据导出Excel的开源项目,支持XML.xls.xlsx.ppt等格式..NET不仅实现Excel导出还可以实 ...
- 使用NPOI导出DataTable到Excel
使用C#对DataTable导出到Excel是我们工作当中比较多用到的场景,微软提供了Microsoft.Office.Interop.Excel组件可以进行操作,但是该组件在数据量大的时候速度很慢, ...
- NPOI插入图片到excel指定单元格
先看效果图 下载NPOI组件(2.0以上支持.xlsx和.xls的excel,2.0以下只支持.xls) NPOI下载官网http://npoi.codeplex.com 下载解压,里面有个dotne ...
- ef+Npoi导出百万行excel之踩坑记
最近在做一个需求是导出较大的excel,本文是记录我在做需求过程中遇到的几个问题和解题方法,给大家分享一下,一来可以帮助同样遇到问题的朋友,二呢,各位大神也许有更好的方法可以指点小弟一 ...
- jeecg Export导出图片到excel
import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...
- c#NPOI导出2007版本excel
2003和2007版本区别: HSSFWorkbook(2003) IWorkbook(2007版本) 写完之后会有个问题,导出会报错[流已关闭]. NPOI生产.xlsx文件件时,在使用book.W ...
- C# NPOI导出数据到Excel
1 public void Export() 2 { 3 //创建工作簿对象 4 IWorkbook workbook = new XSSFWorkbook(); 5 6 ExportStatisti ...
随机推荐
- Eclipse连接SQL Server 2008数据库 以及问题总结
Eclipse中使用SQL server 2008数据库 一.准备材料 要能够使用数据库就要有相应的JDBC,所以我们要去Microsoft官网下载 https://www.microsoft.com ...
- 均值滤波去除图像噪声的matlab程序
所谓均值滤波实际上就是用均值替代原图像中的各个像素值. 均值滤波的方法是:对待处理的当前像素,选择一个模板,该模板为其近邻的若干像素组成,用模板中的像素的均值来替代原像素. 优点:算法简单,计算速度快 ...
- C#进阶之AOP
一.AOP概念(转自) AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技 ...
- STM8学习 无法仿真原因Starting debug session... -> Emulator reset (usb://usb)... ** Connection error (usb://usb): swim error [30200]: st-link connection error
刚调试程序时,STlink总是连不上,一直提示: Starting debug session...-> Emulator reset (usb://usb)...** Connection e ...
- Template7插入动态模板
要完成的效果如下图 其中下面添加出来的订单号和订单总价可以看作是接口请求的数据 实现步骤: 1 下载template7:https://github.com/nolimits4web/template ...
- sublime text注册码(秘钥)
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- 个人工作中ssd、audio python脚本总结
1.os.system(cmd)或者os.popen(cmd)调用外部命令 cmd中需要注意特殊字符的转义功能,如: USBSTOR\DISK&VEN_GENERIC-&PROD_SD ...
- HDU1166 数状数组
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- [置顶]
一个demo学会css
全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 学习了css权威指南这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的css编程 ...
- 原生JS实现音乐播放器!
前 言 最近在复习JS,觉得音乐播放器是个挺有意思的东西,今天就来用我们最原生的JS写一个小小的音乐播放器~ 主要功能: 1.支持循环.随机播放 2.在播放的同时支持图片的 ...