前言
總渴望去擁有那些自己沒有的東西,比如經驗、能力;但自己擁有的更為重要的東西,卻如此的不珍惜,比如青春。所以啊,趁着青春多寫點代碼,就能讓自己早一步去渴望重新擁有青春了。
問題背景
工作中,需要將datatable導出到excel。最終的方案是用NPOI來完成這個功能,最后也順利的完成了。這里把它總結一下。
NPOI的下載及引用
插一句,有沒有小伙伴不知道引用文件是什么意思、引用的是什么東西的?筆者也是最近才反應過來這個問題。引用的是dll文件,而dll文件呢,是后台代碼編譯之后的二進制機器碼文件,windows可直接執行。這里引用別人的dll,就相當於多了一部分后台代碼,而且已經編譯好了。
我們開始吧。
首先去官網下載NPOI
http://npoi.codeplex.com/releases/
- 1
- 2
然后解壓一下,就有這個了
然后我們打開解壓好的文件,打開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;
- 1
- 2
- 3
- 4
- 5
然后就可以愉快的使用了。
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)
{
//創建workbook
IWorkbook workbook;
string fileExt = Path.GetExtension(file).ToLower();
if (fileExt == ".xlsx")
workbook = new XSSFWorkbook();
else if (fileExt == ".xls")
workbook = new HSSFWorkbook();
else
workbook = null;
//創建sheet
ISheet 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;
}
}
}