【推荐】.NET使用NPOI组件将数据导出Excel

原文地址为: 【推荐】.NET使用NPOI组件将数据导出Excel

1、NPOI官方网站http://npoi.codeplex.com/

   可以到此网站上去下载最新的NPOI组件版本

2、NPOI在线学习教程(中文版):

    http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html

   感谢Tony Qu分享出NPOI组件的使用方法

3、.NET调用NPOI组件导入导出Excel的操作类
  此NPOI操作类的优点如下:
   (1)支持web及winform从DataTable导出到Excel; 
   (2)生成速度很快; 
   (3)准确判断数据类型,不会出现身份证转数值等问题; 
   (4)如果单页条数大于65535时会新建工作表; 
   (5)列宽自适应;

961ddebeb323a10fe0623af514929fc1.jpe NPOI操作类
  1  using  System;
  2  using  System.Data;
  3  using  System.Configuration;
  4  using  System.Web;
  5  using  System.Web.Security;
  6  using  System.Web.UI;
  7  using  System.Web.UI.HtmlControls;
  8  using  System.Web.UI.WebControls;
  9  using  System.Web.UI.WebControls.WebParts;
 10  using  System.IO;
 11  using  System.Text;
 12  using  NPOI;
 13  using  NPOI.HPSF;
 14  using  NPOI.HSSF;
 15  using  NPOI.HSSF.UserModel;
 16  using  NPOI.HSSF.Util;
 17  using  NPOI.POIFS;
 18  using  NPOI.Util;   
 20  namespace  PMS.Common
 21  {
 22       public   class  NPOIHelper
 23      {
 24           ///   <summary>
 25           ///  DataTable导出到Excel文件
 26           ///   </summary>
 27           ///   <param name="dtSource"> 源DataTable </param>
 28           ///   <param name="strHeaderText"> 表头文本 </param>
 29           ///   <param name="strFileName"> 保存位置 </param>
 30           public   static   void  Export(DataTable dtSource,  string  strHeaderText,  string  strFileName)
 31          {
 32               using  (MemoryStream ms  =  Export(dtSource, strHeaderText))
 33              {
 34                   using  (FileStream fs  =   new  FileStream(strFileName, FileMode.Create, FileAccess.Write))
 35                  {
 36                       byte [] data  =  ms.ToArray();
 37                      fs.Write(data,  0 , data.Length);
 38                      fs.Flush();
 39                  }
 40              }
 41          }
 42 
 43           ///   <summary>
 44           ///  DataTable导出到Excel的MemoryStream
 45           ///   </summary>
 46           ///   <param name="dtSource"> 源DataTable </param>
 47           ///   <param name="strHeaderText"> 表头文本 </param>
 48           public   static  MemoryStream Export(DataTable dtSource,  string  strHeaderText)
 49          {
 50              HSSFWorkbook workbook  =   new  HSSFWorkbook();
 51              HSSFSheet sheet  =  workbook.CreateSheet();
 52 
 53               #region  右击文件 属性信息
 54              {
 55                  DocumentSummaryInformation dsi  =  PropertySetFactory.CreateDocumentSummaryInformation();
 56                  dsi.Company  =   " NPOI " ;
 57                  workbook.DocumentSummaryInformation  =  dsi;
 58 
 59                  SummaryInformation si  =  PropertySetFactory.CreateSummaryInformation();
 60                  si.Author  =   " 文件作者信息 " // 填加xls文件作者信息
 61                  si.ApplicationName  =   " 创建程序信息 " // 填加xls文件创建程序信息
 62                  si.LastAuthor  =   " 最后保存者信息 " // 填加xls文件最后保存者信息
 63                  si.Comments  =   " 作者信息 " // 填加xls文件作者信息
 64                  si.Title  =   " 标题信息 " // 填加xls文件标题信息
 65                  si.Subject  =   " 主题信息 " ; // 填加文件主题信息
 66                  si.CreateDateTime  =  DateTime.Now;
 67                  workbook.SummaryInformation  =  si;
 68              }
 69               #endregion
 70 
 71              HSSFCellStyle dateStyle  =  workbook.CreateCellStyle();
 72              HSSFDataFormat format  =  workbook.CreateDataFormat();
 73              dateStyle.DataFormat  =  format.GetFormat( " yyyy-mm-dd " );
 74 
 75               // 取得列宽
 76               int [] arrColWidth  =   new   int [dtSource.Columns.Count];
 77               foreach  (DataColumn item  in  dtSource.Columns)
 78              {
 79                  arrColWidth[item.Ordinal]  =  Encoding.GetEncoding( 936 ).GetBytes(item.ColumnName.ToString()).Length;
 80              }
 81               for  ( int  i  =   0 ; i  <  dtSource.Rows.Count; i ++ )
 82              {
 83                   for  ( int  j  =   0 ; j  <  dtSource.Columns.Count; j ++ )
 84                  {
 85                       int  intTemp  =  Encoding.GetEncoding( 936 ).GetBytes(dtSource.Rows[i][j].ToString()).Length;
 86                       if  (intTemp  >  arrColWidth[j])
 87                      {
 88                          arrColWidth[j]  =  intTemp;
 89                      }
 90                  }
 91              } 
 95               int  rowIndex  =   0 ; 
 97               foreach  (DataRow row  in  dtSource.Rows)
 98              {
 99                   #region  新建表,填充表头,填充列头,样式
100                   if  (rowIndex  ==   65535   ||  rowIndex  ==   0 )
101                  {
102                       if  (rowIndex  !=   0 )
103                      {
104                          sheet  =  workbook.CreateSheet();
105                      }
106 
107                       #region  表头及样式
108                      {
109                          HSSFRow headerRow  =  sheet.CreateRow( 0 );
110                          headerRow.HeightInPoints  =   25 ;
111                          headerRow.CreateCell( 0 ).SetCellValue(strHeaderText);
112 
113                          HSSFCellStyle headStyle  =  workbook.CreateCellStyle();
114                          headStyle.Alignment  =  CellHorizontalAlignment.CENTER;
115                          HSSFFont font  =  workbook.CreateFont();
116                          font.FontHeightInPoints  =   20 ;
117                          font.Boldweight  =   700 ;
118                          headStyle.SetFont(font);
119                          headerRow.GetCell( 0 ).CellStyle  =  headStyle;
120                          sheet.AddMergedRegion( new  Region( 0 0 0 , dtSource.Columns.Count  -   1 ));
121                          headerRow.Dispose();
122                      }
123                       #endregion
124 
125 
126                       #region  列头及样式
127                      {
128                          HSSFRow headerRow  =  sheet.CreateRow( 1 ); 
131                          HSSFCellStyle headStyle  =  workbook.CreateCellStyle();
132                          headStyle.Alignment  =  CellHorizontalAlignment.CENTER;
133                          HSSFFont font  =  workbook.CreateFont();
134                          font.FontHeightInPoints  =   10 ;
135                          font.Boldweight  =   700 ;
136                          headStyle.SetFont(font); 
139                           foreach  (DataColumn column  in  dtSource.Columns)
140                          {
141                              headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
142                              headerRow.GetCell(column.Ordinal).CellStyle  =  headStyle;
143 
144                               // 设置列宽
145                              sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal]  +   1 *   256 ); 
147                          }
148                          headerRow.Dispose();
149                      }
150                       #endregion
151 
152                      rowIndex  =   2 ;
153                  }
154                   #endregion
155 
156 
157                   #region  填充内容
158                  HSSFRow dataRow  =  sheet.CreateRow(rowIndex);
159                   foreach  (DataColumn column  in  dtSource.Columns)
160                  {
161                      HSSFCell newCell  =  dataRow.CreateCell(column.Ordinal);
162 
163                       string  drValue  =  row[column].ToString();
164 
165                       switch  (column.DataType.ToString())
166                      {
167                           case   " System.String " : // 字符串类型
168                              newCell.SetCellValue(drValue);
169                               break ;
170                           case   " System.DateTime " : // 日期类型
171                              DateTime dateV;
172                              DateTime.TryParse(drValue,  out  dateV);
173                              newCell.SetCellValue(dateV);
174 
175                              newCell.CellStyle  =  dateStyle; // 格式化显示
176                               break ;
177                           case   " System.Boolean " : // 布尔型
178                               bool  boolV  =   false ;
179                               bool .TryParse(drValue,  out  boolV);
180                              newCell.SetCellValue(boolV);
181                               break ;
182                           case   " System.Int16 " : // 整型
183                           case   " System.Int32 " :
184                           case   " System.Int64 " :
185                           case   " System.Byte " :
186                               int  intV  =   0 ;
187                               int .TryParse(drValue,  out  intV);
188                              newCell.SetCellValue(intV);
189                               break ;
190                           case   " System.Decimal " : // 浮点型
191                           case   " System.Double " :
192                               double  doubV  =   0 ;
193                               double .TryParse(drValue,  out  doubV);
194                              newCell.SetCellValue(doubV);
195                               break ;
196                           case   " System.DBNull " : // 空值处理
197                              newCell.SetCellValue( "" );
198                               break ;
199                           default :
200                              newCell.SetCellValue( "" );
201                               break ;
202                      }
203 
204                  }
205                   #endregion
206 
207                  rowIndex ++ ;
208              } 
211               using  (MemoryStream ms  =   new  MemoryStream())
212              {
213                  workbook.Write(ms);
214                  ms.Flush();
215                  ms.Position  =   0 ;
216 
217                  sheet.Dispose();
218                   // workbook.Dispose(); // 一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
219                   return  ms;
220              } 
222          }
223 
224           ///   <summary>
225           ///  用于Web导出
226           ///   </summary>
227           ///   <param name="dtSource"> 源DataTable </param>
228           ///   <param name="strHeaderText"> 表头文本 </param>
229           ///   <param name="strFileName"> 文件名 </param>
230           public   static   void  ExportByWeb(DataTable dtSource,  string  strHeaderText,  string  strFileName)
231          { 
233              HttpContext curContext  =  HttpContext.Current;
234 
235               //  设置编码和附件格式
236              curContext.Response.ContentType  =   " application/vnd.ms-excel " ;
237              curContext.Response.ContentEncoding  =  Encoding.UTF8;
238              curContext.Response.Charset  =   "" ;
239              curContext.Response.AppendHeader( " Content-Disposition " ,
240                   " attachment;filename= "   +  HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
241 
242              curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
243              curContext.Response.End(); 
245          } 
247 
248           ///   <summary> 读取excel
249           ///  默认第一行为标头
250           ///   </summary>
251           ///   <param name="strFileName"> excel文档路径 </param>
252           ///   <returns></returns>
253           public   static  DataTable Import( string  strFileName)
254          {
255              DataTable dt  =   new  DataTable();
256 
257              HSSFWorkbook hssfworkbook;
258               using  (FileStream file  =   new  FileStream(strFileName, FileMode.Open, FileAccess.Read))
259              {
260                  hssfworkbook  =   new  HSSFWorkbook(file);
261              }
262              HSSFSheet sheet  =  hssfworkbook.GetSheetAt( 0 );
263              System.Collections.IEnumerator rows  =  sheet.GetRowEnumerator();
264 
265              HSSFRow headerRow  =  sheet.GetRow( 0 );
266               int  cellCount  =  headerRow.LastCellNum;
267 
268               for  ( int  j  =   0 ; j  <  cellCount; j ++ )
269              {
270                  HSSFCell cell  =  headerRow.GetCell(j);
271                  dt.Columns.Add(cell.ToString());
272              }
273 
274               for  ( int  i  =  (sheet.FirstRowNum  +   1 ); i  <=  sheet.LastRowNum; i ++ )
275              {
276                  HSSFRow row  =  sheet.GetRow(i);
277                  DataRow dataRow  =  dt.NewRow();
278 
279                   for  ( int  j  =  row.FirstCellNum; j  <  cellCount; j ++ )
280                  {
281                       if  (row.GetCell(j)  !=   null )
282                          dataRow[j]  =  row.GetCell(j).ToString();
283                  }
284 
285                  dt.Rows.Add(dataRow);
286              }
287               return  dt;
288          }
289      }
290  }
291 

 

4、NPOI操作类的调用方法
   DataTable dt_Grade = Tools.Data.GetDataTable(strSQL);
   filename += "绩效考核结果分数统计表";
   PMS.Common.NPOIHelper.ExportByWeb(dt_Grade, filename, filename+".xls");

5、效果展示
   

6、NPOI类库下载:http://files.cnblogs.com/dreamof/NPOIç±»åº.rar

信息来源:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.html


转载请注明本文地址: 【推荐】.NET使用NPOI组件将数据导出Excel
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值