using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using System.Data;
using System.ComponentModel;
using System.Web.Mvc;
namespace Util
{
public class ExcelHelper
{
public static class ExportTool<T>
{
/// <summary>
/// List<T>转化为Excel文件,并返回FileStreamResult
/// </summary>
/// <param name="list">需要转化的List<T></param>
/// <param name="headerList">Excel标题行的List列表</param>
/// <param name="fileName">Excel的文件名</param>
/// <returns></returns>
public static FileStreamResult ExportListToExcel_MVCResult(IList<T> list, IList<String> headerList, String fileName)
{
FileStreamResult fsr = new FileStreamResult(ExportListToExcel(list, headerList, null), "application/ms-excel");
fsr.FileDownloadName = HttpUtility.UrlEncode(fileName + ".xls");
return fsr;
}
/// <summary>
/// List<T>转化为Excel文件,并返回FileStreamResult
/// </summary>
/// <param name="list">需要转化的List<T></param>
/// <param name="headerList">Excel标题行的List列表</param>
/// <param name="fileName">Excel的文件名</param>
/// <param name="sortList">指定导出List<T>中哪些属性,并按顺序排序</param>
/// <returns></returns>
public static FileStreamResult ExportListToExcel_MVCResult(IList<T> list, IList<String> headerList, String fileName, IList<String> sortList)
{
FileStreamResult fsr = new FileStreamResult(ExportListToExcel(list, headerList, sortList), "application/ms-excel");
fsr.FileDownloadName = HttpUtility.UrlEncode(fileName + ".xls");
return fsr;
}
public static MemoryStream ExportListToExcel(IList<T> list, IList<String> headerList, IList<String> sortList)
{
try
{
//文件流对象
//FileStream file = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
MemoryStream stream = new MemoryStream();
//打开Excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
//Excel的Sheet对象
NPOI.SS.UserModel.Sheet sheet = workbook.CreateSheet("sheet1");
//set date format
CellStyle cellStyleDate = workbook.CreateCellStyle();
DataFormat format = workbook.CreateDataFormat();
cellStyleDate.DataFormat = format.GetFormat("yyyy年m月d日");
//使用NPOI操作Excel表
NPOI.SS.UserModel.Row row = sheet.CreateRow(0);
int count = 0;
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
//if (headerList != null && properties.Count != headerList.Count)
// throw new Exception("集合的属性个数和标题行List的个数不一致");
//如果没有自定义的行首,那么采用反射集合的属性名做行首
if (headerList == null)
{
for (int i = 0; i < properties.Count; i++) //生成sheet第一行列名
{
NPOI.SS.UserModel.Cell cell = row.CreateCell(count++);
cell.SetCellValue(String.IsNullOrEmpty(properties[i].DisplayName) ? properties[i].Name : properties[i].DisplayName);
}
}
else
{
for (int i = 0; i < headerList.Count; i++) //生成sheet第一行列名
{
NPOI.SS.UserModel.Cell cell = row.CreateCell(count++);
cell.SetCellValue(headerList[i]);
}
}
//将数据导入到excel表中
for (int i = 0; i < list.Count; i++)
{
NPOI.SS.UserModel.Row rows = sheet.CreateRow(i + 1);
count = 0;
object value = null;
//如果自定义导出属性及排序字段为空,那么走反射序号的方式
if (sortList == null)
{
for (int j = 0; j < properties.Count; j++)
{
NPOI.SS.UserModel.Cell cell = rows.CreateCell(count++);
value = properties[j].GetValue(list[i]);
cell.SetCellValue(value == null ? String.Empty : value.ToString());
}
}
else
{
for (int j = 0; j < sortList.Count; j++)
{
NPOI.SS.UserModel.Cell cell = rows.CreateCell(count++);
value = properties[sortList[j]].GetValue(list[i]);
cell.SetCellValue(value == null ? String.Empty : value.ToString());
}
}
}
//保存excel文档
sheet.ForceFormulaRecalculation = true;
workbook.Write(stream);
workbook.Dispose();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
catch
{
return new MemoryStream();
}
}
/// <summary>
/// 将DataSet数据集转换HSSFworkbook对象,并保存为Stream流
/// </summary>
/// <param name="ds"></param>
/// <returns>返回数据流Stream对象</returns>
public static MemoryStream ExportDatasetToExcel(DataSet ds)
{
try
{
//文件流对象
//FileStream file = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
MemoryStream stream = new MemoryStream();
//打开Excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
//Excel的Sheet对象
NPOI.SS.UserModel.Sheet sheet = workbook.CreateSheet("sheet1");
var cellFont = workbook.CreateFont();
var cellStyle = workbook.CreateCellStyle();
//- 加粗,白色前景色
cellFont.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;
//- 这个是填充的模式,可以是网格、花式等。如果需要填充单色,请使用:SOLID_FOREGROUND
//cellStyle.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;
//- 设置这个样式的字体,如果没有设置,将与所有单元格拥有共同字体!
cellStyle.SetFont(cellFont);
cellStyle.Alignment = HorizontalAlignment.CENTER;
//set date format
CellStyle cellStyleDate = workbook.CreateCellStyle();
DataFormat format = workbook.CreateDataFormat();
cellStyleDate.DataFormat = format.GetFormat("yyyy年m月d日");
//使用NPOI操作Excel表
NPOI.SS.UserModel.Row row = sheet.CreateRow(0);
int count = 0;
for (int i = 0; i < ds.Tables[0].Columns.Count; i++) //生成sheet第一行列名
{
NPOI.SS.UserModel.Cell cell = row.CreateCell(count++);
cell.SetCellValue(ds.Tables[0].Columns[i].Caption);
cell.CellStyle = cellStyle;
}
//将数据导入到excel表中
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
NPOI.SS.UserModel.Row rows = sheet.CreateRow(i + 1);
count = 0;
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
NPOI.SS.UserModel.Cell cell = rows.CreateCell(count++);
Type type = ds.Tables[0].Rows[i][j].GetType();
if (type == typeof(int) || type == typeof(Int16)
|| type == typeof(Int32) || type == typeof(Int64))
{
cell.SetCellValue((int)ds.Tables[0].Rows[i][j]);
}
else
{
if (type == typeof(float) || type == typeof(double) || type == typeof(Double))
{
cell.SetCellValue((Double)ds.Tables[0].Rows[i][j]);
}
else
{
if (type == typeof(DateTime))
{
cell.SetCellValue(((DateTime)ds.Tables[0].Rows[i][j]).ToString("yyyy-MM-dd HH:mm"));
}
else
{
if (type == typeof(bool) || type == typeof(Boolean))
{
cell.SetCellValue((bool)ds.Tables[0].Rows[i][j]);
}
else
{
cell.SetCellValue(ds.Tables[0].Rows[i][j].ToString());
}
}
}
}
}
}
//保存excel文档
sheet.ForceFormulaRecalculation = true;
workbook.Write(stream);
workbook.Dispose();
return stream;
}
catch
{
return new MemoryStream();
}
}
}
}
}