zoukankan      html  css  js  c++  java
  • 导出到Excel中NPOI

    源地址:http://www.cnblogs.com/dreamof/archive/2010/06/02/1750151.html

    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)列宽自适应;

    NPOI操作类
    <!--

    Code highlighting produced by Actipro CodeHighlighter (freeware)
    http://www.CodeHighlighter.com/

    -->  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= newint[dtSource.Columns.Count];
    77            foreach (DataColumn itemin 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 rowin 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 columnin 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 columnin 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,stringstrFileName)
    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

  • 相关阅读:
    关于${pageContext.request.contextPath}的理解
    Spring中的八大设计模式
    mybatis pagehelper分页插件使用
    什么是JavaConfig
    springboot优缺点
    Redis持久化的两种方式和配置
    未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
    关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
    C#关于微信昵称中存在的表情图标乱码解决
    移动端调用相机拍照上传图片
  • 原文地址:https://www.cnblogs.com/sjqq/p/6771545.html
Copyright © 2011-2022 走看看