從 NPOI 匯出的 Excel 資料流建立附件並寄送

2024-04-27 20:48

本文主要是介绍從 NPOI 匯出的 Excel 資料流建立附件並寄送,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ASP.NET 案例分享:從 NPOI 匯出的 Excel 資料流建立附件並寄送
匯出 Excel 的需求屢見不鮮,做出這功能以目前的技術來說也已經不是難事,不過使用者總是能督促我們更上層樓,除了匯出 Excel,最好還能自動夾帶附件寄到指定的電子信箱。  

匯出實體檔或不要?
開發這樣的功能其實不難,匯出 Excel 你會,寄送夾帶檔信件你也會,兩段串起來就是,所以問題在那?…問題在生成實體檔案!要知道 ASP.NET 是執行在 Server 端,產出 Excel 檔當然是先存放在 Server 端再進行下一步動作 (ex:提供下載 or 轉寄),這份檔案有時生命週期很短,大部分會在目的達成時立即清除以節省 Server 端硬碟空間,然而夾檔寄送電子郵件其實可以不用生成實體檔,好處是這樣就不存在後續刪除的問題。  

構想
我的構想是這樣:  
  1. 先用 NPOI 匯出 Excel 資料流 (stream)
  2. 接收資料流以初始化 Attachment 物件,附加到 MailMessage
  3. 用 SmtpClient 類別發送郵件
這樣就能做到 不產出實體檔寄送 Excel 附件。  

總的來說,實作的重點在步驟 2,畢竟以往大家較為習慣的方式是以實體檔夾帶附件,而忽略了 Sytem.Net.Mail.Attachment 類別其實是支援傳入資料流來建構新的執行個體,接下來我將實際演練一次供大家參考。  

引用 NPOI
關於 NPOI 的應用,之前也曾經發過一篇文章: 利用 NPOI Library 合併多個 Excel 檔,當時的版本是 1.2.1,經過這段時間 NPOI 發展到 1.2.3 beta,以本次需求來說新版本可以運作正常,惟與前一版相較之下,兩者寫法有些許不同,我會用最新版來實作,再補充 1.2.1 stable 版的 NPOI 寫法要如何修改。  

想用最新版的人可自行上 http://npoi.codeplex.com/ 下載:  

npoi_1.2.3_bin

下載回來的壓縮檔解開會得到 Ionic.Zip.dll、NPOI.dll 兩個組件,這一版開始 Ionic.Zip.dll 取代了以往的 ICSharpCode.SharpZipLib.dll,並且顯而易見地,NPOI 開發團隊似乎有意在這一版將整個 NPOI 專案編譯成單一 dll。  

匯出 Excel 資料流
正式進入實作:  
  1. 新增一個網站 (或 Web 應用程式專案),針對上面取得的 NPOI.dll 加入參考 (會一併引用 Ionic.Zip.dll)     
    npoi_add_reference
  2. 為方便解說,直接開啟 Default.aspx.cs 撰寫程式,建立一個 DataTable 轉匯 Excel 資料流的方法     
    view source
    print ?
    01// using NPOI.HSSF.UserModel;
    02private Stream RenderDataTableToExcel(DataTable srcTable)
    03{
    04    HSSFWorkbook workbook = new HSSFWorkbook();
    05    HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
    06    HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
    07 
    08    // handling header.
    09    foreach (DataColumn column in srcTable.Columns)
    10        headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    11 
    12    // handling value.
    13    int rowIndex = 1;
    14 
    15    foreach (DataRow row in srcTable.Rows)
    16    {
    17        HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
    18 
    19        foreach (DataColumn column in srcTable.Columns)
    20        {
    21            dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
    22        }
    23 
    24        rowIndex++;
    25    }
    26 
    27    MemoryStream stream = new MemoryStream();
    28    workbook.Write(stream);
    29    stream.Flush();
    30    stream.Position = 0;
    31 
    32    sheet = null;
    33    headerRow = null;
    34    workbook = null;
    35 
    36    return stream;
    37}

    - or -    

    使用 NPOI 1.2.1 stable 的朋友請這樣寫:    
    view source
    print ?
    01// using NPOI.HSSF.UserModel;
    02private Stream RenderDataTableToExcel(DataTable srcTable)
    03{
    04    HSSFWorkbook workbook = new HSSFWorkbook();
    05    HSSFSheet sheet = workbook.CreateSheet();
    06    HSSFRow headerRow = sheet.CreateRow(0);
    07 
    08    // handling header.
    09    foreach (DataColumn column in srcTable.Columns)
    10        headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    11 
    12    // handling value.
    13    int rowIndex = 1;
    14 
    15    foreach (DataRow row in srcTable.Rows)
    16    {
    17        HSSFRow dataRow = sheet.CreateRow(rowIndex);
    18 
    19        foreach (DataColumn column in srcTable.Columns)
    20        {
    21            dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
    22        }
    23 
    24        rowIndex++;
    25    }
    26 
    27    MemoryStream stream = new MemoryStream();
    28    workbook.Write(stream);
    29    stream.Flush();
    30    stream.Position = 0;
    31 
    32    sheet = null;
    33    headerRow = null;
    34    workbook = null;
    35 
    36    return stream;
    37}

    造成差異的原因參考 NPOI 1.2.3 beta release notes 其中一段:    
    npoi_1.2.3_beta_release_note

建構 Attachment
Attachment 的建構函式包含底下列表:

attachment_contructors

第一個參數若是 String 代表傳入實體檔路徑來建構附檔,這是大家最熟悉的方式,而傳入 Stream 則是本次所採用的方式,一樣可以初始化附檔,後續的參數不管是 String 或 ContentType 類型,都是用來指定附檔的內容類型 (Content-Type),其代表 MIME 協定所定義的電子郵件區段內容類型標頭,有興趣研究者可以參考文末連結,暫且簡單帶過,底下是實際撰寫的程式碼:

construct_attachment_with_xls_stream 

其餘的動作是使用 SmtpClient 類別經由 gmail 來發信, 網路上的範例很多就不多說了,完整程式碼執行效果約略如圖:

send_mail_with_excel_attachment_expoted_from_npoi

範例可從這裡下載: SendAttachmentFromXlsStream.zip

結語
本案例出處是 Blueshop 的一則提問,我常覺得在技術論壇回答問題,是快速累積實戰經驗的絕佳途徑,因為個人能接觸到的問題有限,除非你有機會接觸大案子,否則從做中學得到的經驗恐怕不夠全面,透過網友的提問,你可以知道原來使用者提出的需求遠遠超出想像。此外,還能觀摩其他專家的解法,有時一個討論串下來不只獲得解題的成就感,還可以開拓視野,將自身的技術能力越練越純。

这篇关于從 NPOI 匯出的 Excel 資料流建立附件並寄送的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941498

相关文章

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

excel翻译软件有哪些?如何高效提翻译?

你是否曾在面对满屏的英文Excel表格时感到头疼?项目报告、数据分析、财务报表... 当这些重要的信息被语言壁垒阻挡时,效率和理解度都会大打折扣。别担心,只需3分钟,我将带你轻松解锁excel翻译成中文的秘籍。 无论是职场新人还是老手,这一技巧都将是你的得力助手,让你在信息的海洋中畅游无阻。 方法一:使用同声传译王软件 同声传译王是一款专业的翻译软件,它支持多种语言翻译,可以excel

终于解决了excel操作及cspreadsheet.h问题

困扰多日的excel操作问题终于解决:利用cspreadsheet.h!在vs2005下,不能直接应用cspreadsheet.h,所以必须解决些问题先。 首先, 出现暴多错误。解决UNICODE问题,全部添加L。 [1] +++++++++++++++++++ 其次, 出现问题: error   C2664:   &apos;SQLGetInstalledDriversW &apos;

关于使用cspreadsheet读写EXCEL表格数据的问题

前几天项目有读写EXCEL表格的需求,我就找了大概有几种,大致分为:COM方法、ODBC方法、OLE方法、纯底层格式分析方法。由于COM方法要求必须安装有OFFICE的EXCEL组件,纯底层格式分析方法又很多功能需要自行去完善,所有最终选择了数据库的方法,用数据库的方法去存取xls格式的数据。网上有一个高手写的CSpreedSheet,看了一下提供的接口,感觉挺好用的。在使用的过程中发现几个

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。按下快捷键 Alt + H,然后松开这些键。再按下 M,接着按 C。这个组合键执行的操作是:Alt + H:打开“主页”选项卡。M:选择“合并单元格”选项。C:执行“合并并居中”操作。 插入行: 在Excel中,插入一行的快捷键是:Windows:选择整行(可以点击行号)。按下 Ctrl + Sh

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

如何在Excel中根据单元格内容作MSnbsp;…

上篇文章,我们介绍了INDEX+SMALL+IF+ROW的数组公式组合,也就是说只要在IF中通过条件的构造,基本上就可以想提取什么条件的数据都可以,数据查询肯定得心应手。 但是,我们一起强调函数公式不是万能的,尤其是数组公式在海量数据面前,既是软肋也是硬伤,而且构造这个函数组合还需要你要具备或者能理解简单数组公式逻辑,对于在函数公式方面没有深究的人,自然是一头雾水。当然,就像“数据透视表”一样,

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Weibull概率分布纸(EXCEL VBA实现)

在学习Weibull分布理论的时候,希望有一张Weibull概率纸,用来学习图解法。但是在度娘上没有找到的Weibull概率纸的电子版。在书上看到的Weibull概率纸,只能复印下来使用。于是萌生了自己制作Weibull概率纸的想法,帮助自己更好地学习。 本人擅长使用各种计算机语言,C,C++,Matlab,Scilab等等,但是始终钟爱与VBA,认为VBA可以实现一切你想要的东西,由于在企业里不