/// <summary>
/// NPOI导出帮助类
/// </summary>
public class NPOIHelper
{
/// <summary>
/// DataTable导出到Excel的MemoryStream
/// </summary>
/// <param name="dt">源DataTable</param>
/// <param name="dicTableHeader">表头文本</param>
private static MemoryStream Export(DataTable dt, Dictionary<string, string> dicTableHeader)
{
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("工作表1");
IRow headerRow = sheet.CreateRow(0);
int headerIndex = 0;
ICellStyle headerCellStyle = Getcellstyle(workbook, stylexls.头);
ICellStyle dateCellStyle = Getcellstyle(workbook, stylexls.时间);
foreach (var item in dicTableHeader)
{
ICell cell = headerRow.CreateCell(headerIndex);
cell.CellStyle = headerCellStyle;
cell.SetCellValue(item.Value);
headerIndex = headerIndex + 1;
}
sheet.CreateFreezePane(0, 1, 0, 1);
int rowCount = dt.Rows.Count;
for (int i = 0; i < rowCount; i++)
{
IRow row = sheet.CreateRow(i + 1);
int rowIndex = 0;
foreach (var item in dicTableHeader)
{
ICell newCell = row.CreateCell(rowIndex);
rowIndex = rowIndex + 1;
DataColumn dc = dt.Columns[item.Key];
string drValue = dt.Rows[i][item.Key].ToString();
switch (dc.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV);
newCell.CellStyle = dateCellStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = 0;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
}
}
}
////自动列宽
//for (int i = 0; i <= dicTableHeader.Count; i++)
// sheet.AutoSizeColumn(i, true);
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}
/// <summary>
/// DataTable导出到Excel的MemoryStream
/// </summary>
/// <param name="dt">数据源DataTable</param>
/// <param name="heardList">头部列表</param>
/// <returns></returns>
private static MemoryStream Export(DataTable dt, IList<SYS_DICT> heardList)
{
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("工作表1");
ICellStyle headerCellStyle = Getcellstyle(workbook, stylexls.头);
ICellStyle dateCellStyle = Getcellstyle(workbook, stylexls.时间);
IRow headerRow = sheet.CreateRow(0);
int headerIndex = 0;
foreach (var item in heardList)
{
ICell cell = headerRow.CreateCell(headerIndex);
cell.CellStyle = headerCellStyle;
cell.SetCellValue(item.fname_ch);
headerIndex = headerIndex + 1;
}
sheet.CreateFreezePane(0, 1, 0, 1);
int rowCount = dt.Rows.Count;
for (int i = 0; i < rowCount; i++)
{
IRow row = sheet.CreateRow(i + 1);
int rowIndex = 0;
foreach (var item in heardList)
{
ICell newCell = row.CreateCell(rowIndex);
rowIndex = rowIndex + 1;
DataColumn dc = dt.Columns[item.field_name];
string drValue = dt.Rows[i][item.field_name].ToString();
switch (dc.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV);
newCell.CellStyle = dateCellStyle;//格式化显示
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
newCell.SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32":
case "System.Int64":
case "System.Byte":
int intV = 0;
int.TryParse(drValue, out intV);
newCell.SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
newCell.SetCellValue(doubV);
break;
case "System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
}
}
}
////自动列宽
//for (int i = 0; i <= dicTableHeader.Count; i++)
// sheet.AutoSizeColumn(i, true);
int heardListLen = heardList.Count;
for (int i = 0; i < heardListLen; i++)
{
int width = 0;
int.TryParse(heardList[i].ExcelColWidth.ToString(), out width);
width = (int)((width + 0.72) * 256);
sheet.SetColumnWidth(i, width);
}
using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}
/// <summary>
/// 用于Web导出
/// </summary>
/// <param name="dt">数据源DataTable</param>
/// <param name="strFileName">文件名</param>
/// <param name="dicTableHeader">导出对照</param>
public static void ExportByWeb(DataTable dt, string strFileName, Dictionary<string, string> dicTableHeader)
{
HttpContext curContext = HttpContext.Current;
// 设置编码和附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
strFileName = strFileName + DateTime.Now.ToString("yyyyMMddHHmmss");
string fileName = HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xls";
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + fileName);
curContext.Response.BinaryWrite(Export(dt, dicTableHeader).GetBuffer());
curContext.Response.End();
}
/// <summary>
/// Web Excel导出
/// </summary>
/// <param name="dt">数据源DataTable</param>
/// <param name="strFileName">文件名</param>
/// <param name="heardList">头部列表</param>
public static void ExportByWeb(DataTable dt, string strFileName, IList<SYS_DICT> heardList)
{
HttpContext curContext = HttpContext.Current;
// 设置编码和附件格式
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
strFileName = strFileName + DateTime.Now.ToString("yyyyMMddHHmmss");
string fileName = HttpUtility.UrlEncode(strFileName, Encoding.UTF8) + ".xls";
curContext.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + fileName);
curContext.Response.BinaryWrite(Export(dt, heardList).GetBuffer());
curContext.Response.End();
}
#region 定义单元格常用到样式的枚举
public enum stylexls
{
头,
url,
时间,
数字,
钱,
百分比,
中文大写,
科学计数法,
默认
}
#endregion
#region 定义单元格常用到样式
private static ICellStyle Getcellstyle(IWorkbook wb, stylexls str)
{
ICellStyle cellStyle = wb.CreateCellStyle();
//定义几种字体
//也可以一种字体,写一些公共属性,然后在下面需要时加特殊的
IFont font12 = wb.CreateFont();
font12.FontHeightInPoints = 10;
font12.FontName = "微软雅黑";
IFont headerFont = wb.CreateFont();
headerFont.FontHeightInPoints = 10;
headerFont.IsBold = true;
headerFont.FontName = "微软雅黑";
IFont font = wb.CreateFont();
font.FontName = "微软雅黑";
//font.Underline = 1;下划线
IFont fontcolorblue = wb.CreateFont();
fontcolorblue.Color = HSSFColor.OliveGreen.Blue.Index;
fontcolorblue.IsItalic = true;//下划线
fontcolorblue.FontName = "微软雅黑";
//边框
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Dotted;
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Hair;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Hair;
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Dotted;
//边框颜色
cellStyle.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index;
cellStyle.TopBorderColor = HSSFColor.OliveGreen.Blue.Index;
//背景图形,我没有用到过。感觉很丑
//cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;
//cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index;
cellStyle.FillForegroundColor = HSSFColor.White.Index;
// cellStyle.FillPattern = FillPatternType.NO_FILL;
cellStyle.FillBackgroundColor = HSSFColor.Blue.Index;
//水平对齐
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
//垂直对齐
cellStyle.VerticalAlignment = VerticalAlignment.Center;
//自动换行
cellStyle.WrapText = true;
//缩进;当设置为1时,前面留的空白太大了。希旺官网改进。或者是我设置的不对
cellStyle.Indention = 0;
//上面基本都是设共公的设置
//下面列出了常用的字段类型
switch (str)
{
case stylexls.头:
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
// cellStyle.FillPattern = FillPatternType.LEAST_DOTS;
cellStyle.SetFont(headerFont);
break;
case stylexls.时间:
IDataFormat datastyle = wb.CreateDataFormat();
cellStyle.DataFormat = datastyle.GetFormat("yyyy-MM-dd HH:mm:ss");
cellStyle.SetFont(font);
break;
case stylexls.数字:
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
cellStyle.SetFont(font);
break;
case stylexls.钱:
IDataFormat format = wb.CreateDataFormat();
cellStyle.DataFormat = format.GetFormat("¥#,##0");
cellStyle.SetFont(font);
break;
case stylexls.url:
fontcolorblue.Underline = FontUnderlineType.Single;
cellStyle.SetFont(fontcolorblue);
break;
case stylexls.百分比:
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
cellStyle.SetFont(font);
break;
case stylexls.中文大写:
IDataFormat format1 = wb.CreateDataFormat();
cellStyle.DataFormat = format1.GetFormat("[DbNum2][$-804]0");
cellStyle.SetFont(font);
break;
case stylexls.科学计数法:
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
cellStyle.SetFont(font);
break;
case stylexls.默认:
cellStyle.SetFont(font);
break;
}
return cellStyle;
}
#endregion
}