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的更多相关文章

  1. NPOI导出数据到Excel

    NPOI导出数据到Excel   前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...

  2. 使用NPOI导出,读取EXCEL(可追加功能)

    使用NPOI导出,读取EXCEL,具有可追加功能 看代码 using System; using System.Collections.Generic; using System.Text; usin ...

  3. 基于NPOI导出和导入Excel

    概述 NPOI,顾名思义,就是POI的.NET版本.NPOI就是用.NET语言编写的一套数据导出Excel的开源项目,支持XML.xls.xlsx.ppt等格式..NET不仅实现Excel导出还可以实 ...

  4. 使用NPOI导出DataTable到Excel

    使用C#对DataTable导出到Excel是我们工作当中比较多用到的场景,微软提供了Microsoft.Office.Interop.Excel组件可以进行操作,但是该组件在数据量大的时候速度很慢, ...

  5. NPOI插入图片到excel指定单元格

    先看效果图 下载NPOI组件(2.0以上支持.xlsx和.xls的excel,2.0以下只支持.xls) NPOI下载官网http://npoi.codeplex.com 下载解压,里面有个dotne ...

  6. ef+Npoi导出百万行excel之踩坑记

            最近在做一个需求是导出较大的excel,本文是记录我在做需求过程中遇到的几个问题和解题方法,给大家分享一下,一来可以帮助同样遇到问题的朋友,二呢,各位大神也许有更好的方法可以指点小弟一 ...

  7. jeecg Export导出图片到excel

    import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  8. c#NPOI导出2007版本excel

    2003和2007版本区别: HSSFWorkbook(2003) IWorkbook(2007版本) 写完之后会有个问题,导出会报错[流已关闭]. NPOI生产.xlsx文件件时,在使用book.W ...

  9. C# NPOI导出数据到Excel

    1 public void Export() 2 { 3 //创建工作簿对象 4 IWorkbook workbook = new XSSFWorkbook(); 5 6 ExportStatisti ...

随机推荐

  1. 洗礼灵魂,修炼python(5)--python操作符,内置函数

    前面提到了BIF(内置函数)这个概念,什么是内置函数,就是python已经定义好的函数,不需要人为再自己定义,直接拿来就可以用的函数,那么都有哪些BIF呢? 可以在交互式界面(IDLE)输入这段代码, ...

  2. Perfect Pth Powers poj1730

    Perfect Pth Powers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16383   Accepted: 37 ...

  3. Huge Mission

    Huge Mission Problem Description Oaiei is busy working with his graduation design recently. If he ca ...

  4. NOIP2017SummerTraining0712

    个人感受:打了三个小时不到的第一题,然后也就没有多少时间去搞第二题了,特别是第二题还看到了期望这样的东西,这个难以理解,第三题的树分治,myx大佬说50分好拿,但是我觉得也挺难拿的. 单词检索 时间限 ...

  5. gitlab实时备份方案(非官方命令)

    gitlab自带的备份功能做不到实时备份,为了尽可能减少意外情况导致的丢失数据,自己搞了一个实时备份的功能. 备份的大头主要是两部分,数据库和代码库.数据库由DBA配置主备. 仓库经过测试,通过lsy ...

  6. 更新——Canvas画布动画效果之实现倒计时

    Hello,大家好! 小W复活啦!继续欢乐的给大家更博,输送新知识~~ 不开玩笑啦!秒进正题~~~ 上次更博,小W给大家介绍了Canvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基 ...

  7. MySQL(十四)之数据备份与还原

    前言 上一篇分享了关于MySQL事务的知识,在我们数据库中最重要的就是数据了,所以数据的备份就显的特别的重要! 为什么要备份数据? 在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大 ...

  8. 使用邮件监控Mxnet训练

    1. 前言 受到小伙伴的启发,就自己动手写了一个使用邮件监控Mxnet训练的例子.整体不算复杂. 2. 打包训练代码 需要进行监控训练,所以需要将训练的代码打包进一个函数内,通过传参的方式进行训练.还 ...

  9. 微信公众号第三方 推送component_verify_ticket协议

    整了一天,终于弄明白了 component_verify_ticket 怎么获取的了.在此先批一下微信公众号平台,文档又没写清楚,又没有客服,想搞哪样哈! 好,回归正题. 第一,先通过开发者资质认证, ...

  10. SQL 表结构操作

    数据库知识总结(表结构操作) 1.创建表Scores 1 create table Scores --表名 2 (Id int identity(1,1) primary key,--设置主键,并且行 ...