使用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. koa2 接收post参数

    koa2接收Post参数由于没有在上下文对象上解析,所以需要用node 原生req解析. 获取到的参数,要注意转码问题. const Koa = require('koa'); const app = ...

  2. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二):数据库设计

    数据库设计 系统主要包含用户(sys_user).组织(sys_dept).角色(sys_role).菜单(sys_menu).角色组织(sys_role_dept).角色菜单(sys_role_me ...

  3. tensorflow 优化图

    当我们把训练好的tensorflow训练图拿来进行预测时,会有多个训练时生成的节点,这些节点是不必要的,我们需要在预测的时候进行删除. 下面以bert的图为例,进行优化 def optimize_gr ...

  4. es-05-获取 resthighlevelclient及api

    在6.x以前, 使用最多的是transportclient, 但在7.x会被废弃, 先说以前的创建方式: 具体可见:https://www.cnblogs.com/wenbronk/p/6383194 ...

  5. FutureTask源码解析

    在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和 ...

  6. Spring AOP介绍及源码分析

    转自:http://www.uml.org.cn/j2ee/201301102.asp 软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程:前者是为了提高开发效率,而后者则使用了归纳法,把 ...

  7. 利用latex制作个人简历

    转自: http://www.cnblogs.com/panpei/ 前些日子,有点无聊,就在网上逛逛技术大牛的blogs,发现很多大牛都喜欢用pdf版式的简历,发现这种版式的简历排版非常漂亮简洁.深 ...

  8. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  9. 并发编程——ConcurrentHashMap#transfer() 扩容逐行分析

    前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结果,之前的文章中,我们介绍了 putVal 方法.并发编程之 ConcurrentHashMap(JDK 1.8) pu ...

  10. Redis有序集合操作

    有序集合存储着成员和分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序的获取或扫描成员和分值的命令 (常用命令) ZADD : ZADD key-name score member [sco ...