npoi库是当下最流行的处理Excel、Word、PPT等Office文件格式

npoi的下载地址:http://npoi.codeplex.com/
npoi的官方学习地址: http://www.npoi.info/page/3
今天遇到一个需求,就是把下面的数据结构导出成Excel文件,不说了,先上数据模型(下面的模型仅仅是从实际模型中抽离出来为演示使用的)如下所示:
/// <summary>
/// 线下活动商品模型
/// </summary>
public class OffLineCart
{
/// <summary>
///
/// </summary>
public OffLineCart()
{
}
/// <summary>
/// 商品Id
/// </summary>
public string ProductId { get; set; }
/// <summary>
/// SKUId
/// </summary>
public string SkuId { get; set; }
/// <summary>
/// 商品现价
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 商品数量
/// </summary>
public int Qty { get; set; }
}
/// <summary>
/// 线下活动提交订单集合
/// </summary>
public class OffLineOrderListModel
{
public OffLineOrderListModel()
{
}
/// <summary>
/// 子订单集合
/// </summary>
public IList<OffLineCart> OffLineCartList { get; set; }
/// <summary>
/// 子订单集合总价
/// </summary>
public decimal TotalPrice {
get
{
if (OffLineCartList.Count > 0)
{
var totalprice = OffLineCartList.Sum(q => q.Price * q.Qty);
return totalprice;
}
return 0;
}
}
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 手机号
/// </summary>
public string Phone { get; set; }
/// <summary>
/// 地推码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 收货地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
需求是这样的就是把OffLineOrderListModel(订单模型)中的OffLineCart(订单商品详情)一行行的导出到Excel,而OffLineOrderListModel其他的字段中导出一行就行了,说白了就是OffLineOrderListModel的其他字段合并单元格就可以了;
因为一直以前导出Excel一直是使用EPPlus(http://www.cnblogs.com/liudeyun/p/3535740.html),我也是第一次使用npoi操作,发现一般都是通过DataTable导出的,我的数据格式是List集合,需要通过装换才可以导出,觉得麻烦,于是就写了,主要的导出代码如下:
/// <summary>
/// 导出对应的订单集合
/// </summary>
/// <param name="offLineOrderListModelList"></param>
/// <param name="strHeaderText">表头文本</param>
public static MemoryStream DataTableToExcel(List<OffLineOrderListModel> offLineOrderListModelList , string strHeaderText)
{
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
//excel总共有11列
string[] columnarr = new string[]
{
"收货人姓名",
"收货人手机",
"收货人邮箱",
"收货人地址",
"销售人员编码",
"订单号",
"订单生成时间",
"地推版本号", //订单商品拆分,其余的订单信息单元格合并
"订单商品Id",
"订单商品SKUId",
"订单商品数量",
"订单商品单价", "订单总价"
};
HSSFRow firstRow = (HSSFRow)sheet.CreateRow(0);
firstRow.Height = 25*25;
//头标颜色标识
for (int i = 0; i < columnarr.Length; i++)
{
firstRow.CreateCell(i).CellStyle = GetCellStyle(workbook);
firstRow.CreateCell(i).SetCellValue(columnarr[i]);
} #region 设置各列的宽度 sheet.SetColumnWidth(0, 15 * 256);
sheet.SetColumnWidth(1, 15 * 256);
sheet.SetColumnWidth(2, 25 * 256);
sheet.SetColumnWidth(3, 30 * 256);
sheet.SetColumnWidth(4, 15 * 256);
sheet.SetColumnWidth(5, 25 * 256);
sheet.SetColumnWidth(6, 25 * 256);
sheet.SetColumnWidth(7, 25 * 256);
sheet.SetColumnWidth(8, 35 * 256);
sheet.SetColumnWidth(9, 35 * 256);
sheet.SetColumnWidth(10, 15 * 256);
sheet.SetColumnWidth(11, 15 * 256);
sheet.SetColumnWidth(12, 15 * 256); #endregion int rowIndex = 1;
foreach (OffLineOrderListModel offLineOrderListModel in offLineOrderListModelList)
{
foreach (var offLineCart in offLineOrderListModel.OffLineCartList)
{
int col = 0; HSSFRow aotherRow = (HSSFRow)sheet.CreateRow(rowIndex);
aotherRow.Height = 22*22;
aotherRow.CreateCell(col).SetCellValue(offLineOrderListModel.Name);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.Phone);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.Email);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.Address);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.Code);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.OrderNo);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"));
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.Version);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineCart.ProductId);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineCart.SkuId);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineCart.Qty);
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineCart.Price.ToString("N"));
col++;
sheet.GetRow(rowIndex).CreateCell(col).SetCellValue(offLineOrderListModel.TotalPrice.ToString("N"));
rowIndex++; }
//合并订单基本信息单元格
//要合并的单元格
string[] mergedCellStringArr = new[]
{
"收货人姓名",
"收货人手机",
"收货人邮箱",
"收货人地址",
"销售人员编码",
"订单号",
"订单生成时间",
"地推版本号"
};
for (int i = 0; i < mergedCellStringArr.Length; i++)
{ Region region = new Region(rowIndex-offLineOrderListModel.OffLineCartList.Count, i, rowIndex-1, i);
sheet.AddMergedRegion(region);
}
//合并订单总价单元格
sheet.AddMergedRegion(new Region(rowIndex - offLineOrderListModel.OffLineCartList.Count, columnarr.Length-1, rowIndex - 1, columnarr.Length-1)); }
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
//为什么会无法释放呢
//sheet.Dispose();
//workbook.Dispose();
workbook = null;
return ms;
}
}

  

最后的结果就是这样的:
只不过合并单元格后,设置了单元格水平和垂直居中,没有反应!
由于我是菜鸟,可能描述的不好,请大神们见谅,也请大神们批评指正,谢谢!

利用npoi导出Excel的更多相关文章

  1. C#利用NPOI导出Excel类(简单版)

    代码: using System.Data; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; namespac ...

  2. DateTable利用NPOI导出Excel 公共方法

    protected void Export_Excel(DataTable dt) { string filename = "学生基本信息.xls"; ) { filename = ...

  3. NPOI导出Excel(含有超过65335的处理情况)

    NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...

  4. 在服务端C#如何利用NPOI构建Excel模板

    目前本人接触过两种模板导出的方式:(1)C#利用NPOI接口制作Excel模板,在服务端用数据渲染模板(2)在前端利用前人搭建好的框架,利用office编写xml制作模板,在客户端进行数据的渲染,导出 ...

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

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

  6. Asp.Net 使用Npoi导出Excel

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

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

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

  8. .NET NPOI导出Excel详解

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

  9. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

随机推荐

  1. filesort是通过相应的排序算法

    filesort是通过相应的排序算法,将取得的数据在max_length_for_sort_data的默认值是1024. --------------------------------------- ...

  2. React组件生命周期过程说明

    来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...

  3. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

  4. c#变量缺少using引用,如何快速加上using,加Using的快捷键[bubuko.com]

    在vs的“工具”->“选项”中,左侧树形菜单,“环境”下的“键盘”中设置快捷键. 在“显示命令包含”输入框内输入“显示智能标记”,找到“视图.显示智能标记”,可以看到该命令的快捷键已经分配了2个 ...

  5. rails下自动更新静态文件的gem包

    https://github.com/guard/guard-livereload gemfile group :development do gem 'guard-livereload', '~&g ...

  6. 扫描二维码自动识别手机系统(Android/IOS)

    移动互联网发展迅速,各种APP的开发都会推出多个版本(多终端),比如:iPhone版.iPad版.Android版.有些APP还会考虑覆盖到多个国家(国际化),比如:中文版.英文版.日文版.韩文版等. ...

  7. SQL Server 2008中的数据压缩

    SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁 盘IO,提升查询的性能.当然,凡 ...

  8. 自己写的基于bootstrap风格的弹框插件

    自己写的一款基于bootstrap风格的弹框插件,暂时只有确认框.提示框.后续功能扩展.bug修改再更新. ;(function($){ //默认参数 var PARAMS; var DEFAULTP ...

  9. Ubuntu1404 (2)

    1.启动远程桌面 (1)设置桌面共享:usr->share->applications->桌面共享,勾选"允许查看桌面"和"允许控制桌面",& ...

  10. iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用

    一.什么是cloudKit 移动开发中,网络请求数据是日常中用到的,我们习惯把一些用户改动的数据存在服务器,以便下次请求使用.或者开发者方通过服务器将编辑的数据发送给用户.但是这一切都建立在我们的AP ...