常用NPOI导出数据到excel,但没有试过如何导出图片。NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel。在单元格中插入图片主要是用HSSFClientAnchor对象。他有8个参数。

 HSSFClientAnchor anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);

前面四个表示在单元格中两个点的位置,后面四个表示是哪个单元格。先看代码。

 public FileResult ExportAppsImg()
{
using (var db=new PortalDb())
{
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个sheet
ISheet sheet1 = workbook.CreateSheet("sheet1");
// 设置列宽,excel列宽每个像素是1/256
sheet1.SetColumnWidth(, * );
sheet1.SetColumnWidth(, * );
IRow rowHeader = sheet1.CreateRow();//创建表头行
rowHeader.CreateCell(, CellType.STRING).SetCellValue("生产单号");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("学/工号");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("手机号");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("单位");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("预约类型");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("车牌号");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("颜色");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("品牌");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("工作证");
// rowHeader.CreateCell(9, CellType.STRING).SetCellValue("身份证正面");
// rowHeader.CreateCell(10, CellType.STRING).SetCellValue("身份证反面");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("驾驶证正面");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("驾驶证反面");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("结婚证");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("状态");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("预约时间");
rowHeader.CreateCell(, CellType.STRING).SetCellValue("申请时间");
var res = db.Appointments.ToList();
if (res.Count > )
{
int rowline = ;//从第二行开始(索引从0开始)
HSSFPatriarch patriarch = (HSSFPatriarch)sheet1.CreateDrawingPatriarch();
for (int i = ; i < res.Count; i++)
{
IRow row = sheet1.CreateRow(rowline);
//设置行高 ,excel行高度每个像素点是1/20
row.Height = * ;
//填入生产单号
row.CreateCell(, CellType.STRING).SetCellValue(res[i].Name);
row.CreateCell(, CellType.STRING).SetCellValue(res[i].SchoolNumber);
row.CreateCell(, CellType.STRING).SetCellValue(res[i].Mobile);
row.CreateCell(, CellType.STRING).SetCellValue(res[i].School);
row.CreateCell(, CellType.STRING).SetCellValue(GetEnumTxt(res[i].AppointmentType));
row.CreateCell(, CellType.STRING).SetCellValue(res[i].CardNumber);
row.CreateCell(, CellType.STRING).SetCellValue(res[i].Color);
row.CreateCell(, CellType.STRING).SetCellValue(res[i].Brand);
//将图片文件读入一个字符串
setPic(workbook,patriarch, res[i].WrokImg, sheet1, rowline, );
// setPic(workbook, patriarch, res[i].IDCardImg, sheet1, rowline, 9);
//setPic(workbook, patriarch, res[i].IDCardImgBack, sheet1, rowline, 10);
setPic(workbook, patriarch, res[i].DriveCardImg, sheet1, rowline, );
setPic(workbook, patriarch, res[i].DriveCardImgBack, sheet1, rowline, );
setPic(workbook, patriarch, res[i].MarryCardImg, sheet1, rowline, );
row.CreateCell(, CellType.STRING).SetCellValue((GetEnumTxt(res[i].State)));
row.CreateCell(, CellType.STRING).SetCellValue(res[i].VerifyTime.ToString());
row.CreateCell(, CellType.STRING).SetCellValue(res[i].CreateTime.ToString());
rowline++;
}
}
var path = Server.MapPath("/Content/Excel/预约申请表.xls");
//把文件保存到d:\aaa.xls,注意扩展名是.xls不要写成.xlsx
using (Stream stream = System.IO.File.OpenWrite(path))
{
workbook.Write(stream);
}
return File(path, "application/vnd.ms-excel","预约申请表.xls");
}
}
//获取枚举类型的Display特性的name值
public string GetEnumTxt(Enum eEnum)
{
var enumType = eEnum.GetType();
var field = enumType.GetField(eEnum.ToString());
var display = field.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault() as DisplayAttribute;
return display != null ? display.Name : eEnum.ToString();
} private void setPic(HSSFWorkbook workbook, HSSFPatriarch patriarch,string path, ISheet sheet, int rowline, int col)
{
if(string.IsNullOrEmpty(path))return;
byte[] bytes = System.IO.File.ReadAllBytes(Server.MapPath(path));
int pictureIdx = workbook.AddPicture(bytes, PictureType.JPEG);
// 插图片的位置 HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2) 后面再作解释
HSSFClientAnchor anchor = new HSSFClientAnchor(, , , , col, rowline, col+, rowline + );
//把图片插到相应的位置
HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
}

每一张表只能有一个HSSFPatriarch对象,如果把它的创建放到了setPic方法中,那么一行只会出现一张图片,最后的图片会消掉之前的图片。也不能放到for循环里。所以放在最上面。再界面上方一个a标签即可下载:

<a class="btn btn-primary" href="@Url.Action("ExportAppsImg","Appointment")">导出</a>

效果图:

参考博客:

http://blog.csdn.net/pan_junbiao/article/details/39717443 -- NPOI使用手册

http://www.cnblogs.com/wei325/p/4748324.html

NPOI导出多张图片到Excel的更多相关文章

  1. 封装NPOI导出含下拉列表的Excel

    /// <summary> /// 绑定数据的方法 /// </summary> /// <param name="ssfworkbook">H ...

  2. POI导出多张图片到Excel

    package com.sun.office.excel; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStr ...

  3. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  4. 基于NPOI导出和导入Excel

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

  5. (C#)使用NPOI导出Excel

    在做业务型的软件时,经常需要将某些数据导出,本文介绍了在Winform或Asp.net中使用NPOI(POI 项目的 .NET 版本)来操作Excel文件,而无需安装Office. 首先,需要获取NP ...

  6. Asp.Net 使用Npoi导出Excel

    引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...

  7. C# NPOI导出Excel和EPPlus导出Excel比较

    系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...

  8. NPOI导出EXCEL 打印设置分页及打印标题

    在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置  sheet1.FitToPage = false; 而 ...

  9. .NET NPOI导出Excel详解

    NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...

随机推荐

  1. 手机扫描二维码下载APP,根据操作系统不同自动下载

    Android和IOS手机扫描二维码下载APP,根据OS不同,自动处理相应下载操作.IOS自动跳转至AppStore应用下载页,Android自动下载应用的apk包. <script type= ...

  2. ZendFramework 两种安装方式

    1. 在线安装(基于composer) Zend 应用程序骨架 GitHub 地址: https://github.com/zendframework/ZendSkeletonApplication ...

  3. 梯田(dfs)

    梯田 Time Limit: 2000 ms   Memory Limit: 256 MBTotal Submission: 26   Submission Accepted: 5   Descrip ...

  4. 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]

    转载自:http://gxxsite.com/content/view/id/132.html 在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore ...

  5. hdu 1337 The Drunk Jailer

    http://acm.hdu.edu.cn/showproblem.php?pid=1337 #include <cstdio> #include <cstring> #def ...

  6. BZOJ 3529 数表(莫比乌斯反演)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3529 思路:令F(i)为i的约数和, 1<=x<=n,1<=y<=m G(i ...

  7. 序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)

    序列化的作用是什么?为什么要序列化? 1.在进程下次启动时读取上次保存的对象的信息. 2.在不同的应用程序域或进程之间传递数据. 3.在分布式应用程序中的各应用程序之间传输对象. 所为序列化,就是将对 ...

  8. 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】

    正愁如何选择构建项目中的视图呢,现在官方推荐画板 Storybord...但是好像 xib貌似更胜一筹.以前的老棒子总喜欢装吊,用代码写....用代码堆一个HTML页面不知道你们尝试过没有.等页面做出 ...

  9. UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>

    E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Subm ...

  10. UVA_Cubic Eight-Puzzle UVA 1604

    Let's play a puzzle using eight cubes placed on a 3 x 3 board leaving one empty square.Faces of cube ...