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内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
随机推荐
- 详解C#委托和事件(二)
一.当我们使用关键字delegate声明一个自定义委托类型时,实际上是声明了一个该名称的类类型,继承自抽象类System.MulticastDelegate,还包含实例方法Invoke.BeginIn ...
- java学习碰到死胡同了
一个月前看了java的异常处理,有点凌乱,各种异常好不习惯,特别是那个throws和throw,现在好多了,编程中使用打异常抛出没啥问题了,只是线程和输出输入流又遇到问题了,线程刚学,了解了Threa ...
- 即时通讯App怎样才能火?背后的技术原理,可以从这5个角度切入
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 社交场景 ...
- Java中数据类型转换大全(个人总结)
一.字符串转换为其他类型 1.将字符串转化为int型 (1)方法一 int i = Integer.parseInt(String str); (2)方法二 int i = Integer.value ...
- 数组filter()参数详解,巧用filter()数组去重
数组方法挺多,但是用来用去可能也就foreach,splice以及slice接触较多,filter()说实话之前也没过多了解.其实filter()为数组提供过滤功能,它会遍历数组所有元素,并返回满足条 ...
- 拓展KMP算法详解
拓展KMP解决的问题是给两个串S和T,长度分别是n和m,求S的每一个后缀子串与T的最长公共前缀分别是多少,记作extend数组,也就是说extend[i]表示S[i,n-1](i从0开始)和T的最长公 ...
- Spark入门——什么是Hadoop,为什么是Spark?
#Spark入门#这个系列课程,是综合于我从2017年3月分到今年7月份为止学习并使用Spark的使用心得感悟,暂定于每周更新,以后可能会上传讲课视频和PPT,目前先在博客园把稿子打好.注意:这只是一 ...
- (转) C# Async与Await的使用
(转) C# Async与Await的使用 class Program { static void Main(string[] args) { Console.WriteLine("主线程测 ...
- MySQL练习题及答案
一.现有三张数据库表,分别为部门表.员工表.部门和员工关系表 1.部门表CREATE TABLE `t_dept` ( `id` int(8) NOT NULL AUTO_INCREMENT, `de ...
- java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.String(Short类型无法强转成String类型)
有一行Java代码如下: String code1 = (String)qTable1.getValueAt(i, 0); 这是一个Java的图形界面获取表格中值的代码,其中qTable1.getVa ...