zoukankan      html  css  js  c++  java
  • NPOI导出Excel示例

    摘要:使用开源程序NPOI导出Excel示例。NPOI首页地址:http://npoi.codeplex.com/,NPOI示例博客:http://tonyqus.sinaapp.com/。

    示例编写环境:

    操作系统:Windows7 Ultimate SP1 64bit

    开发软件:Visual Studio Ultimate 2012 Update 3

    Office版本:Office Home and Student 2010

    NPOI版本:NPOI 2.0

    示例界面如下:

    本示例中使用到的命名空间:

     1 using System;
     2 using System.Data;
     3 using System.Web;
     4 using System.Web.UI;
     5 using System.Collections.Generic;
     6 using System.Web.UI.WebControls;
     7 using System.IO;
     8 using System.Text;
     9 using NPOI.SS.UserModel;
    10 using NPOI.HSSF.UserModel;
    11 using NPOI.HSSF.Util;
    12 using NPOI.HPSF;
    13 using NPOI.POIFS.FileSystem;
    14 using NPOI.SS.Util;

    导出按钮代码:

     1 protected void btnExportClick(object sender, EventArgs e)
     2 {
     3     // 文件名最好使用英文,中文可能会出现乱码或者丢失文件后缀
     4     string filename = "ReportExport" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
     5     Response.Clear();
     6     Response.ContentType = "application/vnd.ms-excel";
     7     Response.AppendHeader("Content-Type", "applicationnd.ms-excel");
     8     Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename + ".xls");
     9 
    10     // getData()函数返回一个DataTable类型,在本实例中用于获得要导出的数据,可根据项目情况替换该函数
    11     Response.BinaryWrite(getExportContent(getData()).GetBuffer());
    12     Response.Flush();
    13     // 若使用Response.End方法会导致ThreadAbortException 异常,使用下面的语句替换Response.End方法
    14     HttpContext.Current.ApplicationInstance.CompleteRequest();
    15 }

    负责生成导出信息的方法getExportContent示例代码如下:

     1 private MemoryStream getExportContent(DataTable table)
     2 {
     3     // 添加Excel元数据信息
     4     HSSFWorkbook book = new HSSFWorkbook();
     5     DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
     6     dsi.Company = "MyCompany";
     7     book.DocumentSummaryInformation = dsi;
     8 
     9     SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    10     si.Subject = "MySubject";
    11     book.SummaryInformation = si;
    12 
    13     // 声明必要的变量
    14     MemoryStream ms = new MemoryStream();
    15     ISheet sheet = book.CreateSheet("sheet1");
    16     IRow erow = sheet.CreateRow(0);
    17 
    18     // 设置列宽,列宽的单位是256分之一字符,所以10*256表示10个字符宽度
    19     sheet.SetColumnWidth(1, 20 * 256);
    20     sheet.SetColumnWidth(2, 20 * 256);
    21     sheet.SetColumnWidth(3, 10 * 256);
    22     sheet.SetColumnWidth(4, 10 * 256);
    23 
    24     // 增加表头
    25     buildSheetTitle(book);
    26 
    27     // 增加内容,标题占两行,从第三行添加数据内容。
    28     // 在NPOI中行列以0作为起始
    29     int rindex = 2;
    30     foreach (DataRow r in table.Rows)
    31     {
    32         erow = sheet.CreateRow(rindex);
    33         // 序号
    34         erow.CreateCell(0).SetCellValue(rindex - 1);
    35         for (int c = 0; c < table.Columns.Count; c++)
    36         {
    37             erow.CreateCell(c + 1).SetCellValue(r[c].ToString());
    38         }
    39         rindex++;
    40     }
    41     //  对相同的列进行纵向合并
    42     mergeColumn(book);
    43 
    44 
    45     book.Write(ms);
    46     ms.Flush();
    47     ms.Position = 0;
    48     return ms;
    49 }

    增加表头方法buildSheetTitle示例代码:

     1 private void buildSheetTitle(HSSFWorkbook book)
     2 {
     3     // 定义必要变量
     4     ISheet sheet = book.GetSheetAt(0);
     5     IRow erow = sheet.CreateRow(0);
     6     ICell cell = null;
     7     // 单元格样式
     8     ICellStyle style = book.CreateCellStyle();
     9     style.Alignment = HorizontalAlignment.CENTER;
    10     style.VerticalAlignment = VerticalAlignment.CENTER;
    11     IFont font = book.CreateFont();
    12     font.FontHeightInPoints = 12;
    13     font.FontName = "宋体";
    14     style.SetFont(font);
    15 
    16     // 增加第一行标题
    17     cell = erow.CreateCell(0);
    18     cell.SetCellValue("序号");
    19     cell.CellStyle = style;
    20     sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0));
    21 
    22     cell = erow.CreateCell(1);
    23     cell.SetCellValue("装置名称");
    24     cell.CellStyle = style;
    25     sheet.AddMergedRegion(new CellRangeAddress(0, 1, 1, 1));
    26 
    27     cell = erow.CreateCell(2);
    28     cell.SetCellValue("物料信息");
    29     cell.CellStyle = style;
    30     sheet.AddMergedRegion(new CellRangeAddress(0, 0, 2, 3));
    31 
    32     // 增加第二行标题
    33     erow = sheet.CreateRow(1);
    34     cell = erow.CreateCell(2);
    35     cell.SetCellValue("物料名称");
    36     cell.CellStyle = style;
    37     cell = erow.CreateCell(3);
    38     cell.SetCellValue("小计");
    39     cell.CellStyle = style;
    40 }

    合并单元格方法mergeColumn示例代码如下:

     1 private void mergeColumn(HSSFWorkbook book)
     2 {
     3     ISheet sheet = book.GetSheetAt(0);
     4     int cunit = 1;
     5     // 合并单元格跨越的行数
     6     int rspan = 0;
     7     // 需合并单元格的起始行,前两行为标题,默认起始行是第三行
     8     int srow = 2;
     9 
    10     // 单元格字体样式
    11     IFont font = book.CreateFont();
    12     font.FontHeightInPoints = 12;
    13     font.FontName = "宋体";
    14 
    15     // 非合并单元格样式
    16     ICellStyle style = book.CreateCellStyle();
    17     style.SetFont(font);
    18 
    19     // 合并单元格样式
    20     ICellStyle mstyle = book.CreateCellStyle();
    21     mstyle.Alignment = HorizontalAlignment.CENTER;
    22     mstyle.VerticalAlignment = VerticalAlignment.CENTER;
    23     mstyle.SetFont(font);
    24 
    25 
    26     // 合并单元格
    27     string oldvalue = string.Empty;
    28     for (int r = 2; r < sheet.PhysicalNumberOfRows; r++)
    29     {
    30         if (sheet.GetRow(r).GetCell(cunit).StringCellValue == oldvalue)
    31         {
    32             rspan++;
    33         }
    34         else
    35         {
    36             // 添加合并区域
    37             sheet.AddMergedRegion(new CellRangeAddress(srow, srow + rspan, 1, 1));
    38             oldvalue = sheet.GetRow(r).GetCell(cunit).StringCellValue;
    39             srow = r;
    40             rspan = 0;
    41         }
    42     }
    43 
    44     // 对未合并的单元格进行合并
    45     if (rspan != 0)
    46     {
    47         sheet.AddMergedRegion(new CellRangeAddress(srow, srow + rspan, 1, 1));
    48     }
    49 
    50     // 调整合并单元格的样式
    51     for (int c = 0; c < 4; c++)
    52     {
    53         for (int r = 2; r < sheet.PhysicalNumberOfRows; r++)
    54         {
    55             if (c == cunit)
    56             {
    57                 sheet.GetRow(r).GetCell(c).CellStyle = mstyle;
    58             }
    59             else
    60             {
    61                 sheet.GetRow(r).GetCell(c).CellStyle = style;
    62             }
    63         }
    64     }
    65 }

    导出后的文件内容:

  • 相关阅读:
    JAVA基础--线程
    Flutter: SliverAppBar 应用程序栏与滚动视图集成,以便它可以根据滚动偏移量在高度上变化
    Flutter: MediaQuery
    Dart: puppeteer库
    Flutter: 监听App显示,隐藏
    Dart: 解析html字符串
    Dart: 编码和解码各种存档和压缩格式
    Dart: 执行shell命令
    运行Chrome浏览器如何添加Options
    Flutter 删除AppBar的返回icon
  • 原文地址:https://www.cnblogs.com/shenyuelan/p/3355069.html
Copyright © 2011-2022 走看看