使用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 ...
随机推荐
- CentOSv6.8 修改防火墙配置、修改SSH端口
查看防火墙目前使用状况: service iptables status 修改防火墙配置: vi /etc/sysconfig/iptables 重启防火墙,让刚才修改的配置生效: service i ...
- 使用LayUI操作数据表格
接着 上一篇 继续完善我们的demo,这次我们加一个搜索按钮 搜索 在table标签的上方,加入这样一组html <div class="demoTable"> 搜索商 ...
- The model backing has changed
其他信息: The model backing the 'WebTopFormContext' context has changed since the database was created. ...
- 屏蔽掉Google Chrome 浏览器 textarea 单词拼写检测
可以使用html5的spellcheck属性来关闭对元素内容进行拼写检查. <!-以下两种书写方法正确--> <textarea spellcheck="true" ...
- PHP MYSQL 搜索周边坐标,并计算两个点之间的距离
搜索附近地点,例如,坐标(39.91, 116.37)附近500米内的人,首先算出“给定坐标附近500米”这个范围的坐标范围. 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围 ...
- UrlRewriter配置IIS支持伪静态
使用UrlRewriter时遇到了一些问题,在园子里的博问中找到了Astar的回答,防止以后找不到,就记录下来了. UrlRewriter.NET官方地址:http://urlrewriter.net ...
- Vue中之nextTick函数源码分析
Vue中之nextTick函数源码分析 1. 什么是Vue.nextTick()?官方文档解释如下:在下次DOM更新循环结束之后执行的延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 2 ...
- AVPlayer缓存实现
没有任何工具能适用于所有的场景,在使用AVPlayer的过程中,我们会发现它有很多局限性,比如播放网络音乐时,往往不能控制其内部播放逻辑,比如我们会发现播放时seek会失败,数据加载完毕后不能获取到数 ...
- OpenWRT(RT5350) 路由客户模式(Routed Client) ,设置防火墙开放UDP指定端口
/* *功 能: 本文主要功能是设置OpenWRT(RT5350) 系统实现路由客户模式,无线连接上级路由, * 无线释放AP客户端,实现伪装的中继(子网段与上级路由网段不同),同时更改防火墙 ...
- Spring装配bean
Spring配置的可选方案 Spring提供了如下三种装配机制: (1)在XML中显式配置 (2)在Java中显式配置 (3)隐式的bean发现机制和自动装配 Spring有多种方式可以装配bean, ...