從 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

相关文章

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.