使用npoi.dll导出数据到excel
.net数据导出excel数据有多种方法,最常用的就是使用office组件,但随之而来的问题也很棘手,又要调权限又要确定是否安装office很是麻烦,最近一个项目中也有数据导出功能,随使用excel模板完美完成功能,调试完成发布服务器,又是一通调试,最终可以导出。但是项目中不只一处要数据导出,有四个同事来做这就带来很多麻烦,大家每人都创建了很多模板(当然很多功能属同一模块的都放在一个模板中创建了若干sheet),以后维护很麻烦。于是网上搜索到了npoi,研究了一会尝试使用npoi导出数据。
首先添加npoidll引用( NPOI.dll和Ionic.Zip.dll 注: npoi版本是NPOI_1.2.5_binary)
#region NPOI导出
public MemoryStream DataMemory(DataTable dt, string headerText)
{
NOPIHelper nopi = new NOPIHelper(); MemoryStream ms = new MemoryStream();
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(headerText); #region 文件右键属性
{
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "Golden3C";
workbook.DocumentSummaryInformation = dsi;
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Author = "hbj"; //填加xls文件作者信息
si.CreateDateTime = DateTime.Now;
workbook.SummaryInformation = si;
}
#endregion #region 导出excel的名称
IRow row = sheet.CreateRow(0);
row.HeightInPoints = 30;//行高
row.CreateCell(0).SetCellValue(headerText);
sheet.GetRow(0).GetCell(0).CellStyle = nopi.SetCellStyle(workbook, 20);//设置excel单元格样式
nopi.MergedRegion(sheet, 0, 0, 0, 20);
#endregion #region 排列表头
{
string[] arrRow1 = new string[] {
"序号",
"数据类型",
"年/半年/季度/月",
"区县",
"企业名称",
"企业类型(现有、新建)",
"设计生产能力(万吨/年)",
"治污设施主体处理工艺",
"新建减排措施投运时间(XXXX年XX月)",
"产品类型(浆、机制纸及纸板、纸制品)",
"产品产量(吨)",
"废水排放量(吨)",
"排放去向",
"",
"平均出水COD浓度(mg/L)",
"",
"平均出水氨氮浓度(mg/L)",
"",
"是否有治污设施中控系统",
"是否安装在线监测仪器、数据与地方环保部门联网并通过有效性审核",
"备注"
}; IRow row1 = sheet.CreateRow(1);//第二行
row1.HeightInPoints = 20; for (int i = 0; i < arrRow1.Length; i++)
{
row1.CreateCell(i).SetCellValue(arrRow1[i]);
row1.GetCell(i).CellStyle = nopi.SetCellStyle(workbook, 10);
} string[] arrRow2 = new string[] {
"","","","","","","","","","","","",
"是否纳管",
"纳管后排入集中污水处理设施名称",
"减排措施实施前平均出水COD浓度",
"减排措施实施后平均出水COD浓度",
"减排措施实施前平均出水氨氮浓度",
"减排措施实施后平均出水氨氮浓度","","",""
}; IRow row2 = sheet.CreateRow(2);//第三行
for (int j = 0; j < arrRow2.Length; j++)
{
row2.CreateCell(j).SetCellValue(arrRow2[j]);
row2.GetCell(j).CellStyle = nopi.SetCellStyle(workbook, 10);
}
//开始合并单元格--跨行合并
nopi.MergedRegion(sheet, 1, 2, 0, 0);
nopi.MergedRegion(sheet, 1, 2, 1, 1);
nopi.MergedRegion(sheet, 1, 2, 2, 2);
nopi.MergedRegion(sheet, 1, 2, 3, 3);
nopi.MergedRegion(sheet, 1, 2, 4, 4);
nopi.MergedRegion(sheet, 1, 2, 5, 5);
nopi.MergedRegion(sheet, 1, 2, 6, 6);
nopi.MergedRegion(sheet, 1, 2, 7, 7);
nopi.MergedRegion(sheet, 1, 2, 8, 8);
nopi.MergedRegion(sheet, 1, 2, 9, 9);
nopi.MergedRegion(sheet, 1, 2, 10, 10);
nopi.MergedRegion(sheet, 1, 2, 11, 11);
nopi.MergedRegion(sheet, 1, 2, 18, 18);
nopi.MergedRegion(sheet, 1, 2, 19, 19);
nopi.MergedRegion(sheet, 1, 2, 20, 20);
//跨列合并
nopi.MergedRegion(sheet, 1, 1, 12, 13);
nopi.MergedRegion(sheet, 1, 1, 14, 15);
nopi.MergedRegion(sheet, 1, 1, 16, 17);
}
#endregion 排列表头 #region 处理列值
{
string[] arrColumn = new string[] {
"TA032_Type",
"TA032_dateTime",
"EC001_SSQXMC",
"EC101_WRYMC",
"TA032_WSCLX",
"TA032_SJSCNL",
"TA032_ZWSSGY",
"TA032_RunDate",
"TA032_ProductType",
"TA032_ProductNum",
"TA032_FSPFL",
"TA032_SFNG",
"TA032_NGHCSMC",
"TA032_CODJPSSQND",
"TA032_CODJPSSHND",
"TA032_NH3JPSSQND",
"TA032_NH3JPSSHND",
"TA032_SFYZK",
"TA032_SFYZX",
"TA032_remark"
};
for (int j = 0; j < dt.Rows.Count; j++)//循环行
{
IRow rowColumn = sheet.CreateRow(j + 3); rowColumn.CreateCell(0).SetCellValue(j + 1);//序号
rowColumn.GetCell(0).CellStyle = nopi.SetCellStyle(workbook, 10); for (int i = 1; i < arrColumn.Length - 1; i++)
{
//处理前两列(除去序号列)
if (i == 1)
{
string time = dt.Rows[j]["TA032_dateTime"].ToString();
//存储的数据类型:0=年数据;1=月数据;2=季数据,3=半年数据
if (dt.Rows[j]["TA032_Type"].ToString() == "0")
{
rowColumn.CreateCell(1).SetCellValue("年数据");
rowColumn.CreateCell(2).SetCellValue(time.Substring(0, 4) + "年");
}
else if (dt.Rows[j]["TA032_Type"].ToString() == "1")
{
rowColumn.CreateCell(1).SetCellValue("月数据");
rowColumn.CreateCell(2).SetCellValue(time.Substring(0, 4) + "年" + time.Substring(4, 2) + "月");
}
else if (dt.Rows[j]["TA032_Type"].ToString() == "2")
{
string season = "";
rowColumn.CreateCell(1).SetCellValue("季度数据");
if (time.Substring(4, 2) == "21")
season = "一季度";
else if (time.Substring(4, 2) == "22")
season = "二季度";
else if (time.Substring(4, 2) == "23")
season = "三季度";
else
season = "四季度";
rowColumn.CreateCell(2).SetCellValue(time.Substring(0, 4) + "年" + season);
}
else if (dt.Rows[j]["TA032_Type"].ToString() == "3")
{
string halfYear = "下半年";
rowColumn.CreateCell(1).SetCellValue("半年数据");
if (time.Substring(4, 3) == "306")
halfYear = "上半年";
rowColumn.CreateCell(2).SetCellValue(time.Substring(0, 4) + "年" + halfYear);
}
rowColumn.GetCell(1).CellStyle = nopi.SetCellStyle(workbook, 10);
rowColumn.GetCell(2).CellStyle = nopi.SetCellStyle(workbook, 10); }
//从第三列往后 0 1 2 3 4
switch (dt.Columns[arrColumn[i + 1]].DataType.ToString())
{
case "System.String"://字符串类型
rowColumn.CreateCell(i + 2).SetCellValue(dt.Rows[j][arrColumn[i + 1]].ToString());
break;
case "System.DateTime"://日期类型
DateTime dtime = DateTime.Parse(dt.Rows[j][arrColumn[i + 1]].ToString());
rowColumn.CreateCell(i + 2).SetCellValue(dtime.ToString("yyyy年MM月"));
break;
case "System.Boolean"://布尔型
bool boolValue = false;
bool.TryParse(dt.Rows[j][arrColumn[i + 1]].ToString(), out boolValue);
rowColumn.CreateCell(i + 2).SetCellValue(boolValue);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intValue = 0;
int.TryParse(dt.Rows[j][arrColumn[i + 1]].ToString(), out intValue);
rowColumn.CreateCell(i + 2).SetCellValue(intValue);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubValue = 0;
double.TryParse(dt.Rows[j][arrColumn[i + 1]].ToString(), out doubValue);
rowColumn.CreateCell(i + 2).SetCellValue(doubValue);
break;
case "System.DBNull"://空值处理
rowColumn.CreateCell(i + 2).SetCellValue("");
break;
default:
rowColumn.CreateCell(i + 2).SetCellValue("");
break;
} rowColumn.GetCell(i + 2).CellStyle = nopi.SetCellStyle(workbook, 10);
}
}
}
#endregion //自动设置列宽
AutoSizeColumns(sheet);
workbook.Write(ms);
ms.Flush();
ms.Position = 0; return ms;
}
#endregion NPOI导出
//***************************************************************************************************************************
//注释:排列表头中每个数组代表excel中的每一行,数组中的""作用是合并单元格,否则合并单元格后表头会很乱。
处理列值 即根据数据源dataset 和要导出的excel表头排列column,这要就不用循环去定位excel列对应dataset里的那个列
//***************************************************************************************************************************
#region 通用方法(单行or复杂表头)
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="sheet">要合并单元格所在的sheet</param>
/// <param name="rowstart">开始行的索引</param>
/// <param name="rowend">结束行的索引</param>
/// <param name="colstart">开始列的索引</param>
/// <param name="colend">结束列的索引</param>
public void MergedRegion(HSSFSheet sheet, int rowstart, int rowend, int colstart, int colend)
{
CellRangeAddress cellRangeAddress = new CellRangeAddress(rowstart, rowend, colstart, colend);
sheet.AddMergedRegion(cellRangeAddress);
sheet.SetEnclosedBorderOfRegion(cellRangeAddress, NPOI.SS.UserModel.BorderStyle.THIN, HSSFColor.BLACK.index);//需要设置边框颜色,否则左侧没有 added by sean 2014-07-28
}
/// <summary>
/// 设置单元格样式
/// </summary>
/// <param name="workbook">工作簿</param>
/// <param name="fontSize">字体大小</param>
/// <returns>样式</returns>
public ICellStyle SetCellStyle(HSSFWorkbook workbook, short fontSize)
{
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;//居中
style.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
style.WrapText = true;//自动换行
//设置字体格式
IFont font = workbook.CreateFont();
font.FontName = "宋体";//字体
font.FontHeightInPoints = fontSize;//字号
//font1.Color = HSSFColor.RED.index;//颜色
font.Boldweight = 700;//粗体
//font.IsItalic = true;//斜体
//font.Underline = (byte)FontUnderlineType.DOUBLE;//添加双下划线
style.SetFont(font);
//单元格边框
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
style.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
return style;
}
/// <summary>
/// excel文件右键属性
/// </summary>
/// <param name="workbook"></param>
public void SetFileAttribute(HSSFWorkbook workbook)
{
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "Golden3C";
workbook.DocumentSummaryInformation = dsi;
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Author = "hbj"; //填加xls文件作者信息
si.CreateDateTime = DateTime.Now;
workbook.SummaryInformation = si;
}
/// <summary>
/// 自动设置Excel列宽
/// </summary>
/// <param name="sheet">Excel表</param>
public void AutoSizeColumns(HSSFSheet sheet)
{
if (sheet.PhysicalNumberOfRows > 0)
{
IRow headerRow = sheet.GetRow(sheet.PhysicalNumberOfRows - 1);//获取最后一行,因为列是根据最后一行来排
for (int j = 0; j < headerRow.Cells.Count; j++)
{
sheet.AutoSizeColumn(j);
}
}
}
#endregion
使用npoi.dll导出数据到excel的更多相关文章
- asp.net使用MVC4框架基于NPOI做导出数据到Excel表
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
- NPOI 通用导出数据到Excel 分类: C# Helper 2014-11-04 16:06 246人阅读 评论(0) 收藏
应用场景: 在项目中,经常遇到将数据库数据导出到Excel,针对这种情况做了个程序封装.工作原理:利用NPOI将SQL语句查询出的DataTable数据导出到Excel,所见即所得. 程序界面: ...
- NPOI导出数据到Excel
NPOI导出数据到Excel 前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...
- 导出数据到Excel方法总结
一,问题的提出 近来在网上经常有人问怎样把数据导出到Excel中?针对这个问题网上也有很多资料.大都比较的琐碎.本人当前从事的项目中,刚好涉及到这些内容.就顺便做了一些归纳整理.共享给大家.避免大家再 ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult
导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...
- 一个方便且通用的导出数据到 Excel 的类库
一个方便且通用的导出数据到 Excel 的类库 起源: 之前在做一个项目时,客户提出了许多的导出数据的需求: 导出用户信息 导出业务实体信息 各种查询都要能导出 导出的数据要和界面上看到的一致 可以分 ...
- 导出数据到Excel表格
开发工具与关键技术:Visual Studio 和 ASP.NET.MVC,作者:陈鸿鹏撰写时间:2019年5月25日123下面是我们来学习的导出数据到Excel表格的总结首先在视图层写导出数据的点击 ...
- 从DataTable高效率导出数据到Excel
首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...
随机推荐
- ROS语音识别
一.语音识别包 1.安装 安装很简单,直接使用ubuntu命令即可,首先安装依赖库: $ sudo apt-get install gstreamer0.10-pocketsphinx ...
- 【STL】-迭代器的用法
初始化: list<char>::iterator pos; 算法: 1. 遍历 for(pos = col1.begin(); pos != col1.end(); ++pos){... ...
- 浏览器Firefox新标签页默认打开地址设置
1.地址栏输入about:config 2.找到browser.newtab.url 修改它的值为你想要的地址,如:https://www.baidu.com
- 利用K2和Microsoft Dynamics CRM构建业务App的5大理由
Microsoft Dynamics CRM提供了一个绝佳的客户关系管理平台,使您能够创建各种以客户为中心的解决方案.然而,通过将K2的企业业务流程功能与Microsoft Dynamics CRM相 ...
- 纯手写分页控件CSS+JS+SQL
Asp.net中虽然用DataPager配合ListView可以实现分页显示,但是有时候由于开发环境等问题不能用到DataPager控件,那么自己手工写一个分页控件就很有必要了,当然,最重要的是通用性 ...
- Python开发入门与实战1-开发环境
1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- SDIO接口
SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等. ...
- 如何实现标准TCODE的屏幕增强
如何实现标准TCODE的屏幕增强(HOWTO:Implement a screen exit to a standard SAP transaction) Introduction SAP provi ...
- IOS聊天对话界面
大家好,百忙之中,抽出点空,写个微博,话说好久没写. 最近项目中有碰到写类似微信聊天界面上的效果,特整理了一下,写了一个小的Demo,希望给没头绪的同学们一个参考! 下载地址:http://files ...