asp.net 利用NPOI导出Excel通用类的方法
来源:爱站网时间:2020-05-12编辑:网友分享
使用npoi导出excel时,可以选择不带任何excel文件,正常情况下npoi用于导出Excel文件也是符合规范的,今天,爱站技术频道小编就为大家讲一下asp.net 利用NPOI导出Excel通用类的方法吧!
使用npoi导出excel时,可以选择不带任何excel文件,正常情况下npoi用于导出Excel文件也是符合规范的,今天,爱站技术频道小编就为大家讲一下asp.net 利用NPOI导出Excel通用类的方法吧!
核心代码如下:
System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
//设置下载的Excel文件名\
if (System.Web.HttpContext.Current.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
{
//火狐浏览器
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileName)) + "?="));
}
else
{
//IE等浏览器
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)));
}
废话不多说,直接上类库代码,ATNPOIHelper.cs:
using System;
using System.Linq;
using System.Web;
using System.IO;
using NPOI;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using System.Data;
using System.Collections.Generic;
using System.Text;
namespace AT.Utility.DotNetFile
{
/*
导出Excel包含的功能:
1.多表头导出最多支持到三行,表头格式说明
相邻父列头之间用'#'分隔,父列头与子列头用空格(' ‘)分隔,相邻子列头用逗号分隔(‘,')
两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,合计#累计成功签约单数 预警,续约,流失,合计#任务数#完成比例#排名
三行:等级#级别#上期结存 件数,重量,比例#本期调入 收购调入 件数,重量,比例#本期发出 车间投料 件数,重量,比例#本期发出 产品外销百分比 件数,重量,比例#平均值
三行时请注意:列头要重复
2.添加表头标题功能
3.添加序号功能
4.根据数据设置列宽
缺陷:
数据内容不能合并列合并行
改进思路:
添加一属性:设置要合并的列,为了实现多列合并可以这样设置{“列1,列2”,”列4”}
*/
///
/// 利用NPOI实现导出Excel
///
public class ATNPOIHelper
{
#region 初始化
///
/// 声明 HSSFWorkbook 对象
///
private static HSSFWorkbook _workbook;
///
/// 声明 HSSFSheet 对象
///
private static HSSFSheet _sheet;
#endregion
#region Excel导出
///
/// Excel导出
///
/// 文件名称 如果为空或NULL,则默认“新建Excel.xls”
///
/// 合计:末行合计时,合并的列数
/// 导出方式 1:WEB导出(默认)2:按文件路径导出
/// 文件路径 如果WEB导出,则可以为空;如果按文件路径导出,则默认桌面路径
public static void Export(string fileName, IList list, int ColMergeNum, int method = 1, string filePath = null)
{
// 文件名称
if (!string.IsNullOrEmpty(fileName))
{
if (fileName.IndexOf('.') == -1)
{
fileName += ".xls";
}
else
{
fileName = fileName.Substring(1, fileName.IndexOf('.')) + ".xls";
}
}
else
{
fileName = "新建Excel.xls";
}
// 文件路径
if (2 == method && string.IsNullOrEmpty(filePath))
{
filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
}
// 调用导出处理程序
Export(list, ColMergeNum);
// WEB导出
if (1 == method)
{
System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
//设置下载的Excel文件名\
if (System.Web.HttpContext.Current.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
{
//火狐浏览器
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(fileName)) + "?="));
}
else
{
//IE等浏览器
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)));
}
using (MemoryStream ms = new MemoryStream())
{
//将工作簿的内容放到内存流中
_workbook.Write(ms);
//将内存流转换成字节数组发送到客户端
System.Web.HttpContext.Current.Response.BinaryWrite(ms.GetBuffer());
System.Web.HttpContext.Current.Response.End();
_sheet = null;
_workbook = null;
}
}
else if (2 == method)
{
using (FileStream fs = File.Open(filePath, FileMode.Append))
{
_workbook.Write(fs);
_sheet = null;
_workbook = null;
}
}
}
///
/// 导出方法实现
///
///
private static void Export(IList list, int ColMergeNum)
{
#region 变量声明
// 初始化
_workbook = new HSSFWorkbook();
// 声明 Row 对象
IRow _row;
// 声明 Cell 对象
ICell _cell;
// 总列数
int cols = 0;
// 总行数
int rows = 0;
// 行数计数器
int rowIndex = 0;
// 单元格值
string drValue = null;
#endregion
foreach (NPOIModel model in list)
{
// 工作薄命名
if (model.sheetName != null)
_sheet = (HSSFSheet)_workbook.CreateSheet(model.sheetName);
else
_sheet = (HSSFSheet)_workbook.CreateSheet();
// 获取数据源
DataTable dt = model.dataSource;
// 初始化
rowIndex = 0;
// 获取总行数
rows = GetRowCount(model.headerName);
// 获取总列数
cols = GetColCount(model.headerName);
//合计:合并表格末行N列,rows为表头行数,dt.Rows.Count为数据行数
if (ColMergeNum > 1)
{
CellRangeAddress region_Merge = new CellRangeAddress(rows + dt.Rows.Count, rows + dt.Rows.Count, 0, ColMergeNum - 1);
_sheet.AddMergedRegion(region_Merge);
}
ICellStyle myBodyStyle = bodyStyle;
ICellStyle myTitleStyle = titleStyle;
ICellStyle myDateStyle = dateStyle;
ICellStyle myBodyRightStyle = bodyRightStyle;
// 循环行数
foreach (DataRow row in dt.Rows)
{
#region 新建表,填充表头,填充列头,样式
if (rowIndex == 65535 || rowIndex == 0)
{
if (rowIndex != 0)
_sheet = (HSSFSheet)_workbook.CreateSheet();
// 构建行
for (int i = 0; i 0)
{
// 获取行
_row = _sheet.GetRow(0);
// 合并单元格
CellRangeAddress region = new CellRangeAddress(0, 0, 0, (cols - 1));
_sheet.AddMergedRegion(region);
// 填充值
_row.CreateCell(0).SetCellValue(model.tableTitle);
// 设置样式
_row.GetCell(0).CellStyle = myTitleStyle;
// 设置行高
_row.HeightInPoints = 20;
}
// 取得上一个实体
NPOIHeader lastRow = null;
IList hList = GetHeaders(model.headerName, rows, model.isTitle);
// 创建表头
foreach (NPOIHeader m in hList)
{
var data = hList.Where(c => c.firstRow == m.firstRow && c.lastCol == m.firstCol - 1);
if (data.Count() > 0)
{
lastRow = data.First();
if (m.headerName == lastRow.headerName)
m.firstCol = lastRow.firstCol;
}
// 获取行
_row = _sheet.GetRow(m.firstRow);
// 合并单元格
CellRangeAddress region = new CellRangeAddress(m.firstRow, m.lastRow, m.firstCol, m.lastCol);
_sheet.AddMergedRegion(region);
// 填充值
_row.CreateCell(m.firstCol).SetCellValue(m.headerName);
}
// 填充表头样式
for (int i = 0; i
/// 表头解析
///
///
///
/// 表头
/// 总行数
/// 外加行
/// 外加列
///
private static IList GetHeaders(string header, int rows, int addRows)
{
// 临时表头数组
string[] tempHeader;
string[] tempHeader2;
// 所跨列数
int colSpan = 0;
// 所跨行数
int rowSpan = 0;
// 单元格对象
NPOIHeader model = null;
// 行数计数器
int rowIndex = 0;
// 列数计数器
int colIndex = 0;
//
IList list = new List();
// 初步解析
string[] headers = header.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
// 表头遍历
for (int i = 0; i
/// 获取最大列
///
///
///
private static int GetMaxCol(IList list)
{
int maxCol = 0;
if (list.Count > 0)
{
foreach (NPOIHeader model in list)
{
if (maxCol
/// 获取表头行数
///
/// 表头文字
///
private static int GetRowCount(string newHeaders)
{
string[] ColumnNames = newHeaders.Split(new char[] { '@' });
int Count = 0;
if (ColumnNames.Length Count)
Count = TempCount;
}
return Count;
}
///
/// 获取表头列数
///
/// 表头文字
///
private static int GetColCount(string newHeaders)
{
string[] ColumnNames = newHeaders.Split(new char[] { '@' });
int Count = 0;
if (ColumnNames.Length 1)
Count += TempCount - 1;
}
return Count;
}
///
/// 列头跨列数
///
///
///
/// 表头文字
///
private static int GetColSpan(string newHeaders)
{
return newHeaders.Split(',').Count();
}
///
/// 列头跨行数
///
///
///
/// 列头文本
/// 表头总行数
///
private static int GetRowSpan(string newHeaders, int rows)
{
int Count = newHeaders.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length;
// 如果总行数与当前表头所拥有行数相等
if (rows == Count)
Count = 1;
else if (Count
/// 数据单元格样式
///
private static ICellStyle bodyStyle
{
get
{
ICellStyle style = _workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.CENTER; //居中
style.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
style.WrapText = true;//自动换行
// 边框
style.BorderBottom = BorderStyle.THIN;
style.BorderLeft = BorderStyle.THIN;
style.BorderRight = BorderStyle.THIN;
style.BorderTop = BorderStyle.THIN;
// 字体
//IFont font = _workbook.CreateFont();
//font.FontHeightInPoints = 10;
//font.FontName = "宋体";
//style.SetFont(font);
return style;
}
}
///
/// 数据单元格样式
///
private static ICellStyle bodyRightStyle
{
get
{
ICellStyle style = _workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.RIGHT; //居中
style.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
style.WrapText = true;//自动换行
// 边框
style.BorderBottom = BorderStyle.THIN;
style.BorderLeft = BorderStyle.THIN;
style.BorderRight = BorderStyle.THIN;
style.BorderTop = BorderStyle.THIN;
// 字体
//IFont font = _workbook.CreateFont();
//font.FontHeightInPoints = 10;
//font.FontName = "宋体";
//style.SetFont(font);
return style;
}
}
///
/// 标题单元格样式
///
private static ICellStyle titleStyle
{
get
{
ICellStyle style = _workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.CENTER; //居中
style.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
style.WrapText = true;//自动换行
//IFont font = _workbook.CreateFont();
//font.FontHeightInPoints = 14;
//font.FontName = "宋体";
//font.Boldweight = (short)FontBoldWeight.BOLD;
//style.SetFont(font);
return style;
}
}
///
/// 日期单元格样式
///
private static ICellStyle dateStyle
{
get
{
ICellStyle style = _workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.CENTER; //居中
style.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
style.WrapText = true;//自动换行
// 边框
style.BorderBottom = BorderStyle.THIN;
style.BorderLeft = BorderStyle.THIN;
style.BorderRight = BorderStyle.THIN;
style.BorderTop = BorderStyle.THIN;
// 字体
//IFont font = _workbook.CreateFont();
//font.FontHeightInPoints = 10;
//font.FontName = "宋体";
//style.SetFont(font);
IDataFormat format = _workbook.CreateDataFormat();
style.DataFormat = format.GetFormat("yyyy-MM-dd");
return style;
}
}
#endregion
#endregion
}
///
/// 实体类
///
public class NPOIModel
{
///
/// 数据源
///
public DataTable dataSource { get; private set; }
///
/// 要导出的数据列数组
///
public string[] fileds { get; private set; }
///
/// 工作薄名称数组
///
public string sheetName { get; private set; }
///
/// 表标题
///
public string tableTitle { get; private set; }
///
/// 表标题是否存在 1:存在 0:不存在
///
public int isTitle { get; private set; }
///
/// 是否添加序号
///
public int isOrderby { get; private set; }
///
/// 表头
///
public string headerName { get; private set; }
///
/// 取得列宽
///
public int[] colWidths { get; private set; }
///
/// 构造函数
///
///
///
/// 数据来源 DataTable
/// 要导出的字段,如果为空或NULL,则默认全部
/// 工作薄名称
/// 表头名称 如果为空或NULL,则默认数据列字段
/// 相邻父列头之间用'#'分隔,父列头与子列头用空格(' ')分隔,相邻子列头用逗号分隔(',')
/// 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,合计#累计成功签约单数 预警,续约,流失,合计#任务数#完成比例#排名
/// 三行:等级#级别#上期结存 件数,重量,比例#本期调入 收购调入 件数,重量,比例#本期发出 车间投料 件数,重量,比例#本期发出 产品外销百分比 件数,重量,比例#平均值
/// 三行时请注意:列头要重复
///
/// 表标题
/// 是否添加序号 0:不添加 1:添加
public NPOIModel(DataTable dataSource, string filed, string sheetName, string headerName, string tableTitle = null, int isOrderby = 0)
{
if (!string.IsNullOrEmpty(filed))
{
this.fileds = filed.ToUpper().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
// 移除多余数据列
for (int i = dataSource.Columns.Count - 1; i >= 0; i--)
{
DataColumn dc = dataSource.Columns[i];
if (!this.fileds.Contains(dataSource.Columns[i].Caption.ToUpper()))
{
dataSource.Columns.Remove(dataSource.Columns[i]);
}
}
// 列索引
int colIndex = 0;
// 循环排序
for (int i = 0; i colWidths[j])
{
colWidths[j] = intTemp;
}
}
}
if (isOrderby > 0)
{
this.isOrderby = isOrderby;
this.headerName = "序号#" + this.headerName;
}
}
///
/// 获取列名下标
///
/// 列名称
///
private int GetColIndex(string colName)
{
for (int i = 0; i
/// 表头构建类
///
public class NPOIHeader
{
///
/// 表头
///
public string headerName { get; set; }
///
/// 起始行
///
public int firstRow { get; set; }
///
/// 结束行
///
public int lastRow { get; set; }
///
/// 起始列
///
public int firstCol { get; set; }
///
/// 结束列
///
public int lastCol { get; set; }
///
/// 是否跨行
///
public int isRowSpan { get; private set; }
///
/// 是否跨列
///
public int isColSpan { get; private set; }
///
/// 外加行
///
public int rows { get; set; }
public NPOIHeader() { }
///
/// 构造函数
///
/// 表头
/// 起始行
/// 结束行
/// 起始列
/// 结束列
/// 外加行
/// 外加列
public NPOIHeader(string headerName, int firstRow, int lastRow, int firstCol, int lastCol, int rows = 0)
{
this.headerName = headerName;
this.firstRow = firstRow;
this.lastRow = lastRow;
this.firstCol = firstCol;
this.lastCol = lastCol;
// 是否跨行判断
if (firstRow != lastRow)
isRowSpan = 1;
if (firstCol != lastCol)
isColSpan = 1;
this.rows = rows;
}
}
}
3、导出代码示例如下:
////// 导出测点列表表格 /// [HttpGet] [AllowAnonymous] public void ExportMeasurePointData(string TreeID, string TreeType) { DataTable dtResult = new DataTable(); DataTable dtExcel = new DataTable(); try { string sql = string.Format("EXEC P_GET_ZXJG_TagList '{0}','{1}'", TreeID, TreeType); dtResult = QuerySQL.GetDataTable(sql); dtExcel = dtResult.Copy(); dtExcel.Columns.Add("xuhao", typeof(string)); dtExcel.Columns.Add("StrValueTime", typeof(string)); dtExcel.Columns["xuhao"].SetOrdinal(0); dtExcel.Columns["StrValueTime"].SetOrdinal(2); for (int i = 0; i list = new List(); list.Add(new NPOIModel(dtExcel, "xuhao;F_Description;StrValueTime;F_Value;F_Unit;F_AlmLow;F_AlmUp", "sheet", "序号#监测点#采集时间#当前数值#工程单位#报警下限#报警上限")); ATNPOIHelper.Export("测点列表", list, 0); } catch (Exception ex) { } }
以上就是爱站技术频道小编为大家整理的asp.net 利用NPOI导出Excel通用类的方法,如果有需要的朋友可以好好看看上面的内容,并试一试。希望小编介绍的内容对大家有所帮助。
