问题背景
工作中,需要将datatable导出到excel。最终的方案是用NPOI来完成这个功能,最后也顺利的完成了。这里把它总结一下。
开始
插一句,有没有小伙伴不知道引用文件是什么意思、引用的是什么东西的?笔者也是最近才反应过来这个问题。引用的是dll文件,而dll文件呢,是后台代码编译之后的二进制机器码文件,windows可直接执行。这里引用别人的dll,就相当于多了一部分后台代码,而且已经编译好了。
首先去官网下载NPOI
http://npoi.codeplex.com/releases/1
然后我们打开解压好的文件,我们这里只需要引用NPOI.dll和NPOI.OOXML.dll
到VS界面,添加引用,添加完成后,可以在引用里面看到。
using NPOI;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
然后就可以愉快的使用了。
页面上放一个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;
}
}
}
结束
————————————————
版权声明:本文为CSDN博主「Fanstorm丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wf824284257/article/details/77113691