zoukankan      html  css  js  c++  java
  • ASP.NET使用NPOI加载Excel模板并导出下载

    1、为什么要使用NPOI导出Excel?

    一、解决传统操作Excel遇到的问题:

      1. 如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
      2. Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。
      3. 导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
      4. Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。

    二、个人认为使用NPOI的优势

      1. 导出的速度很快,跟传统的方式不是一个数量级的。
      2. 不用担心进程问题,因为传统的导出方式每导出一个Excel会打开一个Excel进程,不会自动关闭,若手工关闭,必须遍历把所有的Excel进程都杀死,这样会造成不能并发导出的问题。

    2、使用步骤

      第一步:在解决方案中添加引用。

        在这里使用的是NPOI 1.2.5的.net2.0版本,需要引用两个文件:

        

        NPOI 1.2.5的下载地址为:http://npoi.codeplex.com/releases/view/38113

      第二步:在CS文件中添加引用。

    using NPOI.HSSF.UserModel;
    using System.IO;//内存流的使用
    using NPOI.SS.UserModel

       第三步:具体使用代码

             #region 加载模板文件到工作簿对象中
    
                //创建工作簿对象
                HSSFWorkbook hssfworkbook;
                //打开模板文件到文件流中
                using (FileStream file = new FileStream(HttpContext.Current.Request.PhysicalApplicationPath + @"template/book1.xls", FileMode.Open, FileAccess.Read))
                {
                    //将文件流中模板加载到工作簿对象中
                    hssfworkbook = new HSSFWorkbook(file);
                } 
    
                #endregion
    
                #region 根据模板设置工作表的内容
    
                //建立一个名为Sheet1的工作表
                ISheet sheet1 = hssfworkbook.GetSheet("Sheet1");
                //将数据添加到表中对应的单元格中,因为行已经创建,不需要重新创建行
                sheet1.GetRow(1).GetCell(1).SetCellValue(200200);
                sheet1.GetRow(2).GetCell(1).SetCellValue(300);
                sheet1.GetRow(3).GetCell(1).SetCellValue(500050);
                sheet1.GetRow(4).GetCell(1).SetCellValue(8000);
                sheet1.GetRow(5).GetCell(1).SetCellValue(110);
                sheet1.GetRow(6).GetCell(1).SetCellValue(100);
                sheet1.GetRow(7).GetCell(1).SetCellValue(200);
                sheet1.GetRow(8).GetCell(1).SetCellValue(210);
                sheet1.GetRow(9).GetCell(1).SetCellValue(2300);
                sheet1.GetRow(10).GetCell(1).SetCellValue(240);
                sheet1.GetRow(11).GetCell(1).SetCellValue(180123);
                sheet1.GetRow(12).GetCell(1).SetCellValue(150);
    
                //强制Excel重新计算表中所有的公式
                sheet1.ForceFormulaRecalculation = true; 
    
                #endregion
    
                #region 设置响应头(文件名和文件格式)
    
                //设置响应的类型为Excel
                Response.ContentType = "application/vnd.ms-excel";
                //设置下载的Excel文件名
                Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", "test.xls"));
                //Clear方法删除所有缓存中的HTML输出。但此方法只删除Response显示输入信息,不删除Response头信息。以免影响导出数据的完整性。
                Response.Clear(); 
    
                #endregion
    
                #region 写入到客户端
    
                using (MemoryStream ms = new MemoryStream())
                {
                    //将工作簿的内容放到内存流中
                    hssfworkbook.Write(ms);
                    //将内存流转换成字节数组发送到客户端
                    Response.BinaryWrite(ms.GetBuffer());
                    Response.End();
                } 
    
                #endregion

     3、总结

    1. 加载模板文件到工作簿对象中。
    2. 根据模板设置工作表的内容。
    3. 设置响应头(文件名和文件格式)。
    4. 写入到客户端。

    4、参考资料

      http://tonyqus.sinaapp.com/archives/545  注意:里面的代码不是最新的。

      还有一个重要参考就是NPOI下载提供的例子,里面的例子挺全的,可供参考。

  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/hdkn235/p/3440691.html
Copyright © 2011-2022 走看看