使用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. linux 文件句柄数查看命令

    当你的服务器在大并发达到极限时,就会报出“too many open files”. 查看线程占句柄数ulimit -a 输出如下:core file size (blocks, -c) 0data ...

  2. scala-传名函数和传值函数

    Scala的解释器在解析函数参数(function arguments)时有两种方式:先计算参数表达式的值(reduce the arguments),再应用到函数内部:或者是将未计算的参数表达式直接 ...

  3. maven-compiler-plugin 指定jdk的版本和编码

    为了让maven的jdk编译版本一致, 使用maven-compiler-plugin插件来协助管理 建议新建maven项目后的第一步就是配置该插件 <build> <plugins ...

  4. 生成对抗网络(GAN)

    基本思想 GAN全称生成对抗网络,是生成模型的一种,而他的训练则是处于一种对抗博弈状态中的. 譬如:我要升职加薪,你领导力还不行,我现在领导力有了要升职加薪,你执行力还不行,我现在执行力有了要升职加薪 ...

  5. WPF中的Visual Tree和Logical Tree与路由事件

    1.Visual Tree和Logical TreeLogical Tree:逻辑树,WPF中用户界面有一个对象树构建而成,这棵树叫做逻辑树,元素的声明分层结构形成了所谓的逻辑树!!Visual Tr ...

  6. mysql 获取自增主键

    MyBatis 3.2.6插入时候获取自增主键方法有二 以MySQL5.5为例: 方法1: <insert id="insert" parameterType="P ...

  7. linux编译找不到aprt apr-util

    Linux很多地方编译的时候都会用到apr 如果找不到apr就会报错 configure: WARNING: APR not found The Apache Portable Runtime (AP ...

  8. 网络之NSURLSession

    NSUrlSession参考的这篇博客,自己也调试了它的代码:http://www.it165.net/pro/html/201406/15223.html ,对NSUrlSession还不太理解,先 ...

  9. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

  10. 深入出不来nodejs源码-V8引擎初探

    原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...