【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