NPOI 导出Excel 数据方式
使用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 数据方式的更多相关文章
- NPOI 导出excel数据超65535自动分表
工作上遇到的问题,网上找了一些资料 整理了一个比较可行的解决方案. NPOI 大数据量分多个sheet导出 代码段 /// <summary> /// DataTable转换成Excel文 ...
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
- Asp.Net 使用Npoi导出Excel
引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
- Npoi导出excel整理(附源码)
前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTab ...
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- NPOI导出Excel(含有超过65335的处理情况)
NPOI导出Excel的网上有很多,正好自己遇到就学习并总结了一下: 首先说明几点: 1.Excel2003及一下:后缀xls,单个sheet最大行数为65335 Excel2007 单个sheet ...
- NPOI导出Excel示例
摘要:使用开源程序NPOI导出Excel示例.NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/. 示例编写 ...
- 使用NPOI读取Excel数据到DataTable
如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
随机推荐
- 插入排序:直接插入排序&希尔排序
一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...
- input输入框file类型第二次不触发onchange事件的解决办法,简单有效
在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上: 解决办法:拷贝一份input标签的副本,每次选择后对原input ...
- webstorm取消扫描某文件夹,加快打开速度,例如忽略node_modules目录
方法1.如下图所示(只对当前项目有效) 或者 如果要使用这种方法,一种是还没安装依赖的时候先创建node_modules目录然后打开webstorm设置好excluded再安装:另一种是已经安装了依赖 ...
- NPM的正确使用方式
registry配置 npm registry原意为记录.登记.登记处的意思,这里指的也就是node包存放的服务器地址. 查看registry -> npm config get registr ...
- C# Owin 创建与测试自己的中间件Middleware(二)
本文纯属介绍怎么简单地创建自己的Owin.还没有理解owin概念的请看上一篇文章:http://www.cnblogs.com/alunchen/p/7049307.html 目录 1.创建项目 2. ...
- 【MongoDB-query查询条件】
在上一篇中简要使用了C# 对MongoDB进行数据操作,这里补充一些MongoDB query查询条件文档: Query.All("name", "a",&qu ...
- Navicat相关应用及注意事项
一.MySQL数据类型 1.数值型 SMALLINT: 2个字节 INT: 4个字节 // age int(10) INTEGER:INT的同义词 BIGINT : 8个字节 FLOAT : ...
- 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理
一:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对象中,相当于一个许可证.拿到许可证即可以进行操作,没有拿到则需 ...
- spring boot aop 报错
1.控制台报错 Pointcut is not well-formed: expecting 'name pattern' at character position 33 execution(com ...
- 新建hadoop用户以及用户组,给予sudo权限
1.首先新建用户,adduser命令 sudo adduser hadoop passwd hadoop 输入密码之后,一路 y 确定. 2.添加用户组 在创建hadoop用户的同时也创建了hadoo ...