通过NPOI如何导出数据到Excel
导出依赖于NPOI,
当前方法只支持Excel导出,并且现在的方法不支持格式。比如列多宽目前无法使用。
NPOI的优势
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;
using NPOI.HSSF.UserModel;
using System.Data;
using NPOI.SS.UserModel;
using Yikangtech.Framework.Core.Util;
namespace Yikangtech.PMP.SMM.Infrastructrue.Util
{
/// <summary>
/// 导出文件工具
/// </summary>
public sealed class ExportFileUtil
{
#region 属性、字段
private string _fileName;
private string _fileStoredPath;
private int _excelSheetCount = 0;
/// <summary>
/// 要导出的文件名称
/// </summary>
public string FileName
{
get { return this._fileName ?? (this._fileName = Guid.NewGuid().ToString()); }
}
/// <summary>
/// 要导出文件在服务器端的存储路径
/// </summary>
public string FileStoredPath
{
get { return this._fileName ?? (this._fileStoredPath = "/TemplateDoc/"); }
}
/// <summary>
/// 标准excel文件应用类型
/// </summary>
public string StandardExcelFileContentType
{
get { return "application/vnd.ms-excel"; }
}
/// <summary>
/// 是否显示所有的字段
/// </summary>
public bool IsDisplayAllFields { get; set; }
/// <summary>
/// 绑定表头值时触发的回调方法
/// </summary>
public Func<ICell, object, string> OnBindingXlsHeadValue;
/// <summary>
/// 绑定表正文值时触发的回调方法
/// </summary>
public Func<ICell, object, string> OnBindingXlsBodyValue;
#endregion
#region 构造函数
public ExportFileUtil() { }
public ExportFileUtil(string fileName) : this(fileName, string.Empty) { }
public ExportFileUtil(bool isDisplayAllFields)
{
this.IsDisplayAllFields = isDisplayAllFields;
}
public ExportFileUtil(string fileName, string fileStoredPath) : this(fileName, fileStoredPath, true) { }
public ExportFileUtil(string fileName, string fileStoredPath, bool isDisplayAllFields)
{
_fileName = fileName;
_fileStoredPath = fileStoredPath;
IsDisplayAllFields = isDisplayAllFields;
}
#endregion
#region 导出excel
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <param name="objects"></param>
/// <returns></returns>
public string ExportExcelToPath(IEnumerable<object> objects)
{
string sheetName = string.Empty;
return this.ExportExcelToPath(sheetName, objects);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <param name="objects"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
public string ExportExcelToPath(IEnumerable<object> objects, Dictionary<string, string> columnNameDic)
{
string sheetName = string.Empty;
return this.ExportExcelToPath(sheetName, objects, columnNameDic);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <param name="sheetName"></param>
/// <param name="objects"></param>
/// <returns></returns>
public string ExportExcelToPath(string sheetName, IEnumerable<object> objects)
{
return this.ExportExcelToPath(sheetName, objects);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <param name="sheetName"></param>
/// <param name="objects"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
public string ExportExcelToPath(string sheetName, IEnumerable<object> objects, Dictionary<string, string> columnNameDic)
{
IEnumerable<object> values = objects ?? new List<object>();
values = values.Where(v => v != null);
Type objectType;
object value = values.FirstOrDefault();
if (value == null)
{
objectType = typeof(object);
}
else
{
objectType = value.GetType();
}
return this.ExportExcelToPath(sheetName, values, objectType, columnNameDic);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sheetName"></param>
/// <param name="entities"></param>
/// <returns></returns>
public string ExportExcelToPath<T>(string sheetName, IEnumerable<T> entities)
{
return this.ExportExcelToPath<T>(sheetName, entities, null);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sheetName"></param>
/// <param name="entities"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
public string ExportExcelToPath<T>(string sheetName, IEnumerable<T> entities, Dictionary<string, string> columnNameDic)
{
IEnumerable<T> values = entities ?? new List<T>();
values = values.Where(v => v != null);
return this.ExportExcelToPath(sheetName, values.Select(v => v as object), typeof(T), columnNameDic);
}
/// <summary>
/// 以路径的形式导出excel
/// </summary>
/// <param name="sheetName"></param>
/// <param name="objects"></param>
/// <param name="columnNameDic"></param>
/// <param name="objectType"></param>
/// <returns></returns>
public string ExportExcelToPath(string sheetName, IEnumerable<object> objects, Type objectType, Dictionary<string, string> columnNameDic)
{
sheetName = sheetName ?? objectType.Name;
DataSet dataSet = new DataSet();
DataTable dataTable = ConverterUtil.ToDataTable(objects, objectType);
dataTable.TableName = sheetName;
dataSet.Tables.Add(dataTable);
return this.ExportExcelToPathInternal(dataSet, columnNameDic);
}
/// <summary>
/// 以路径的形式导出excel
/// 注:取dataSet中DataTable的名称为工作簿名称,若不存在表名,则由系统自定义工作簿名称
/// </summary>
/// <param name="dataTable"></param>
/// <returns></returns>
public string ExportExcelToPath(DataTable dataTable)
{
DataSet dataSet = new DataSet();
dataSet.Tables.Add(dataTable.Copy());
return this.ExportExcelToPath(dataSet);
}
/// <summary>
/// 以路径的形式导出excel
/// 注:取dataSet中DataTable的名称为工作簿名称,若不存在表名,则由系统自定义工作簿名称
/// </summary>
/// <param name="dataTable"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
public string ExportExcelToPath(DataTable dataTable, Dictionary<string, string> columnNameDic)
{
DataSet dataSet = new DataSet();
dataSet.Tables.Add(dataTable.Copy());
return this.ExportExcelToPath(dataSet, columnNameDic);
}
/// <summary>
/// 以路径的形式导出excel
/// 注:取dataSet中DataTable的名称为工作簿名称,若不存在表名,则由系统自定义工作簿名称
/// </summary>
/// <param name="dataSet"></param>
/// <returns></returns>
public string ExportExcelToPath(DataSet dataSet)
{
return ExportExcelToPath(dataSet, null);
}
/// <summary>
/// 以路径的形式导出excel
/// 注:取dataSet中DataTable的名称为工作簿名称,若不存在表名,则由系统自定义工作簿名称
/// </summary>
/// <param name="dataSet"></param>
/// <param name="columnNames"></param>
/// <returns></returns>
public string ExportExcelToPath(DataSet dataSet, Dictionary<string, string> columnNameDic)
{
return this.ExportExcelToPathInternal(dataSet, columnNameDic);
}
/// <summary>
/// 获取默认的
/// </summary>
/// <returns></returns>
private string GetDefaultSheetName()
{
return string.Format("sheet{0}", _excelSheetCount++);
}
/// <summary>
/// 获取工作簿名称,若dataTable为空或表名不存在,则获取默认工作簿名
/// </summary>
/// <param name="dataTable"></param>
/// <returns></returns>
private string GetSheetName(DataTable dataTable)
{
if (dataTable == null || string.IsNullOrEmpty(dataTable.TableName) || string.IsNullOrEmpty(dataTable.TableName.Trim()))
{
return this.GetDefaultSheetName();
}
else
{
return dataTable.TableName;
}
}
/// <summary>
/// 获取表正文标题列列名称
/// </summary>
/// <param name="dataTable"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
private List<string> GetRowHeadNames(DataTable dataTable, Dictionary<string, string> columnNameDic)
{
List<string> result = new List<string>();
DataColumnCollection dataColumnCollection = dataTable.Columns;
if (dataColumnCollection == null && dataColumnCollection.Count < 1)
{
result.AddRange(columnNameDic.Values.Select(v => v));
return result;
}
if (this.IsDisplayAllFields)
{
foreach (var column in dataColumnCollection)
{
DataColumn dataColumn = column as DataColumn;
if (columnNameDic != null && columnNameDic.Keys.Contains(dataColumn.ColumnName))
{
result.Add(columnNameDic[dataColumn.ColumnName]);
}
else
{
result.Add(dataColumn.ColumnName);
}
}
}
else
{
result.AddRange(columnNameDic.Values);
}
return result;
}
/// <summary>
/// 创建工作簿
/// </summary>
/// <param name="workbook"></param>
/// <param name="dataTable"></param>
/// <param name="columnNameDic"></param>
private void CreateSheet(IWorkbook workbook, DataTable dataTable, Dictionary<string, string> columnNameDic)
{
ISheet sheet = workbook.CreateSheet(this.GetSheetName(dataTable));
List<string> rowHeadNames = this.GetRowHeadNames(dataTable, columnNameDic);
IRow xlsRow;
int rowCounter = 0, cellCounter = 0;
//填充标题
xlsRow = sheet.CreateRow(rowCounter++);
foreach (var name in rowHeadNames)
{
string columnName;
xlsRow.CreateCell(cellCounter);
if (OnBindingXlsHeadValue != null)
{
columnName = OnBindingXlsHeadValue(xlsRow.GetCell(cellCounter), name);
}
else
{
columnName = name;
}
xlsRow.GetCell(cellCounter).SetCellValue(columnName);
cellCounter++;
}
//填充正文
foreach (DataRow row in dataTable.Rows)
{
xlsRow = sheet.CreateRow(rowCounter++);
cellCounter = 0;
if (this.IsDisplayAllFields)
{
foreach (DataColumn column in dataTable.Columns)
{
object value = row[column] ?? string.Empty;
xlsRow.CreateCell(cellCounter);
if (OnBindingXlsBodyValue != null)
{
value = OnBindingXlsBodyValue(xlsRow.GetCell(cellCounter), value);
}
xlsRow.GetCell(cellCounter).SetCellValue(value.ToString());
cellCounter++;
}
}
else
{
foreach (string key in columnNameDic.Keys)
{
object value = row[key] ?? string.Empty;
xlsRow.CreateCell(cellCounter);
if (OnBindingXlsBodyValue != null)
{
value = OnBindingXlsBodyValue(xlsRow.GetCell(cellCounter), value);
}
xlsRow.GetCell(cellCounter).SetCellValue(value.ToString());
cellCounter++;
}
}
}
}
/// <summary>
/// 以路径的形式导出excel
/// 注:取dataSet中DataTable的名称为工作簿名称,若不存在表名,则由系统自定义工作簿名称
/// </summary>
/// <param name="dataSet"></param>
/// <param name="columnNameDic"></param>
/// <returns></returns>
private string ExportExcelToPathInternal(DataSet dataSet, Dictionary<string, string> columnNameDic)
{
IWorkbook workbook = new HSSFWorkbook();
DataTableCollection dataTableCollection = (dataSet ?? new DataSet()).Tables;
//如果表集为空时,提供一个默认表
if (dataTableCollection.Count < 1)
{
dataTableCollection.Add(new DataTable(GetDefaultSheetName()));
}
//创建工作簿
foreach (var dataTable in dataTableCollection)
{
this.CreateSheet(workbook, dataTable as DataTable, columnNameDic);
}
//返回数据
string
rootFullPath = HttpContext.Current.Server.MapPath(FileStoredPath),
storedFullPath;
if (!Directory.Exists(rootFullPath))
{
Directory.CreateDirectory(rootFullPath);
}
storedFullPath = Path.Combine(HttpContext.Current.Server.MapPath(FileStoredPath), FileName + ".xls");
using (FileStream fileStream = new FileStream(storedFullPath, FileMode.Create))
{
workbook.Write(fileStream);
}
return storedFullPath;
}
#endregion
}
}

浙公网安备 33010602011771号