NPOI使用Datatable导出到Excel
首先要引用dll
下载地址:http://pan.baidu.com/s/1dFr2m
引入命名空间:
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
这三个就好了。
代码一:
/// <summary>
/// 创建工作簿
/// </summary>
/// <param name="fileName">下载文件名</param>
/// <param name="dt">数据源</param>
public static void CreateSheet(string fileName, DataTable dt)
{
HSSFWorkbook workbook = new HSSFWorkbook();
MemoryStream ms = new MemoryStream(); //创建一个名称为Payment的工作表
ISheet paymentSheet = workbook.CreateSheet("游戏得分用户表"); //数据源
DataTable tbPayment = dt; #region 头部标题
IRow paymentHeaderRow = paymentSheet.CreateRow(0); ICell cell = paymentHeaderRow.CreateCell(0);
cell.SetCellValue("游戏得分用户信息");
ICellStyle style = workbook.CreateCellStyle(); style.Alignment = HorizontalAlignment.CENTER;
IFont font = workbook.CreateFont();
font.FontHeight = 20 * 20;
font.Color = HSSFColor.RED.index;
style.SetFont(font); //合并单元格,以下是合并第一行五列
paymentSheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 4));
cell.CellStyle = style;
int rowsNum = 1;
paymentHeaderRow = paymentSheet.CreateRow(rowsNum); paymentHeaderRow.CreateCell(0, CellType.STRING).SetCellValue("用户名");
paymentHeaderRow.CreateCell(1, CellType.STRING).SetCellValue("手机号码");
paymentHeaderRow.CreateCell(2, CellType.NUMERIC).SetCellValue("得分");
paymentHeaderRow.CreateCell(3, CellType.STRING).SetCellValue("创建时间");
//paymentHeaderRow.CreateCell(4,CellType.STRING).SetCellValue("IP");
#endregion //循环添加标题
//foreach (DataColumn column in tbPayment.Columns)
// paymentHeaderRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); // 内容
int paymentRowIndex = 2;
foreach (DataRow row in tbPayment.Rows)
{
IRow newRow = paymentSheet.CreateRow(paymentRowIndex); //循环添加列的对应内容
foreach (DataColumn column in tbPayment.Columns)
{
newRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
} paymentRowIndex++;
} //列宽自适应,只对英文和数字有效
for (int i = 0; i <= dt.Rows.Count; i++)
{
paymentSheet.AutoSizeColumn(i);
}
//获取当前列的宽度,然后对比本列的长度,取最大值
for (int columnNum = 0; columnNum <= dt.Rows.Count; columnNum++)
{
int columnWidth = paymentSheet.GetColumnWidth(columnNum) / 256;
for (int rowNum = 1; rowNum <= paymentSheet.LastRowNum; rowNum++)
{
IRow currentRow;
//当前行未被使用过
if (paymentSheet.GetRow(rowNum) == null)
{
currentRow = paymentSheet.CreateRow(rowNum);
}
else
{
currentRow = paymentSheet.GetRow(rowNum);
} if (currentRow.GetCell(columnNum) != null)
{
ICell currentCell = currentRow.GetCell(columnNum);
int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
if (columnWidth < length)
{
columnWidth = length;
}
}
}
paymentSheet.SetColumnWidth(columnNum, columnWidth * 256);
} //将表内容写入流 通知浏览器下载
workbook.Write(ms);
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", fileName));
System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray()); //进行二进制流下在 workbook = null;
ms.Close();
ms.Dispose();
}
代码二:
/// <summary>
/// List集合转变成Datatable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public DataTable ConvertToDataSet<T>(IList<T> list)
{
if (list == null || list.Count <= 0)
{
return null;
} DataTable dt = new DataTable(typeof(T).Name);
DataColumn column;
DataRow row;
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("UserPhone", typeof(string));
dt.Columns.Add("Score", typeof(int));
dt.Columns.Add("CreateDate", typeof(DateTime));
//dt.Columns.Add("CreateIP", typeof(string)); System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); foreach (T t in list)
{
if (t == null)
{
continue;
} row = dt.NewRow(); for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
{
System.Reflection.PropertyInfo pi = myPropertyInfo[i]; string name = pi.Name; if (dt.Columns[name] == null)
{
column = new DataColumn(name, pi.PropertyType);
dt.Columns.Add(column);
} row[name] = pi.GetValue(t, null);
} dt.Rows.Add(row);
} return dt;
}
代码三:
protected void btnExport_Click(object sender, EventArgs e)
{
var ss = ydc.GameScore.OrderByDescending(g => g.Score).GroupBy(g => g.UserPhone).Select(g => g.First()).ToList();
List<GameModel> gList = new List<GameModel>();
foreach (var item in ss)
{
GameModel gm = new GameModel();
gm.UserName = item.UserName;
gm.UserPhone = item.UserPhone;
gm.Score = item.Score;
gm.CreateDate = item.CreateDate;
//gm.CreateIP = item.CreateIP;
gList.Add(gm);
} //导出时避免没有数据而报错
if (gList.Count() > 0)
{
//导出成Excel
CreateSheet("gameScore", ConvertToDataSet(gList));
}
else
{
StringHelper.Alert(this, "没有数据不能进行导出操作!", "");
} }
NPOI使用Datatable导出到Excel的更多相关文章
- Npoi List DataTable导出一个Excel多个sheet 下载
参考: http://blog.csdn.net/zhouqinghe24/article/details/8649346 参考下载http://www.cnblogs.com/dyllove98/a ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- NPOI通过DataTable导出和读取Excel
Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...
- DataTable导出到Excel
简单的导出到Excel中: 代码如下: using System; using System.Collections.Generic; using System.Data; using System. ...
- DataTable 导出到 Excel 类
底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...
- c# DataTable导出为excel
/// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...
- C# datatable 导出到Excel
datatable导出到Excel /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <pa ...
- csv/json/list/datatable导出为excel的通用模块设计
导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...
- DataTable导出到Excel(.NET 4.0)
最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...
随机推荐
- 异步加载AsyncTask
private void huodeshuju() { new AsyncTask<String, Void, String>() { @Overrid ...
- java abstract类和abstract方法
Example5_12.java abstract class A { abstract int add(int x,int y); int sub(int x,int y) { return x-y ...
- jq中的ajax
jq对ajax进行了封装,在jq中$.ajax()方法是最底层的方法,第二层是load() , get() , post()方法,第三层是$.getScript()和$.getJSON().基本第二种 ...
- LayoutParams 命名的时候,最好用与子控件相关的字符串命名,
@Override public View initView() { RelativeLayout container = new RelativeLayout(UIUtils.getContext( ...
- C++读取excel特定行列中的数据
可以通过COM API调用才是正解,不过需要编写COM接口类,Excel对象库的接口太多了……不过可以用工具自动生成. 我最近也在用VC操作Excel,在VC中可以这样做,在任何一个cpp文件中加入下 ...
- Efim and Strange Grade
Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input standa ...
- QWidget QMainWindow QDialog 三个基类的区别
Qt类是一个提供所需的像全局变量一样的大量不同的标识符的命名空间.通常情况下,你可以忽略这个类.QObject和一些其它类继承了它,所以在这个Qt命名空间中定义的所有标识符通常情况下都可以无限制的使用 ...
- Android 联网监控抓包工具的制作(tcpdump的使用)
最近做一个Android联网抓包的工具 自己在网上搜索了好久 发现还是没有头绪 于是考虑在linux层上下功夫 于是采用linux的tcpdump来实现了抓包的功能 用简单的话来定义tcpdump,就 ...
- hdu1915
对于图的东西总是一筹莫展,没办法,还是翻出以前的基础题来看看,然后慢慢分析吧.路漫漫其修远兮,吾将上下而求索…… void bfs(int x,int y){ for(int k=0;k<8;k ...
- [Big Data]hadoop分布式系统在Linux系统安装
待完善 Hadoop2.6.0部署与应用 一. 环境准备 硬件:3台虚拟机 内存:至少512MB 硬盘:至少20G 操作系统:rhel6.4 64位 最小化安装 主机名 IP(局域网) 描述 ...