立即注册 登录
返回首页

uid:83710的个人空间

日志

NPOI创建Excel以内存流下载

已有 3849 次阅读2015-6-25 17:01 | Excel

     NPOI一个不依赖Office安装程序的导入导出Excel与Word动态链接库,去年的时候在WPF(C/S)上用它做过一个数据库导入导出Excel的程序。前段时间看了看发现根本看不懂了。。。
    记录一下NPOI在.Net中的使用心得吧。

    功能说明:从数据库中获取一个DataTable导出成Excel并发送到客户端

    主要步骤:
    1、从数据库获取并完善DataTable内容(删除不必要的列新增必要的列)
    2、生成*.xls文件并写入内存流
    3、发送内存流到客户端,形成文件下载

    详细说明:
    1、获取数据源
    直接调用SQL语句获取数据源DataTable就可以了,下面进行DataTable数据的维护。
    // 获取数据源(注:数据源的来源不做详细说明)
    DataTable data = CBLLTransportSendCar.GetSaleReport(time, dQueryDate, out strError);
    // 删除不必要的列【 i 】为列索引从【0】开始
    data.Columns.RemoveAt(i);
    // 添加新列
    data.Columns.Add("ColumnName",typeof(string));
 

    2、用NPOI创建Excel
    先到NPOI官网下载【*.dll】动态链接库并引入到项目中(引用所有*.dll)
    网址:http://npoi.codeplex.com/  ;
            
    string[] strHead = {"Column1","Column2","Column3"};
    MemoryStream ms = new MemoryStream();
     try
     {
        IWorkbook workbook = new HSSFWorkbook();    // 创建Workbook对象
         ISheet sheet = workbook.CreateSheet("Sheet1");  // 创建工作表
        // 设置表头
         IRow row = sheet.CreateRow(0);  // 创建一行、指定行号为第一行
         for (int i = 0; i < strHead.Length; i++)
         {
            ICell cell = row.CreateCell(i); // 创建一列
            cell.SetCellValue(strHead[i]);  // 设置列的内容
         }
         // 设置内容
        for (int j = 0; j < dt.Rows.Count; j++)
         {
            IRow rowCotent = sheet.CreateRow(j + 1);
            for (int i = 0; i < strHead.Length; i++)
            {
                ICell cell = rowCotent.CreateCell(i); // 创建一列
                cell.SetCellValue(dt.Rows[j][i].ToString());  // 设置列的内容
             }
         }
        workbook.Write(ms); // Excel写入内存流中
        ms.Flush();
        ms.Position = 0;    // 指定内存流起始值
        if (workbook != null)
        {
            workbook.Clear();   // 关闭
        }
    }
    catch (Exception ex)
    {
    }
    
    3、 发送流到客户端以形成下载文件行驶
    如要是下载实体文件(即存放在服务器本地的文件)直接链接到文件的相对路径就可以了,但是此文中的Excel文件则是存放在内存流中,需要特殊处理。处理方式很简单,就是修改请求的报头就可以了,告诉协议“
我发送的是一个文件你丫别把他当HTML输出了!”
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");    // 设置流的字符编码,Windows的为【gb2312】
    Response.ContentType = "application/octet-stream";    // 通知协议说我携带的是一个流不是HTML
    Response.AppendHeader("Content-Disposition", "filename=" + strTitle + "销售报表.xls");    // 【filename】说明这个文件的文件名以及格式
    Response.BinaryWrite(ms.GetBuffer());     // 从内存流中以无符号字节数组形式发送



2014-12-05补充

    今天利用NPOI导出Excel的时候设计到了单元格的合并,很简单,只需要一个方法就可以了。我们先看一下想要的效果
 


    代码:
    IWorkbook workbook = new HSSFWorkbook();    // 创建Workbook对象
    ISheet sheet = workbook.CreateSheet("Sheet1");  // 创建工作表
    // 设置表头
    IRow row = sheet.CreateRow(0);  // 创建一行
    ICell cell1 = row.CreateCell(0);
    cell1.SetCellValue("机台号");
    sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0));    // 设置合并单元格

     
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, firstColumnNumber, lastRowNumber));

    前两个参数表示从第几行到第几行合并,后两个参数表示从第几列到第几列合并! 

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部