MVC中用NPOI导出Excel相关问题
情形1:可以直接带参数
前端页面:
@.ActionLink("导出Excel", "DownLoadExcel", new { 参数名= '参数值' }, new { style = "margin-right:10px;", @class = "btn btn-green search" })
style 和 class 都可以添加样式
controller导出方法(可以直接将Excel导出 浏览器建议用谷歌)
方法如下:
public System.Web.Mvc.FileResult DownLoadExcel(string Id)
{
int ClassId = Convert.ToInt32(Request["ClassId"]);
string[] titleList = new string[] { "编号", "学员姓名", "单位", "联系方式", "身份证号码", "缴费情况", "缴费方式", "所在班级", "备注信息" };
IList<MODEL.Train.V_TrainProgramDetail> list = GetData()//获取数据方法
//创建Excel文件的对象
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
//添加一个sheet
NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
//给sheet1添加第一行的头部标题
IRow headerrow = sheet1.CreateRow();
HSSFCellStyle headStyle = (HSSFCellStyle)book.CreateCellStyle();
HSSFFont font = (HSSFFont)book.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font);
for (int i = ; i < titleList.Length; i++)
{
ICell cell = headerrow.CreateCell(i);
cell.CellStyle = headStyle;
cell.SetCellValue(titleList[i]);
}
//将数据逐步写入sheet1各个行
for (int i = ; i < list.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + );
rowtemp.CreateCell().SetCellValue(list[i].Id.ToString());
rowtemp.CreateCell().SetCellValue(list[i].CompanyName);
rowtemp.CreateCell().SetCellValue(list[i].CompanyName);
rowtemp.CreateCell().SetCellValue(list[i].Phone);
rowtemp.CreateCell().SetCellValue(list[i].IDCard);
rowtemp.CreateCell().SetCellValue(list[i].IsPay.ToString());
rowtemp.CreateCell().SetCellValue(list[i].SignUpType.ToString());
rowtemp.CreateCell().SetCellValue(list[i].ClassName);
rowtemp.CreateCell().SetCellValue("");
}
// 写入到客户端
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return File(ms, "application/vnd.ms-excel", "学员报名详情.xls");
}
情形2:不能直接带参数,需要用到ajax
前端页面:
<div class="modal-content">
<div class="modal-header" style="height:120px;">
<button type="button" class="close" data-dissmiss="modal" aria-hidden="true" onclick="CancleImportExcel()">×</button>
<h4 id="title">请选择时间范围</h4>
<div class="modal-dialog container">
<div class="row">
<div class="col-xs-6">
<input type="hidden" name="id" id="id" />
<label>订单开始时间:</label>
<span>
<input type="text" id="OrderStartTime" name="OrderStartTime" onclick="WdatePicker({ dateFmt:'yyyy-MM-dd HH:mm:ss' })" class="Wdate" />
</span>
</div>
<div class="col-xs-6">
<label>结束时间:</label>
<span>
<input type="text" id="OrderEndTime" name="OrderEndTime" onclick="WdatePicker({ dateFmt: 'yyyy-MM-dd HH:mm:ss' })" class="Wdate" />
</span>
</div>
</div>
</div>
</div>
<div class="modal-footer"><button type="button" class="btn btn-default" data-dissmiss="modal" onclick="Export()">确定</button>
</div>
</div> <script>
function Export() {
var param = {
OrderStartTime: $("#OrderStartTime").val(),
OrderEndTime: $("#OrderEndTime").val()
};
$.ajax({
url: '/Order/DownLoadExcel', //Controller名称和方法名
type: "POST",
dataType: "json",
data: param,
success: function (data) {
//重定向返回参数
location.href = "/Order/OutExcel?guid=" + data;
}
});
}
</script>
Controller方法如下:
public ActionResult DownLoadExcel()
{
#region 查询数据
string OrderStartTime = Convert.ToDateTime(Request["OrderStartTime"]).ToString("yyyy-MM-dd");
string OrderEndTime = Convert.ToDateTime(Request["OrderEndTime"]).AddDays().ToString("yyyy-MM-dd"); string[] titleList = new string[] { "序号", "订单编号", "收货人", "送货单位", "送货地址", "商品编号", "商品名称", "联系电话", "总价", "订单状态", "创建时间", "配送时间", "备注信息" };
IList<Model.Order.OrderInfo> list = OrderInfoBLL.GetOrdersInfoListByTime(OrderStartTime, OrderEndTime);
#endregion #region NPOI数据导出
//创建Excel文件的对象
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
//添加一个sheet
NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
//给sheet1添加第一行的头部标题
IRow headerrow = sheet1.CreateRow(); HSSFCellStyle headStyle = (HSSFCellStyle)book.CreateCellStyle();
HSSFFont font = (HSSFFont)book.CreateFont();
font.FontHeightInPoints = ;
font.Boldweight = ;
headStyle.SetFont(font);
for (int i = ; i < titleList.Length; i++)
{
ICell cell = headerrow.CreateCell(i);
cell.CellStyle = headStyle;
cell.SetCellValue(titleList[i]);
}
//将数据逐步写入sheet1各个行
for (int i = ; i < list.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + );
rowtemp.CreateCell().SetCellValue(i + );
rowtemp.CreateCell().SetCellValue(list[i].No);
rowtemp.CreateCell().SetCellValue(list[i].Receiver);
rowtemp.CreateCell().SetCellValue(list[i].Company);
rowtemp.CreateCell().SetCellValue(list[i].Address);
rowtemp.CreateCell().SetCellValue(list[i].CargoNo);
rowtemp.CreateCell().SetCellValue(list[i].CargoName);
rowtemp.CreateCell().SetCellValue(list[i].Phone);
rowtemp.CreateCell().SetCellValue(list[i].Prices.ToString());
rowtemp.CreateCell().SetCellValue(list[i].Status == ? "待审核" : list[i].Status == ? "已审核待收货" : list[i].Status == ? "已收货已完成" : "取消审核不通过");
rowtemp.CreateCell().SetCellValue(list[i].CreateDate.ToString("yyyy-MM-dd"));
rowtemp.CreateCell().SetCellValue(list[i].DeliveryTime.ToString("yyyy-MM-dd HH:mm"));
rowtemp.CreateCell().SetCellValue("");
}
var guid = Guid.NewGuid().ToString();
DownLoadHelper.SetCache(guid, book);
return Json(guid, JsonRequestBehavior.AllowGet);
#endregion
}
public void OutExcel(string guid)
{
object obj = DownLoadHelper.GetCache(guid);
NPOI.HSSF.UserModel.HSSFWorkbook book = obj as NPOI.HSSF.UserModel.HSSFWorkbook;
if (book != null)
{
//写入到客户端
MemoryStream ms = new MemoryStream();
book.Write(ms);
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
Response.BinaryWrite(ms.ToArray());
book = null;
ms.Close();
ms.Dispose();
}
DownLoadHelper.RemoveAllCache(guid);
}
就是在Controller不支持直接导出Excel的时候 分两步骤 1: 要先将导出内容保存在缓存中 2: 利用ajax的重定向再将Excel数据导出
下面是DownLoadHelper类方法:
public class DownLoadHelper
{
#region 获取缓存
public static object GetCache(string cacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[cacheKey];
}
#endregion #region 设置数据缓存
public static void SetCache(string cacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(cacheKey, objObject);
} public static void SetCache(string cacheKey, object objObject, TimeSpan timeOut)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
} public static void SetCache(string cacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(cacheKey, objObject, null, absoluteExpiration, slidingExpiration);
} #endregion #region 移除数据缓存
public static void RemoveAllCache(string cacheKey)
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
_cache.Remove(cacheKey);
} public static void RemoveAllCache()
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator cacheEnum = _cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
_cache.Remove(cacheEnum.Key.ToString());
}
}
#endregion
}
希望能对遇到此类问题的朋友有所帮助!
MVC中用NPOI导出Excel相关问题的更多相关文章
- ASP.NET MVC 使用NPOI导出Excel 无法访问已关闭的流(转)
第一步重写MemoryStream , 让它不能自动关闭. //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public ...
- asp.net Mvc 使用NPOI导出Excel文件
1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...
- 共享一个MVC通过NPOI导出excel的通用方法
public static System.IO.MemoryStream ExportExcel<T>(string title, List<T> objList, param ...
- NPOI导出excel(带图片)
近期项目中用到Excel导出功能,之前都是用普通的office组件导出的方法,今天尝试用下NPOI,故作此文以备日后查阅. 1.NPOI官网http://npoi.codeplex.com/,下载最新 ...
- 使用NPOI导出Excel文件
使用NPOI导出Excel文件,本实例使用了ASP.NET MVC. 1.使用NPOI导出Excel文件 实例:导出商品列表. 要求:1.通过NPOI导出导出商品列表信息: 2.使用Excel函数计算 ...
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- Asp.Net 使用Npoi导出Excel
引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...
- NPOI导出EXCEL 打印设置分页及打印标题
在用NPOI导出EXCEL的时候设置分页,在网上有查到用sheet1.SetRowBreak(i)方法,但一直都没有起到作用.经过研究是要设置 sheet1.FitToPage = false; 而 ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
随机推荐
- golang bufio.Scanner
一, 我们一般会这么用,接收 标准输入的东西: scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scann ...
- 在ionic3+angular4项目中添加自定义图标
在阿里图标库下载自己所需要的图标解压为一下目录 把iconfont.xx文件全部放到src/assets/fonts/文件夹下,可以全部替换里面的文件,但是要把之前iconfont.css文件下的文件 ...
- VS2013诡异问题,虚方法、泛型,通通躺枪
最近在调代码,发现一个很诡异的问题,简单复原一下 创建4.0控制台项目 以下代码 class Program { static void Main(string[] args) { var item ...
- Javascript的构造函数和constructor属性
原型链 function Foo() { this.value = 42;}Foo.prototype = { method: function() {}}; function Bar() {} // ...
- 使用YUM安装MySQL 5.5(适用于CentOS6.2/5.8及Fedora 17/16平台)
目前CentOS/Red Hat (RHEL) 6.2官方自带的mysql版本为5.1,mysql5.5已经出来了. 相比mysql5.1,mysql5.5不仅在多个方面进行了改进: 性能上有了很大提 ...
- jQuery比较时间处理过程(日期转换为时间戳比较)
不管在JS中还是PHP中,终会遇到时间比较,但是很尴尬的是,举个例子,2017-04-12和2017-5-21是不一样或者说不能比较的,这在PHP和JS都是这种情况,这种情况怎么办呢,换成统一的格式比 ...
- Centos时间查看修改命令date详解
1.查看.修改Linux时区与时间 一.linux时区的查看与修改 1,查看当前时区date -R 2,修改设置时区方法1:tzselect 方法2:仅限于RedHat Linux 和 CentOSt ...
- C3P0数据库连接池的java实现
1.配置准备 导入jar包 c3p0-0.9.2-pre1.jar mchange-commons-0.2.jar 数据库驱动包,如:mysql-connector-java-5.1.28-bin.j ...
- Struts2 学习(三)
一.访问Servlet API 的三种方式 1.什么是 Action 访问 Servlet 的 API 1.访问 Servlet 的API: 1.获取 request 对象. 2.接受请求参数. 3. ...
- MySQL:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
错误 原因:可能是服务没有启动 以管理员身份打开cmd 输入 net start mysql