【NPOI簡介】
NPOI 是 POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。
使用 NPOI 你就可以在沒有安裝 Office 或者相應環境的機器上對 WORD/EXCEL 文檔進行讀寫。NPOI是構建在POI 3.x版本之上的,它可以在沒有安裝Office的情況下對Word/Excel文檔進行讀寫操作。
NPOI官方教程地址:http://tonyqus.sinaapp.com
googlecode:http://code.google.com/p/npoi/
codeplex:http://npoi.codeplex.com/
Excel 助手類:
using System;
using System.Data;
using System.IO;
using System.Text;
using System.Web;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Collections.Generic;
using System.Collections;
namespace Weilog.Core.Document.Excel
{
/// <summary>
/// Excel 助手類。
/// </summary>
public class ExcelHelper
{
private void InitializeWorkbook(HSSFWorkbook hssfworkbook, string headerText)
{
hssfworkbook = new HSSFWorkbook();
//創建一個文檔摘要信息實體。
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "Weilog Team"; //公司名稱
hssfworkbook.DocumentSummaryInformation = dsi;
//創建一個摘要信息實體。
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "Weilog 系統生成";
si.Author = "Weilog 系統";
si.Title = headerText;
si.Subject = headerText;
si.CreateDateTime = DateTime.Now;
hssfworkbook.SummaryInformation = si;
}
private static MemoryStream WriteToStream(HSSFWorkbook hssfworkbook)
{
//Write the stream data of workbook to the root directory
MemoryStream file = new MemoryStream();
hssfworkbook.Write(file);
return file;
}
//Export(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle)
/// <summary>
/// 向客戶端輸出文件。
/// </summary>
/// <param name="table">數據表。</param>
/// <param name="headerText">頭部文本。</param>
/// <param name="sheetName"></param>
/// <param name="columnName">數據列名稱。</param>
/// <param name="columnTitle">表標題。</param>
/// <param name="fileName">文件名稱。</param>
public static void Write(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle, string fileName)
{
HttpContext context = HttpContext.Current;
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}",HttpUtility.UrlEncode(fileName, Encoding.UTF8)));
context.Response.Clear();
HSSFWorkbook hssfworkbook = GenerateData(table, headerText, sheetName, columnName, columnTitle);
context.Response.BinaryWrite(WriteToStream(hssfworkbook).GetBuffer());
context.Response.End();
}
/// <summary>
///
/// </summary>
/// <param name="table"></param>
/// <param name="headerText"></param>
/// <param name="sheetName"></param>
/// <param name="columnName"></param>
/// <param name="columnTitle"></param>
/// <returns></returns>
public static HSSFWorkbook GenerateData(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
ISheet sheet = hssfworkbook.CreateSheet(sheetName);
#region 設置文件屬性信息
//創建一個文檔摘要信息實體。
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "Weilog Team"; //公司名稱
hssfworkbook.DocumentSummaryInformation = dsi;
//創建一個摘要信息實體。
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "本文檔由 Weilog 系統生成";
si.Author = " Weilog 系統";
si.Title = headerText;
si.Subject = headerText;
si.CreateDateTime = DateTime.Now;
hssfworkbook.SummaryInformation = si;
#endregion
ICellStyle dateStyle = hssfworkbook.CreateCellStyle();
IDataFormat format = hssfworkbook.CreateDataFormat();
dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
#region 取得列寬
int[] colWidth = new int[columnName.Length];
for (int i = 0; i < columnName.Length; i++)
{
colWidth[i] = Encoding.GetEncoding(936).GetBytes(columnTitle[i]).Length;
}
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < columnName.Length; j++)
{
int intTemp = Encoding.GetEncoding(936).GetBytes(table.Rows[i][columnName[j]].ToString()).Length;
if (intTemp > colWidth[j])
{
colWidth[j] = intTemp;
}
}
}
#endregion
int rowIndex = 0;
foreach (DataRow row in table.Rows)
{
#region 新建表,填充表頭,填充列頭,樣式
if (rowIndex == 65535 || rowIndex == 0)
{
if (rowIndex != 0)
{
sheet = hssfworkbook.CreateSheet(sheetName + ((int)rowIndex / 65535).ToString());
}
#region 表頭及樣式
//if (!string.IsNullOrEmpty(headerText))
{
IRow headerRow = sheet.CreateRow(0);
headerRow.HeightInPoints = 25;
headerRow.CreateCell(0).SetCellValue(headerText);
ICellStyle headStyle = hssfworkbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.CENTER;
IFont font = hssfworkbook.CreateFont();
font.FontHeightInPoints = 20;
font.Boldweight = 700;
headStyle.SetFont(font);
headerRow.GetCell(0).CellStyle = headStyle;
//sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, table.Columns.Count - 1));
}
#endregion
#region 列頭及樣式
{
//HSSFRow headerRow = sheet.CreateRow(1);
IRow headerRow;
//if (!string.IsNullOrEmpty(headerText))
//{
// headerRow = sheet.CreateRow(0);
//}
//else
//{
headerRow = sheet.CreateRow(1);
//}
ICellStyle headStyle = hssfworkbook.CreateCellStyle();
headStyle.Alignment = HorizontalAlignment.CENTER;
IFont font = hssfworkbook.CreateFont();
font.FontHeightInPoints = 10;
font.Boldweight = 700;
headStyle.SetFont(font);
for (int i = 0; i < columnName.Length; i++)
{
headerRow.CreateCell(i).SetCellValue(columnTitle[i]);
headerRow.GetCell(i).CellStyle = headStyle;
//設置列寬
if ((colWidth[i] + 1) * 256 > 30000)
{
sheet.SetColumnWidth(i, 10000);
}
else
{
sheet.SetColumnWidth(i, (colWidth[i] + 1) * 256);
}
}
/*
foreach (DataColumn column in dtSource.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
//設置列寬
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
}
* */
}
#endregion
//if (!string.IsNullOrEmpty(headerText))
//{
// rowIndex = 1;
//}
//else
//{
rowIndex = 2;
//}
}
#endregion
#region 填充數據
IRow dataRow = sheet.CreateRow(rowIndex);
for (int i = 0; i < columnName.Length; i++)
{
ICell newCell = dataRow.CreateCell(i);
string drValue = row[columnName[i]].ToString();
switch (table.Columns[columnName[i]].DataType.ToString())
{
case "System.String"://字符串類型
if (drValue.ToUpper() == "TRUE")
newCell.SetCellValue("是");
else if (drValue.ToUpper() == "FALSE")
newCell.SetCellValue("否");
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);
if (boolV)
newCell.SetCellValue("是");
else
newCell.SetCellValue("否");
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;
}
}
#endregion
rowIndex++;
}
return hssfworkbook;
}
}
}
使用的過程中需要將實體對象集合轉換成 DataTable
使用方法:
#region 將指定的集合轉換成數據表...
/// <summary>
/// 將指定的集合轉換成DataTable。
/// </summary>
/// <param name="list">將指定的集合。</param>
/// <returns>返回轉換后的DataTable。</returns>
public static DataTable ListToDataTable(IList list)
{
DataTable table = new DataTable();
if (list.Count > 0)
{
PropertyInfo[] propertys = list[0].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
Type pt = pi.PropertyType;
if ((pt.IsGenericType) && (pt.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
pt = pt.GetGenericArguments()[0];
}
table.Columns.Add(new DataColumn(pi.Name, pt));
}
for (int i = 0; i < list.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
object obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
object[] array = tempList.ToArray();
table.LoadDataRow(array, true);
}
}
return table;
}
#endregion
#region 導出數據...
private void ExportData(List<ProductInfo> productList)
{
var exportDataList =
(from productInfo in ProductList
new
{
Code = productInfo.Code,
Name = productInfo.Name,
DeptName = productInfo.DeptName,
ProjectName = productInfo.ProjectName,
CategoryName = productInfo.CategoryName,
Intro = productInfo.Intro,
Level = productInfo.Level,
Objective = productInfo.Objective
}).ToList();
DataTable table = ListToDataTable(exportDataList);
string[] strFields = { "Code", "Name", "DeptName", "ProjectName", "CategoryName", "Intro", "Level", "Objective" };
string[] strFieldsName = { "編碼", "名稱", "所屬部門", "所屬項目", "分類", "簡介", "等級", "目標" };
ExcelHelper.Write(table, "產品表", "產品表", strFields, strFieldsName, "產品表.xls");
}
#endregion
