NPOI从数据库中调取数据直接导出到EXCEL中
关于NPOI
NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex.com/下 载到它的最新版本。它不使用Office COM组件(Microsoft.Office.Interop.XXX.dll),不需要安装Microsoft Office,支持对Office 97-2003的文件格式,功能比较强大。更详细的说明请看作者的博客或官方网站。
它的以下一些特性让我相当喜欢:
支持对标准的Excel读写
支持对流(Stream)的读写 (而Jet OLEDB和Office COM都只能针对文件)
支持大部分Office COM组件的常用功能
性能优异 (相对于前面的方法)
使用简单,易上手
使用NPOI
本文使用的是它当前的最新版本1.2.4,此版本的程序集缩减至2个:NPOI.dll、Ionic.Zip.dll,直接引用到项目中即可。
对于我们开发者使用的对象主要位于NPOI.HSSF.UserModel空间下,主要有HSSFWorkbook、HSSFSheet、 HSSFRow、HSSFCell,对应的接口为位于NPOI.SS.UserModel空间下的IWorkbook、ISheet、IRow、 ICell,分别对应Excel文件、工作表、行、列。
简单演示一下创建一个Workbook对象,添加一个工作表,在工作表中添加一行一列:
操作示例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Data;
using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MemoryStream ms = RenderToExcel(GetTable());
string fileName = @"c:\2.xls";
SaveToFile(ms, fileName);
Response.Write("成功");
}
public MemoryStream RenderToExcel(DataTable table)
{
MemoryStream ms = new MemoryStream(); using (table)
{
IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); IRow headerRow = sheet.CreateRow(); // handling header.
foreach (DataColumn column in table.Columns)
headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value // handling value.
int rowIndex = ; foreach (DataRow row in table.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
} rowIndex++;
} workbook.Write(ms);
ms.Flush();
ms.Position = ;
} return ms;
}
private void SaveToFile(MemoryStream ms, string fileName)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray(); fs.Write(data, , data.Length);
fs.Flush(); data = null;
}
}
private DataTable GetTable()
{
SqlHelperXhf xhf = new SqlHelperXhf();
string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hname<>'无'and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc"; return xhf.ExecuteDataTable(sql); }
private DataTable GetTable(int hid)
{
SqlHelperXhf xhf = new SqlHelperXhf();
string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hid=@hid and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc";
SqlParameter paramer = new SqlParameter("@hid", hid);
return xhf.ExecuteDataTable(sql,paramer); }
private DataTable GetTable(int hid1,int hid2,int hid3)
{
SqlHelperXhf xhf = new SqlHelperXhf();
string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hid=@hid1 or hid=@hid2 or hid=@hid3 and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc";
SqlParameter [] paramers =
{
new SqlParameter("@hid1", hid1),
new SqlParameter("@hid2", hid2),
new SqlParameter("@hid3", hid3)
};
return xhf.ExecuteDataTable(sql, paramers); }
}
参考资料:
简单演示一下创建一个Workbook对象,添加一个工作表,在工作表中添加一行一列:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;publicclassNPOIWrite{    voidCreateSheet()    {        IWorkbook workbook = newHSSFWorkbook();//创建Workbook对象        ISheet sheet = workbook.CreateSheet("Sheet1");//创建工作表        IRow row = sheet.CreateRow(0);//在工作表中添加一行        ICell cell = row.CreateCell(0);//在行中添加一列        cell.SetCellValue("test");//设置列的内容    }} | 
相应的读取代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | usingSystem.IO;usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;publicclassNPOIRead{    voidGetSheet(Stream stream)    {        IWorkbook workbook = newHSSFWorkbook(stream);//从流内容创建Workbook对象        ISheet sheet = workbook.GetSheetAt(0);//获取第一个工作表        IRow row = sheet.GetRow(0);//获取工作表第一行        ICell cell = row.GetCell(0);//获取行的第一列        stringvalue = cell.ToString();//获取列的值    }} | 
使用NPOI导出
从DataTable读取内容来创建Workbook对象:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | publicstaticMemoryStream RenderToExcel(DataTable table){    MemoryStream ms = newMemoryStream();    using(table)    {        using(IWorkbook workbook = newHSSFWorkbook())        {            using(ISheet sheet = workbook.CreateSheet())            {                IRow headerRow = sheet.CreateRow(0);                // handling header.                foreach(DataColumn column intable.Columns)                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value                // handling value.                introwIndex = 1;                foreach(DataRow row intable.Rows)                {                    IRow dataRow = sheet.CreateRow(rowIndex);                    foreach(DataColumn column intable.Columns)                    {                        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());                    }                    rowIndex++;                }                workbook.Write(ms);                ms.Flush();                ms.Position = 0;            }        }    }    returnms;} | 
如果看不惯DataTable,那么DataReader也行:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | publicstaticMemoryStream RenderToExcel(IDataReader reader){    MemoryStream ms = newMemoryStream();    using(reader)    {        using(IWorkbook workbook = newHSSFWorkbook())        {            using(ISheet sheet = workbook.CreateSheet())            {                IRow headerRow = sheet.CreateRow(0);                intcellCount = reader.FieldCount;                // handling header.                for(inti = 0; i < cellCount; i++)                {                    headerRow.CreateCell(i).SetCellValue(reader.GetName(i));                }                // handling value.                introwIndex = 1;                while(reader.Read())                {                    IRow dataRow = sheet.CreateRow(rowIndex);                    for(inti = 0; i < cellCount; i++)                    {                        dataRow.CreateCell(i).SetCellValue(reader[i].ToString());                    }                    rowIndex++;                }                workbook.Write(ms);                ms.Flush();                ms.Position = 0;            }        }    }    returnms;} | 
以上代码把创建的Workbook对象保存到流中,可以通过以下方法输出到浏览器,或是保存到硬盘中:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | staticvoidSaveToFile(MemoryStream ms, stringfileName){    using(FileStream fs = newFileStream(fileName, FileMode.Create, FileAccess.Write))    {        byte[] data = ms.ToArray();        fs.Write(data, 0, data.Length);        fs.Flush();        data = null;    }}staticvoidRenderToBrowser(MemoryStream ms, HttpContext context, stringfileName){    if(context.Request.Browser.Browser == "IE")        fileName = HttpUtility.UrlEncode(fileName);    context.Response.AddHeader("Content-Disposition", "attachment;fileName="+ fileName);    context.Response.BinaryWrite(ms.ToArray());} | 
使用NPOI导入
需要注意的是,sheet.LastRowNum = sheet.PhysicalNumberOfRows - 1,这里可能存在BUG:当没有数据或只有一行数据时sheet.LastRowNum为0,PhysicalNumberOfRows 表现正常。
这里读取流中的Excel来创建Workbook对象,并转换成DataTable:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | staticDataTable RenderFromExcel(Stream excelFileStream){    using(excelFileStream)    {        using(IWorkbook workbook = newHSSFWorkbook(excelFileStream))        {            using(ISheet sheet = workbook.GetSheetAt(0))//取第一个表            {                DataTable table = newDataTable();                IRow headerRow = sheet.GetRow(0);//第一行为标题行                intcellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells                introwCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1                //handling header.                for(inti = headerRow.FirstCellNum; i < cellCount; i++)                {                    DataColumn column = newDataColumn(headerRow.GetCell(i).StringCellValue);                    table.Columns.Add(column);                }                for(inti = (sheet.FirstRowNum + 1); i <= rowCount; i++)                {                    IRow row = sheet.GetRow(i);                    DataRow dataRow = table.NewRow();                    if(row != null)                    {                        for(intj = row.FirstCellNum; j < cellCount; j++)                        {                            if(row.GetCell(j) != null)                                dataRow[j] = GetCellValue(row.GetCell(j));                        }                    }                    table.Rows.Add(dataRow);                }                returntable;            }        }    }} | 
或者是直接生成SQL语句来插入到数据库:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | publicstaticintRenderToDb(Stream excelFileStream, stringinsertSql, DBAction dbAction){    introwAffected = 0;    using(excelFileStream)    {        using(IWorkbook workbook = newHSSFWorkbook(excelFileStream))        {            using(ISheet sheet = workbook.GetSheetAt(0))//取第一个工作表            {                StringBuilder builder = newStringBuilder();                IRow headerRow = sheet.GetRow(0);//第一行为标题行                intcellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells                introwCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1                for(inti = (sheet.FirstRowNum + 1); i <= rowCount; i++)                {                    IRow row = sheet.GetRow(i);                    if(row != null)                    {                        builder.Append(insertSql);                        builder.Append(" values (");                        for(intj = row.FirstCellNum; j < cellCount; j++)                        {                            builder.AppendFormat("'{0}',", GetCellValue(row.GetCell(j)).Replace("'", "''"));                        }                        builder.Length = builder.Length - 1;                        builder.Append(");");                    }                    if((i % 50 == 0 || i == rowCount) && builder.Length > 0)                    {                        //每50条记录一次批量插入到数据库                        rowAffected += dbAction(builder.ToString());                        builder.Length = 0;                    }                }            }        }    }    returnrowAffected;} | 
这里的Excel可能没有数据,所以可以加一个方法来检测:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | publicstaticboolHasData(Stream excelFileStream){    using(excelFileStream)    {        using(IWorkbook workbook = newHSSFWorkbook(excelFileStream))        {            if(workbook.NumberOfSheets > 0)            {                using(ISheet sheet = workbook.GetSheetAt(0))                {                    returnsheet.PhysicalNumberOfRows > 0;                }            }        }    }    returnfalse;} | 
NPOI从数据库中调取数据直接导出到EXCEL中的更多相关文章
- 把数据库里面的stu表中的数据,导出到excel中
		# 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ... 
- 数据可视化之powerBI基础(十一)Power BI中的数据如何导出到Excel中?
		https://zhuanlan.zhihu.com/p/64415543 把Excel中数据加载到PowerBI中我们都已经熟悉了,但是怎么把在PowerBI中处理好的数据导出到Excel中呢?毕竟 ... 
- 用C# ASP.net将数据库中的数据表导出到Excel中
		需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加 ... 
- 【SqlServer】在SqlServer中把数据导入导出为Excel文件
		这里笔者介绍利用SqlServer数据库操作EXECEL文件. 1.将Excel表中的数据导入为SqlServer数据库 把Excel表中的数据导入为SqlServer数据库中的数据. 新建一个Exc ... 
- .Net中DataGridview数据如何导出到excel表
		首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. ... 
- 如何将存储在MongoDB数据库中的数据导出到Excel中?
		将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ... 
- SQL Server 之 在数据库之间进行数据导入导出
		1.同一服务器上数据库之间进行数据导入导出 (1).使用 SELECT INTO 导出数据 在SQL Server中使用最广泛的就是通过SELECT INTO语句导出数据,SELECT INTO语句同 ... 
- 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!
		一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ... 
- 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>
		前台datagrid数据绑定 #region 导出到excel中 /// <summary> /// 2014-6-6 /// </summary> / ... 
随机推荐
- WebDriver 原理
			注:学会根据执行顺序看底层代码 <以下内容摘自大师兄博客> WebDriver webdriver是按照server – client的经典设计模式设计的. webdriver的作用就是创 ... 
- ny36 最长公共子序列
			最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ... 
- ny16 矩形嵌套
			矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ... 
- org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xm
			org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xm 检查jar包是否正确以及配置的xm ... 
- JS自动爆炸案例
			学习到了: setTimeout函数的灵活运用. 案例实现讲解: 1.先定义一个全局的变量,赋值为null. 2.然后使用timeout调用bang函数,以达到自动自动调用函数的功能. 3.bang函 ... 
- 实践中更高效、实现起来相对简单的基于末尾坏字符原则的BM算法实现
			之前网上看的若干算法,无非两个原则:坏字符原则.好后缀原则.按照算法所述实现了一个版本,但发现其效率还不如本文所述的实现方式.个人分析效率较低的原因可能是因为不断地向前找坏字符或者好后缀来确定跳跃距离 ... 
- Postgres数据库备份与还原命令
			备份 pg_dump.exe -c -b -E UTF8 -U postgres -h 127.0.0.1 -p 5432 -f "f:\testdb001.bak" testdb ... 
- mysql 函数模拟序列
			mysql本身不提供序列机制,但是可以通过函数来模拟实现序列 CREATE TABLE IF NOT EXISTS `sequence` ( `id` ) CHARACTER SET utf8 COL ... 
- DataGridView:DataGridView控件清空绑定的数据
			使用DataGridView控件绑定数据后有时需要清空绑定的数据,在清除DataGridView绑定的数据时: 1.设置DataSource为null this.dgvDemo.DataSource ... 
- Entity Framework应用:使用Code First模式管理事务
			一.什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理.ADO.NET为事务管理提供了一个非常干净和有效的API.因为EF运行在ADO.NET之上,所以EF可以使用ADO.NET的事务管 ... 
