最近的项目需求,需要将SqlServer数据库中的数据导出到Excel中,导出excel方式有很多,其中一种方式是使用NPOI,NPOI具体是什么,可以参考博客NPOI使用手册。接下来,我说一下asp.net中使用NPOI导出excel的步骤。
在VS-WEB层中打开NuGet包管理器,搜索”NPOI”:
选择列表中的NPOI在相应项目中进行安装,安装成功后会在项目中自动引用以下DLL:
页面效果如图所示,点击“导出”,导出相应的信息到excel表中。
1.WEB层,该demo使用三层架构来实现的。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="outexcel.aspx.cs" Inherits="outexcel" %>
导出excel
2.后台处理
点击“导出”,前台跳转至后台的一个一般处理程序,
<%@ WebHandler Language="C#" Class="NPOIHandler" %>
using System;
using System.Web;
using System.Data;
using NPOI.HSSF.UserModel; //NPOI使用的命名空间
using System.Collections.Generic; //list的命名空间
using System.IO; //Directory使用的命名空间
using BLL;
using Model;
public class NPOIHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string sExportFileName = ""; //导出的临时文件的名称
string sExportFilePath = ""; //导出的临时文件路径
try
{
HSSFWorkbook wb = null;
//调用下面生成数据源的方法
wb = BuildSwitchData();
string sWebBasePath = HttpContext.Current.Server.MapPath("~"); //获取网站根目录物理路径
string sExportDir = sWebBasePath + "/fenfa/excel"; //临时保存文件夹
sExportFileName = "公司信息" + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
sExportFilePath = sExportDir + "/" + sExportFileName;
if (!Directory.Exists(sExportDir))
Directory.CreateDirectory(sExportDir);
using (FileStream file = new FileStream(sExportFilePath, FileMode.Create))
{
wb.Write(file);
}
}
catch (Exception ex)
{
context.Response.Write("");
if (File.Exists(sExportFilePath))
File.Delete(sExportFilePath);
return;
}
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + sExportFileName);
context.Response.TransmitFile(sExportFilePath); //将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件
context.Response.Flush();
if (File.Exists(sExportFilePath))
File.Delete(sExportFilePath);
context.Response.End();
}
///
/// 生成交换机HSSFWorkbook数据源
///
///
private HSSFWorkbook BuildSwitchData()
{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = (HSSFSheet)wb.CreateSheet("公司信息"); //创建工作表
sheet.CreateFreezePane(0, 1); //冻结列头行
HSSFRow row_Title = (HSSFRow)sheet.CreateRow(0); //创建列头行
row_Title.HeightInPoints = 19.5F; //设置列头行高
#region 设置列宽
sheet.SetColumnWidth(0, 50 * 256);
sheet.SetColumnWidth(1, 24 * 256);
sheet.SetColumnWidth(2, 37 * 256);
sheet.SetColumnWidth(3, 22 * 256);
sheet.SetColumnWidth(4, 20 * 256);
sheet.SetColumnWidth(5, 20 * 256);
#endregion
#region 设置列头单元格样式
HSSFCellStyle cs_Title = (HSSFCellStyle)wb.CreateCellStyle(); //创建列头样式
cs_Title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中
cs_Title.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中
HSSFFont cs_Title_Font = (HSSFFont)wb.CreateFont(); //创建字体
cs_Title_Font.IsBold = true; //字体加粗
cs_Title_Font.FontHeightInPoints = 12; //字体大小
cs_Title.SetFont(cs_Title_Font); //将字体绑定到样式
#endregion
#region 生成列头
for (int i = 0; i < 6; i++)
{
HSSFCell cell_Title = (HSSFCell)row_Title.CreateCell(i); //创建单元格
cell_Title.CellStyle = cs_Title; //将样式绑定到单元格
switch (i)
{
case 0:
cell_Title.SetCellValue("公司名");
break;
case 1:
cell_Title.SetCellValue("所属地区");
break;
case 2:
cell_Title.SetCellValue("企业类型");
break;
case 3:
cell_Title.SetCellValue("经营范围");
break;
case 4:
cell_Title.SetCellValue("行业");
break;
case 5:
cell_Title.SetCellValue("登记状态");
break;
}
}
#endregion
// int iCount = 0;
//查询数据
BllBussiness bllBusiness = new BllBussiness();
DataTable listFaultInfo = bllBusiness.BusinessAll(); //项目中的数据源生成方法,此示例中请忽略
#region 设置内容单元格样式
HSSFCellStyle cs_Content = (HSSFCellStyle)wb.CreateCellStyle(); //创建列头样式
cs_Content.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中
cs_Content.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中
#endregion
List lS = ConvertHelper.ConvertToList(listFaultInfo);
if (lS != null)
{
for (int i = 0; i < lS.Count; i++)
{
#region 生成内容单元格
HSSFRow row_Content = (HSSFRow)sheet.CreateRow(i + 1); //创建行
row_Content.HeightInPoints = 16;
for (int j = 0; j < 6; j++)
{
HSSFCell cell_Conent = (HSSFCell)row_Content.CreateCell(j); //创建单元格
cell_Conent.CellStyle = cs_Content;
switch (j)
{
case 0:
cell_Conent.SetCellValue(lS[i].Company);
break;
case 1:
cell_Conent.SetCellValue(lS[i].Region);
break;
case 2:
cell_Conent.SetCellValue(lS[i].Qiyeleixing);
break;
case 3:
cell_Conent.SetCellValue(lS[i].Jingyingfanwei);
break;
case 4:
cell_Conent.SetCellValue(lS[i].HangYe);
break;
case 5:
string sConnectState = Convert.ToString(lS[i].Dengjizhuangtai);
//if (sConnectState == null && sConnectState == "" || sConnectState == "1")
// sConnectState = "正常";
//else if (sConnectState == "0")
// sConnectState = "不在线";
//cell_Conent.SetCellValue(sConnectState);
break;
}
}
#endregion
}
}
return wb;
}
public bool IsReusable
{
get
{
return false;
}
}
}
3.BLL层、dao层
查找公司信息的方法
#region 得到所有的工商资源
public DataTable BusinessAll()
{
//创建表格,存储数据
DataTable dt = new DataTable();
string strSql = "select company,region,qiyeleixing,jingyingfanwei,hangye,dengjizhuangtai from chiye_gs";//需要执行的SQL语句,这里字段与导出的字段一致
//用于返回执行sql语句后影响的行数
dt = sqlHelper.ExecuteQuery(strSql, CommandType.Text);
//返回执行结果
return dt;
}
#endregion
4.特别注意:List
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;
public class ConvertHelper where T : new()
{
///
/// 利用反射和泛型
///
///
///
public static List ConvertToList(DataTable dt)
{
// 定义集合
List ts = new List();
// 获得此模型的类型
Type type = typeof(T);
//定义一个临时变量
string tempName = string.Empty;
//遍历DataTable中所有的数据行
foreach (DataRow dr in dt.Rows)
{
T t = new T();
// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
//遍历该对象的所有属性
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;//将属性名称赋值给临时变量
//检查DataTable是否包含此列(列名==对象的属性名)
if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue;//该属性不可写,直接跳出
//取值
object value = dr[tempName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
//对象添加到泛型集合中
ts.Add(t);
}
return ts;
}
}
以上就是这个demo的具体实现代码了,代码还有优化的空间!
参考博客:C#NPOI导出Excel详解 https://blog.csdn.net/weixin_44548643/article/details/89960446
asp.net 使用NPOI实现导出Excel功能https://blog.csdn.net/LanMangFeiGe/article/details/70851503?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-4.control