前言
总渴望去拥有那些自己没有的东西,比如经验、能力;但自己拥有的更为重要的东西,却如此的不珍惜,比如青春。所以啊,趁着青春多写点代码,就能让自己早一步去渴望重新拥有青春了。
有需要的小伙伴可以直接看第二篇 《NPOI 第二篇 设置样式与合并单元格》:
https://blog.csdn.net/wf824284257/article/details/85920867
第二篇的示例代码下载地址:
https://download.csdn.net/download/wf824284257/10899002
问题背景
工作中,需要将datatable导出到excel。最终的方案是用NPOI来完成这个功能,最后也顺利的完成了。这里把它总结一下。
开始
插一句,有没有小伙伴不知道引用文件是什么意思、引用的是什么东西的?笔者也是最近才反应过来这个问题。引用的是dll文件,而dll文件呢,是后台代码编译之后的二进制机器码文件,windows可直接执行。这里引用别人的dll,就相当于多了一部分后台代码,而且已经编译好了。
我们开始吧。
首先去官网下载NPOI
http://npoi.codeplex.com/releases/
然后解压一下,就有这个了
然后我们打开解压好的文件,打开release文件夹,看到有net20和net40文件夹,这里我们打开net40,可以看到一些dll文件。我们这里只需要引用NPOI.dll和NPOI.OOXML.dll
到VS界面,添加引用,选择刚刚那2个dll,并确定。添加完成后,可以在引用里面看到。
接下来 using这些
using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
然后就可以愉快的使用了。
##NPOI的基本使用
页面上放一个button,点击事件是导出excel。
首先我们通过后台代码从数据库获取到datatable,然后利用NPOI将该dataTable导出到excel。
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.IO;using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;namespace NPOI_Test1
{
public partial class Page1 : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){}protected void btnExport_Click(object sender, EventArgs e){SqlConnection cn = new SqlConnection();cn.ConnectionString = "server=.;uid=sa;pwd=密码不告诉你;database=dawufan";cn.Open();string sqlstr = @"select * from interest";SqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = sqlstr;SqlDataReader reader = cmd.ExecuteReader();DataTable dt = ReaderToTable(reader);ExportExcel(dt);cn.Close();cn.Dispose();cmd.Dispose();reader.Close();dt.Dispose();}protected DataTable ReaderToTable(SqlDataReader dr){DataTable dt = new DataTable();for (int i = 0; i < dr.FieldCount; i++){dt.Columns.Add(dr.GetName(i), dr.GetFieldType(i));}object[] objValues = new object[dr.FieldCount];while (dr.Read()){dr.GetValues(objValues);dt.LoadDataRow(objValues, true);}dr.Close();return dt;}protected void ExportExcel(DataTable dt){HttpContext curContext = HttpContext.Current;//设置编码及附件格式curContext.Response.ContentType = "application/vnd.ms-excel";curContext.Response.ContentEncoding = Encoding.UTF8;curContext.Response.Charset = "";string fullName = HttpUtility.UrlEncode("FileName.xls", Encoding.UTF8);curContext.Response.AppendHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(fullName, Encoding.UTF8)); //attachment后面是分号byte[] data = TableToExcel(dt, fullName).GetBuffer();curContext.Response.BinaryWrite(TableToExcel(dt, fullName).GetBuffer());curContext.Response.End();}public MemoryStream TableToExcel(DataTable dt, string file){//创建workbookIWorkbook workbook;string fileExt = Path.GetExtension(file).ToLower();if (fileExt == ".xlsx")workbook = new XSSFWorkbook();else if (fileExt == ".xls")workbook = new HSSFWorkbook();elseworkbook = null;//创建sheetISheet sheet = workbook.CreateSheet("Sheet1");//表头IRow headrow = sheet.CreateRow(0);for (int i = 0; i < dt.Columns.Count; i++){ICell headcell = headrow.CreateCell(i);headcell.SetCellValue(dt.Columns[i].ColumnName);}//表内数据for (int i = 0; i < dt.Rows.Count; i++){IRow row = sheet.CreateRow(i + 1);for (int j = 0; j < dt.Columns.Count; j++){ICell cell = row.CreateCell(j);cell.SetCellValue(dt.Rows[i][j].ToString());}}//转化为字节数组MemoryStream ms = new MemoryStream();workbook.Write(ms);ms.Flush();ms.Position = 0;return ms;}}}
结束
今天就到这里了,后面会有介绍NPOI设置excel样式,及复杂一点表格如何实现。
下一步
《NPOI 第二篇 设置样式与合并单元格》:
https://blog.csdn.net/wf824284257/article/details/85920867