從 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

相关文章

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://