使用NPOI的库进行Excel导出操作

公共帮助类:

 using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web; namespace Common.Helper
{
/// <summary>
/// 创建人员:杨汨
/// 创建时间:2017-05-10
/// 创建说明:Excel 帮助类
/// </summary>
public static class ExcelHelper
{
//列宽的预留宽度
private const int WID = ; #region DataTable 操作
/// <summary>
/// 将DataTable 转换为 HSSFWorkbook Excel
/// </summary>
/// <param name="dt">数据源 DataTable</param>
/// <returns>HSSFWorkbook</returns>
public static HSSFWorkbook WriteTableToBook(DataTable dt, string sheetName = "Sheet1")
{
HSSFWorkbook book = new HSSFWorkbook();
if (dt == null || dt.Rows.Count <= )
{
return book;
}
try
{
ISheet sheet = book.CreateSheet(sheetName); DataColumnCollection cols = dt.Columns;
int rIndex = ;
//设置表头
ICellStyle style = GetHeaderStyle(book);
IRow rowHeader = sheet.CreateRow(rIndex);
for (int j = ; j < cols.Count; j++)
{
ICell cell = rowHeader.CreateCell(j);
cell.CellStyle = style;
cell.SetCellValue(cols[j].ColumnName);
}
//设置内容
rIndex++;
string val = null;
for (int i = rIndex; i < (dt.Rows.Count + rIndex); i++)
{
IRow row = sheet.CreateRow(i);
for (int j = ; j < cols.Count; j++)
{
ICell cell = row.CreateCell(j);
cell.SetCellType(GetCellType(cols[j].DataType));
val = dt.Rows[i - rIndex][cols[j].ColumnName].ToString();
cell.SetCellValue(val);
sheet.SetColumnWidth(j, (Encoding.UTF8.GetBytes(val).Length + WID) * );
}
}
}
catch (Exception ex)
{
throw;
}
return book;
} /// <summary>
/// 将DataTable 转换为 MemoryStream 的 Excel
/// </summary>
/// <param name="dt">数据源 DataTable</param>
/// <returns>MemoryStream</returns>
public static MemoryStream WriteTableToStream(DataTable dt, string sheetName = "Sheet1")
{
MemoryStream ms = new MemoryStream();
HSSFWorkbook book = WriteTableToBook(dt,sheetName);
book.Write(ms);
return ms;
} /// <summary>
/// 自定义设置表格表头名称
/// </summary>
/// <param name="dt"></param>
/// <param name="dicNames"></param>
public static void SetColName(DataTable dt , Dictionary<string,string> dicNames)
{
foreach (var key in dicNames.Keys)
{
dt.Columns[key].ColumnName = dicNames[key];
}
} #endregion #region List 集合操作
/// <summary>
/// 将集合写入 HSSFWorkbook 的Excel
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">数据集合</param>
/// <param name="sheetName">sheet名称</param>
/// <returns>HSSFWorkbook</returns>
public static HSSFWorkbook WriteListToBook<T>(List<T> list, string sheetName = "Sheet1")
{
HSSFWorkbook book = new HSSFWorkbook();
if (list == null || list.Count <= )
{
return book;
}
Type t = typeof(T);
PropertyInfo[] props = t.GetProperties(); ISheet sheet = book.CreateSheet(sheetName); int rIndex = ; //创建头
ICellStyle style = GetHeaderStyle(book);
IRow rowHeader = sheet.CreateRow(rIndex);
for (int i = ; i < props.Length; i++)
{
ICell cell = rowHeader.CreateCell(i);
cell.CellStyle = style;
cell.SetCellValue(props[i].Name);
} rIndex++;
string val = null;
foreach (T item in list)
{
IRow row = sheet.CreateRow(rIndex++);
for (int i = ; i < props.Length; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellType(GetCellType(props[i].PropertyType));
val =props[i].GetValue(item,null).ToString();
cell.SetCellValue(val);
sheet.SetColumnWidth(i, (Encoding.UTF8.GetBytes(val).Length + WID) * );
}
}
return book;
} /// <summary>
/// 将集合写入MemoryStream 的Excel
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">数据集合</param>
/// <param name="sheetName">sheet名称</param>
/// <returns>MemoryStream</returns>
public static MemoryStream WriteListToStream<T>(List<T> list, string sheetName = "Sheet1")
{
HSSFWorkbook book = WriteListToBook(list, sheetName);
MemoryStream ms = new MemoryStream();
book.Write(ms);
return ms;
}
#endregion #region 内部方法 /// <summary>
/// 获取单元格存储类型
/// </summary>
/// <param name="t">C# 类型</param>
/// <returns>CellType</returns>
private static CellType GetCellType(Type t)
{
switch (t.ToString().ToLower())
{
case "string":
return CellType.String;
case "int16":
case "int32":
case "int64":
return CellType.Numeric;
case "boolean":
return CellType.Boolean;
default:
return CellType.String;
}
} /// <summary>
/// 获取表头样式
/// </summary>
/// <param name="book"></param>
/// <returns></returns>
private static ICellStyle GetHeaderStyle(HSSFWorkbook book)
{
//设置表头
IFont font = book.CreateFont();
//font.Boldweight= (short)FontBoldWeight.Bold;
font.IsBold = true;
font.FontHeightInPoints = ;
ICellStyle style = book.CreateCellStyle();
style.SetFont(font);
return style;
}
#endregion }
}

在MVC的控制器中进行导出

 public ActionResult ExcelOut()
{
//从业务层获取需要导出的DataTable类型的数据
DataTable dt = BIZ_EDU_FLOW_BLL.Instance.GetChargedList();
if (dt != null)
{
//dt 的自定义二次操作
ReconstructionTable(dt);
}
else
{
dt = new DataTable();
}
MemoryStream ms = Common.Helper.ExcelHelper.WriteTableToStream(dt);
string fileName = "已收费学员信息-" + DateTime.Now.ToString("yyyy-MM-dd_HHmmss") + ".xls";
//ms.Seek(0, SeekOrigin.Begin);
//File(ms, "application/ms-excel", fileName); //这种方式下载的时候必须使用 ms.Seek();
return File(ms.ToArray(), "application/ms-excel", Url.Encode(fileName));
}
         /// <summary>
/// 自定义重构DataTable
/// </summary>
/// <param name="dt"></param>
private static void ReconstructionTable(DataTable dt)
{
dt.Columns.Add("JYJBStr", typeof(string));
dt.Columns.Add("JYLXStr", typeof(string));
dt.Columns.Add("JYZTStr", typeof(string));
dt.Columns.Add("ZFFSStr", typeof(string));
foreach (DataRow dr in dt.Rows)
{
dr["JYJBStr"] = dr["JYJB"].ToString() == "" ? "普通" : "重点";
dr["JYLXStr"] = dr["JYLX"].ToString() == "" ? "满分" : "审验";
dr["JYZTStr"] = BLL.ParaDict.JYZT[dr["JYZT"].ToString()];
dr["ZFFSStr"] = dr["ZFFS"].ToString() == "" ? "现金" : "Pos刷卡";
}
dt.Columns.Remove("JYJB");
dt.Columns.Remove("JYLX");
dt.Columns.Remove("JYZT");
dt.Columns.Remove("ZFFS"); //dt 的自定义二次操作
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("ID", "序号");
dic.Add("XM", "姓名");
dic.Add("SFZH", "身份证号");
dic.Add("JYJBStr", "教育级别");
dic.Add("JYLXStr", "教育类型");
dic.Add("LXDH", "联系电话");
dic.Add("JYZTStr", "教育状态");
dic.Add("JE", "金额");
dic.Add("SFR", "收费人");
dic.Add("SFSJ", "收费时间");
dic.Add("ZFFSStr", "支付方式");
Common.Helper.ExcelHelper.SetColName(dt, dic);
}

NPOI 导出Excel 数据方式的更多相关文章

  1. NPOI 导出excel数据超65535自动分表

    工作上遇到的问题,网上找了一些资料 整理了一个比较可行的解决方案. NPOI 大数据量分多个sheet导出 代码段 /// <summary> /// DataTable转换成Excel文 ...

  2. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  3. Asp.Net 使用Npoi导出Excel

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

  4. .NET NPOI导出Excel详解

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

  5. Npoi导出excel整理(附源码)

    前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...

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

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

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

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

  8. NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...

  9. 使用NPOI读取Excel数据到DataTable

    如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...

随机推荐

  1. Java NIO系列教程(九) ServerSocketChannel

    Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样.ServerSocketChannel类在 jav ...

  2. com.alibaba.fastjson.JSON对类对象的序列化与反序列化

    1. 目标 把类的对象存储到字符串可存储 2. 类定义 public interface JsonInterface { } mport com.alibaba.fastjson.JSON; impo ...

  3. mac 入门操作

    1. 打开制定目录 在finder里使用command+shift+g 快捷键可以完成到达某路径的操作选中文件/目录,显示简介可以查看路径 2. home end pageUp pageDown 在苹 ...

  4. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  5. Java转义emoji等特殊符号

    写在前面 网上找了很多转emoji等方法,大多有两种方法 更改数据库编码格式为utf8mb4 过滤字符串中的emoji 都不是很优雅 更改数据库编码,势必影响其他数据库 过滤emoj效率比较低 处理E ...

  6. .38-浅析webpack源码之读取babel-loader并转换js文件

    经过非常非常长无聊的流程,只是将获取到的module信息做了一些缓存,然后生成了loaderContext对象. 这里上个图整理一下这节的流程: 这一节来看webpack是如何将babel-loade ...

  7. .37-浅析webpack源码之事件流make(4)

    赶紧完结这个系列咯,webpack4都已经出正式版了. 之前的代码搜索到js文件的对应loader,并添加到了对象中返回,流程如下: this.plugin("factory", ...

  8. ASCX呼叫ASPX.CS的方法

    为了安全设计,一般情况之下,改用为接口(interface). 在网页中实现这个接口: 用户控件: 当然,把用户控件ascx拉至网页之后,在用户控件的linkbutton的click事件,就可以呼叫至 ...

  9. MFC进程的创建销毁、线程的创建与交互

    进程的创建 STARTUPINFO si; //**成员DWORD dwFlags;表示结构体当中哪些成员有效.**STARTF_USESHOWWINDOW|STARTF_USEPOSITION PR ...

  10. HTML 常用小技巧 【标题图标】【锚点】【插入音乐,视频】【滚动效果】【嵌入网页】

    一 在原页面嵌入其他页面 使用iframe框架 < iframe >------ < / iframe > <iframe  src="要放在框架里面的网址或文 ...