三種方法讓.NET輕鬆實現Excel轉PDF

来源:https://www.cnblogs.com/xbhp/archive/2023/06/13/17477212.html
-Advertisement-
Play Games

前一段時間有網友問Excel轉pdf怎麼轉pdf,小編幫他實現了一個,方法是使用EPPlus和PdfSharp組件實現,由於依賴OfficeOpenXml他也沒有用上,後來小編又實現了二種不依賴OfficeOpenXml的方法。本文將介紹這三種方法實現Excel轉pdf。 **一、EPPlus和Pd ...


前一段時間有網友問Excel轉pdf怎麼轉pdf,小編幫他實現了一個,方法是使用EPPlus和PdfSharp組件實現,由於依賴OfficeOpenXml他也沒有用上,後來小編又實現了二種不依賴OfficeOpenXml的方法。本文將介紹這三種方法實現Excel轉pdf。

一、EPPlus和PdfSharp組件實現

邏輯是先將Excel內容轉換為HTML字元串,然後再將HTML字元串轉換為PDF文件。轉換過程中的格式和樣式可能會有一些差異,您可能需要根據需求進行進一步的調整和優化。

使用方法

1、首先使用“NuGet 包管理器”安裝EPPlus和PdfSharp

2、在代碼頁面引用

using IronPdf;
using OfficeOpenXml;

3、建兩個方法ConvertExcelToPdf和ExcelToHtml

ConvertExcelToPdf方法用於將Excel文件轉換為PDF文件,ExcelToHtml這個方法將Excel工作表的內容轉換為HTML字元串。代碼如下:

 public static void ConvertExcelToPdf(string excelFilePath, string pdfFilePath)
        {
            // 讀取Excel文件
            using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFilePath)))
            {
                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假設要轉換的工作表是第一個工作表

                // 創建一個HTML字元串,將Excel內容轉換為HTML
                string htmlContent = ExcelToHtml(worksheet);

                // 使用IronPDF將HTML字元串轉換為PDF
                var renderer = new HtmlToPdf();
                renderer.PrintOptions.MarginTop = 0;
                renderer.PrintOptions.MarginBottom = 0;
                renderer.PrintOptions.MarginLeft = 0;
                renderer.PrintOptions.MarginRight = 0;
                var pdf = renderer.RenderHtmlAsPdf(htmlContent);

                // 保存PDF文件
                pdf.SaveAs(pdfFilePath);
            }
        }

          public static string ExcelToHtml(ExcelWorksheet worksheet)
        {
            var sb = new StringBuilder();
            sb.AppendLine("<table>");
            var startRow = worksheet.Dimension.Start.Row;
            var endRow = worksheet.Dimension.End.Row;
            var startColumn = worksheet.Dimension.Start.Column;
            var endColumn = worksheet.Dimension.End.Column;

            for (int row = startRow; row <= endRow; row++)
            {
                sb.AppendLine("<tr>");

                for (int col = startColumn; col <= endColumn; col++)
                {
                    var cellValue = worksheet.Cells[row, col].Value;
                    sb.AppendLine("<td>" + (cellValue != null ? cellValue.ToString() : "") + "</td>");
                }

                sb.AppendLine("</tr>");
            }
            sb.AppendLine("</table>");
            return sb.ToString();
        }

  //調用方法
string excelFilePath = "C:\\Users\\user\\Desktop\\test.xlsx";
string pdfFilePath = "C:\\Users\\user\\Desktop\\test.pdf";
exceltopdf.ConvertExcelToPdf(excelFilePath, pdfFilePath);

主要有兩個方法:

ConvertExcelToPdf: 這個方法用於將Excel文件轉換為PDF文件。它首先使用ExcelPackage類從Excel文件中讀取數據。然後,調用ExcelToHtml方法將Excel內容轉換為HTML字元串。接下來,使用IronPDF庫中的HtmlToPdf類將HTML字元串轉換為PDF對象。最後,將PDF對象保存到指定的PDF文件路徑中。

ExcelToHtml: 這個方法將Excel工作表的內容轉換為HTML字元串。它使用StringBuilder來構建HTML字元串。首先,它添加

標簽作為表格的開始。然後,通過遍歷工作表的行和列,將每個單元格的值添加到HTML字元串中作為一個td元素。最後,添加table標簽作為表格的結束,並將構建好的HTML字元串返回。

缺點:此方法可能需要依賴office,網友回覆反饋;另外需要用html進行格式處理,也是個麻煩事情。

效果:

、Spire組件實現

邏輯是首先使用Spire.XLS庫載入Excel文件,並使用Spire.PDF庫創建PDF文檔。然後,我們遍歷Excel文件的每個工作表,將表格內容逐個繪製到PDF頁面上。

使用方法

1、首先使用“NuGet 包管理器”安裝Spire。註意的是需要安裝Spire,不要安裝Spire.XLS和Spire.PDF否則會出現不相容的問題。

2、在代碼頁面引用

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Xls;

3、只需要建一個方法ConvertExcelToPdf。傳入要轉換的excel路徑和輸出的路徑,代碼如下:

   public static void ConvertExcelToPdf(string excelFilePath, string pdfFilePath)
        {
            // 載入Excel文件
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);
            // 創建PDF文檔
            PdfDocument pdfDocument = new PdfDocument();
            // 添加Excel表格內容到PDF
            foreach (Worksheet sheet in workbook.Worksheets)
            {
                PdfPageBase pdfPage = pdfDocument.Pages.Add();
                PdfDocument document = new PdfDocument();
                PdfTrueTypeFont fonts = new PdfTrueTypeFont(@"C:\Windows\Fonts\simfang.ttf", 10f);
                // 獲取Excel表格的行數和列數
                int rowCount = sheet.LastRow + 1;
                int columnCount = sheet.LastColumn + 1;
                // 將Excel表格內容逐個添加到PDF
                for (int row = 1; row <= rowCount; row++)
                {
                    for (int column = 1; column <= columnCount; column++)
                    {
                        string value = sheet.Range[row, column].Text;
                        if (value != null)
                        // 繪製單元格內容到PDF頁面
                        {
                            pdfPage.Canvas.DrawString(value, fonts, PdfBrushes.Black, column * 70, row * 20);
                        }
                    }
                }
            }
            // 保存PDF文件
            pdfDocument.SaveToFile(pdfFilePath);
            Console.WriteLine("PDF轉換完成。");
        }
  //調用方法跟上面一樣

此方法需要註意的是Spire預設不支持中文,需要我們單獨引用中文字型檔,在代碼的13行就是引用字型檔的地方,大家可以把字型檔拷貝到自己的項目引用。

缺點:預設不支持中文字型檔,需要單獨引用;另外輸出格式不帶表格(可能可以調);免費版本有水印,這個網上有解決方案,大家可以去某度搜索。

效果如下:

三、NPOI和iTextSharp組件實現

邏輯是通過使用NPOI庫讀取Excel文件,然後使用iTextSharp庫創建PDF文檔。

使用方法

1、首先使用“NuGet 包管理器”安裝NPOI和iTextSharp。

2、在代碼頁面引用

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using iTextSharp.text;
using iTextSharp.text.pdf;

3、需要建二個方法,ConvertExcelToPdf和GetChineseFont方法,GetChineseFont主要作業是字元格式轉換。ConvertExcelToPdf傳入要轉的excel路徑和輸出的路徑,代碼如下:

     public static void ConvertExcelToPdf2(string excelFilePath, string pdfFilePath)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            // 載入Excel文件
            using (FileStream fileStream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
            {
                IWorkbook workbook = new XSSFWorkbook(fileStream);
                ISheet sheet = workbook.GetSheetAt(0);
                // 創建PDF文檔
                Document document = new Document();
                // 創建PDF寫入器
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(pdfFilePath, FileMode.Create));
                // 打開PDF文檔
                document.Open();
                // 添加Excel表格內容到PDF
                PdfPTable table = new PdfPTable(sheet.GetRow(0).LastCellNum);
                table.WidthPercentage = 100;

                foreach (IRow row in sheet)
                {
                    foreach (ICell cell in row)
                    {
                        string value = cell.ToString();
                        PdfPCell pdfCell = new PdfPCell(new Phrase(value, GetChineseFont()));
                        table.AddCell(pdfCell);
                    }
                }
                document.Add(table);
                // 關閉PDF文檔
                document.Close();
            }
            Console.WriteLine("PDF轉換完成。");
        }
        static Font GetChineseFont()
        {
            var baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            return new Font(baseFont, 12);
        }
 //調用方法跟方法一一樣
//歡迎關註公眾號:DOTNET開發跳槽,領取海量面試題。加微信號xbhpnet入群交流

此方法跟Spire一樣預設不支持中文,需要我們單獨引用中文字型檔,方法GetChineseFont就是處理引用中文字型檔。另外需要需要在 NuGet 里添加 System.Text.Encoding.CodePages並註冊,否則會報錯,註冊如下。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

缺點:此方法也比較坑,不支持中文,還需要引用額外的字型檔支持組件CodePages。

效果如下:

結語

本文介紹了.NET三種方法實現Excel轉pdf,他們各有優點,第一種可以自定義樣式,第二種依賴獨立組件,第三種顯示效果更佳,從使用效果來看小編推薦第三種。其實還有很多組件實現Excel轉pdf,比如Aspose.Cells,有的需要授權收取費用、大家自己可以研究一下。本項目是基於.NET7在windows下測試運行,在linux下沒有實驗過,大家可以嘗試一下。大家還有什麼好的方式實現Excel轉pdf呢?歡迎留言討論。

來源公眾號:DotNet開發跳槽

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有時候,需要將一系列字典存儲在列表中,或將列表作為值存儲在字典中,這稱為**嵌套**。我們可以在列表中嵌套字典、在字典中嵌套列表、在字典中嵌套字典。 # 1.列表嵌套字典 我們可以把一個人的信息放在字典中,但是多個人的信息我們無法放在同一個字典中,所以就需要字典列表。 其語法格式: [字典1,字典2 ...
  • #搭建springboot環境(idea環境) 實現步驟: 1.基礎環境配置 2.maven配置 3.編寫第一個程式helloworld(可能有兩個小問題) 4.運行(jar包運行,命令行運行) 一.基礎環境配置 進入idea,點擊file->new->project,在彈出的頁面上,選擇sprin ...
  • Spring的Bean生命周期包括以下步驟: 1、實例化(Instantiation):當Spring容器接收到創建Bean的請求時,它會先實例化Bean對象。這個過程可以通過構造函數、工廠方法或者反序列化等方式完成; 2、屬性賦值(Populate Properties):在實例化Bean對象後, ...
  • ## 教程簡介 Axure RP是一款專業的快速原型設計工具。Axure(發音:Ack-sure),代表美國Axure公司;RP則是Rapid Prototyping(快速原型)的縮寫。 Axure RP是美國Axure Software Solution公司旗艦產品,是一個專業的快速原型設計工具, ...
  • ## 教程簡介 AWS Lambda 是AWS在2014年推出的「無伺服器」(Serverless)計算服務,用戶無需管理伺服器,可以更專註自己業務。由於上手簡單,而且真正利用了雲的優勢,Lambda快速成為了一項明星服務。 Lambda 在可用性高的計算基礎設施上運行您的代碼,執行計算資源的所有管 ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • ## 一:背景 ### 1. 講故事 前段時間訓練營里有朋友問 `記憶體映射文件` 是怎麼玩的?說實話這東西理論我相信很多朋友都知道,就是將文件映射到進程的虛擬地址,說起來很容易,那如何讓大家眼見為實呢?可能會難倒很多人,所以這篇我以自己的認知嘗試讓大家眼見為實。 ## 二:如何眼見為實 ### 1. ...
  • 本篇為學習李應保老師所著的《WPF專業編程指南》並搭配`WPF`開發聖經《WPF編程寶典第4版》以及痕跡大佬《WPF入門基礎教程系列》文章所作筆記,對應《WPF專業編程指南》第 9-10 章之間內容,主要概述`WPF`中關於樣式及模板部分的梳理及示例應用,希望可以幫到大家
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...