You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

284 lines
12 KiB

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
namespace NFine.Code.Excel
{
public class NPOIExcel
{
private string _title;
private string _sheetName;
private string _filePath;
/// <summary>
/// 导出到Excel
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
public bool ToExcel(DataTable table)
{
FileStream fs = new FileStream(this._filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
IWorkbook workBook = new HSSFWorkbook();
this._sheetName = this._sheetName.IsEmpty() ? "sheet1" : this._sheetName;
ISheet sheet = workBook.CreateSheet(this._sheetName);
//处理表格标题
IRow row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue(this._title);
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, table.Columns.Count - 1));
row.Height = 500;
ICellStyle cellStyle = workBook.CreateCellStyle();
IFont font = workBook.CreateFont();
font.FontName = "微软雅黑";
font.FontHeightInPoints = 17;
cellStyle.SetFont(font);
cellStyle.VerticalAlignment = VerticalAlignment.Center;
cellStyle.Alignment = HorizontalAlignment.Center;
row.Cells[0].CellStyle = cellStyle;
//处理表格列头
row = sheet.CreateRow(1);
for (int i = 0; i < table.Columns.Count; i++)
{
row.CreateCell(i).SetCellValue(table.Columns[i].ColumnName);
row.Height = 350;
sheet.AutoSizeColumn(i);
}
//处理数据内容
for (int i = 0; i < table.Rows.Count; i++)
{
row = sheet.CreateRow(2 + i);
row.Height = 250;
for (int j = 0; j < table.Columns.Count; j++)
{
row.CreateCell(j).SetCellValue(table.Rows[i][j].ToString());
sheet.SetColumnWidth(j, 256 * 15);
}
}
//写入数据流
workBook.Write(fs);
fs.Flush();
fs.Close();
return true;
}
/// <summary>
/// 导出到Excel
/// </summary>
/// <param name="table"></param>
/// <param name="title"></param>
/// <param name="sheetName"></param>
/// <returns></returns>
public bool ToExcel(DataTable table, string title, string sheetName, string filePath)
{
this._title = title;
this._sheetName = sheetName;
this._filePath = filePath;
return ToExcel(table);
}
/// <summary>
/// 组装workbook.
/// </summary>
/// <param name="dictionary">列头</param>
/// <param name="dt">dataTable数据</param>
/// <param name="columnHeader">表头</param>
/// <returns></returns>
public HSSFWorkbook BuildWorkbook(Dictionary<string, string> dictionary, DataTable dt, string columnHeader = "")
{
var workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet(string.IsNullOrWhiteSpace(dt.TableName) ? "Sheet1" : dt.TableName);
var dateStyle = workbook.CreateCellStyle();
var format = workbook.CreateDataFormat();
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
//取得列宽
// var arrColWidth = new int[dt.Columns.Count];
var arrColWidth = new int[dictionary.Count + 1];
int itemCoutn = 0;//需要导出的列的数量.
foreach (DataColumn item in dt.Columns)
{
//判断需要导出的 “列”
if (dictionary.ContainsKey(item.ColumnName))
{
arrColWidth[itemCoutn] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
itemCoutn++;
}
}
itemCoutn = 0;
for (var i = 0; i < dt.Rows.Count; i++)
{
for (var j = 0; j < dt.Columns.Count; j++)
{
//判断需要导出的 “列”
if (dictionary.ContainsKey(dt.Rows[i][j].ToString()))
{
int intTemp = Encoding.GetEncoding(936).GetBytes(dt.Rows[i][j].ToString()).Length;
if (intTemp > arrColWidth[j])
{
arrColWidth[j] = intTemp;
}
}
}
}
int rowIndex = 0;//行索引,第一行为:表头(列头)
foreach (DataRow row in dt.Rows)
{
#region 表头 列头
if (rowIndex == 65535 || rowIndex == 0)
{
if (rowIndex != 0)
{
sheet = workbook.CreateSheet();
}
#region 表头及样式
{
IRow headerRow = sheet.CreateRow(0);
headerRow.HeightInPoints = 19.5F;
headerRow.Height = 40 * 20;
headerRow.CreateCell(0).SetCellValue(columnHeader);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
// 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
headStyle.FillForegroundColor = (short)11;
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 20;
font.Boldweight = 700;
headStyle.SetFont(font);
headerRow.GetCell(0).CellStyle = headStyle;
//根据表的列数计算
//sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count - 1));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dictionary.Count));
#endregion
}
{
#region 列头及样式
var headerRow = sheet.CreateRow(1);
//CellStyle
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;// 左右居中
headStyle.VerticalAlignment = VerticalAlignment.Center;// 上下居中
//定义font
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 10;
font.Boldweight = 700;
headStyle.SetFont(font);
int columnCount = 0;
foreach (var dic in dictionary)
{
foreach (DataColumn column in dt.Columns)
{
//判断需要导出的 “列”
if (dic.Key.ToLower() == column.ColumnName.ToLower())
{
//headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
//headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
//sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
headerRow.CreateCell(columnCount).SetCellValue(dic.Value);//column.ColumnName
headerRow.GetCell(columnCount).CellStyle = headStyle;
sheet.SetColumnWidth(columnCount, (arrColWidth[columnCount]) * 256);
columnCount++;
continue;
}
}
}
#endregion
}
rowIndex = 2;
}
#endregion
#region 内容
var dataRow = sheet.CreateRow(rowIndex);
int columnContentCount = 0; //column.Ordinal
foreach (var dicKey in dictionary)
{
foreach (DataColumn column in dt.Columns)
{
//判断需要导出的 “列”
if (dicKey.Key.ToLower() == column.ColumnName.ToLower())
{
var newCell = dataRow.CreateCell(columnContentCount);
string drValue = row[column].ToString();
switch (column.DataType.ToString())
{
case "System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
newCell.SetCellValue(dateV);
newCell.CellStyle = dateStyle;//格式化显示
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;
}
columnContentCount++;//列索引
continue;
}
}
}
#endregion
rowIndex++;
}
//自动列宽
for (int i = 0; i <= dictionary.Count; i++)
sheet.AutoSizeColumn(i, true);
return workbook;
}
}
}