三種方法讓 .NET 輕松實現(xiàn) Excel 轉(zhuǎn) PDF
前一段時間有網(wǎng)友問Excel轉(zhuǎn)pdf怎么轉(zhuǎn)pdf,小編幫他實現(xiàn)了一個,方法是使用EPPlus和PdfSharp組件實現(xiàn),由于依賴OfficeOpenXml他也沒有用上,后來小編又實現(xiàn)了二種不依賴OfficeOpenXml的方法。
本文將介紹這三種方法實現(xiàn)Excel轉(zhuǎn)pdf。
一、EPPlus和PdfSharp組件實現(xiàn)
邏輯是先將Excel內(nèi)容轉(zhuǎn)換為HTML字符串,然后再將HTML字符串轉(zhuǎn)換為PDF文件。
轉(zhuǎn)換過程中的格式和樣式可能會有一些差異,您可能需要根據(jù)需求進(jìn)行進(jìn)一步的調(diào)整和優(yōu)化。
使用方法
1、首先使用“NuGet 包管理器”安裝EPPlus和PdfSharp
2、在代碼頁面引用
using?IronPdf;
using?OfficeOpenXml;
3、建兩個方法ConvertExcelToPdf和ExcelToHtml
ConvertExcelToPdf方法用于將Excel文件轉(zhuǎn)換為PDF文件,ExcelToHtml這個方法將Excel工作表的內(nèi)容轉(zhuǎn)換為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];?//?假設(shè)要轉(zhuǎn)換的工作表是第一個工作表
????????//?創(chuàng)建一個HTML字符串,將Excel內(nèi)容轉(zhuǎn)換為HTML
????????string?htmlContent?=?ExcelToHtml(worksheet);
????????//?使用IronPDF將HTML字符串轉(zhuǎn)換為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("");
????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("");
????????for?(int?col?=?startColumn;?col?<=?endColumn;?col++)
????????{
????????????var?cellValue?=?worksheet.Cells[row,?col].Value;
????????????sb.AppendLine(""?+?(cellValue?!=?null???cellValue.ToString()?:?"")?+?" ");
????????}
????????sb.AppendLine(" ");
????}
????sb.AppendLine("
");
????return?sb.ToString();
}
//調(diào)用方法
string?excelFilePath?=?"C:\\Users\\user\\Desktop\\test.xlsx";
string?pdfFilePath?=?"C:\\Users\\user\\Desktop\\test.pdf";
exceltopdf.ConvertExcelToPdf(excelFilePath,?pdfFilePath);
主要有兩個方法:
ConvertExcelToPdf: 這個方法用于將Excel文件轉(zhuǎn)換為PDF文件。
它首先使用ExcelPackage類從Excel文件中讀取數(shù)據(jù)。
然后,調(diào)用ExcelToHtml方法將Excel內(nèi)容轉(zhuǎn)換為HTML字符串。接下來,使用IronPDF庫中的HtmlToPdf類將HTML字符串轉(zhuǎn)換為PDF對象。
最后,將PDF對象保存到指定的PDF文件路徑中。
ExcelToHtml:?這個方法將Excel工作表的內(nèi)容轉(zhuǎn)換為HTML字符串。
它使用StringBuilder來構(gòu)建HTML字符串。
首先,它添加 然后,通過遍歷工作表的行和列,將每個單元格的值添加到HTML字符串中作為一個 最后,添加標(biāo)簽作為表格的開始。
標(biāo)簽作為表格的結(jié)束,并將構(gòu)建好的HTML字符串返回。元素。
缺點(diǎn):此方法可能需要依賴office,網(wǎng)友回復(fù)反饋;另外需要用html進(jìn)行格式處理,也是個麻煩事情。
效果

二、Spire組件實現(xiàn)
邏輯是首先使用Spire.XLS庫加載Excel文件,并使用Spire.PDF庫創(chuàng)建PDF文檔。
然后,我們遍歷Excel文件的每個工作表,將表格內(nèi)容逐個繪制到PDF頁面上。
使用方法
1、首先使用"NuGet 包管理器"安裝Spire。注意的是需要安裝Spire,不要安裝Spire.XLS和Spire.PDF否則會出現(xiàn)不兼容的問題。
2、在代碼頁面引用
using?Spire.Pdf;
using?Spire.Pdf.Graphics;
using?Spire.Xls;
3、只需要建一個方法ConvertExcelToPdf。傳入要轉(zhuǎn)換的excel路徑和輸出的路徑,代碼如下:
public?static?void?ConvertExcelToPdf(string?excelFilePath,?string?pdfFilePath)
{
????//?加載Excel文件
????Workbook?workbook?=?new?Workbook();
????workbook.LoadFromFile(excelFilePath);
????//?創(chuàng)建PDF文檔
????PdfDocument?pdfDocument?=?new?PdfDocument();
????//?添加Excel表格內(nèi)容到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表格的行數(shù)和列數(shù)
????????int?rowCount?=?sheet.LastRow?+?1;
????????int?columnCount?=?sheet.LastColumn?+?1;
????????//?將Excel表格內(nèi)容逐個添加到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)
????????????????//?繪制單元格內(nèi)容到PDF頁面
????????????????{
????????????????????pdfPage.Canvas.DrawString(value,?fonts,?PdfBrushes.Black,?column?*?70,?row?*?20);
????????????????}
????????????}
????????}
????}
????//?保存PDF文件
????pdfDocument.SaveToFile(pdfFilePath);
????Console.WriteLine("PDF轉(zhuǎn)換完成。");
}
//調(diào)用方法跟上面一樣
此方法需要注意的是Spire默認(rèn)不支持中文,需要我們單獨(dú)引用中文字庫,在代碼的13行就是引用字庫的地方,大家可以把字庫拷貝到自己的項目引用。
缺點(diǎn):默認(rèn)不支持中文字庫,需要單獨(dú)引用;另外輸出格式不帶表格(可能可以調(diào));
免費(fèi)版本有水印,這個網(wǎng)上有解決方案,大家可以去某度搜索。
效果如下:

三、NPOI和iTextSharp組件實現(xiàn)
邏輯是通過使用NPOI庫讀取Excel文件,然后使用iTextSharp庫創(chuàng)建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主要作業(yè)是字符格式轉(zhuǎn)換。
ConvertExcelToPdf傳入要轉(zhuǎn)的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);
????????//?創(chuàng)建PDF文檔
????????Document?document?=?new?Document();
????????//?創(chuàng)建PDF寫入器
????????PdfWriter?writer?=?PdfWriter.GetInstance(document,?new?FileStream(pdfFilePath,?FileMode.Create));
????????//?打開PDF文檔
????????document.Open();
????????//?添加Excel表格內(nèi)容到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);
????????//?關(guān)閉PDF文檔
????????document.Close();
????}
????Console.WriteLine("PDF轉(zhuǎn)換完成。");
}
static?Font?GetChineseFont()
{
????var?baseFont?=?BaseFont.CreateFont(@"C:\Windows\Fonts\simfang.ttf",?BaseFont.IDENTITY_H,?BaseFont.EMBEDDED);
????return?new?Font(baseFont,?12);
}
//調(diào)用方法跟方法一一樣
此方法跟Spire一樣默認(rèn)不支持中文,需要我們單獨(dú)引用中文字庫,方法GetChineseFont就是處理引用中文字庫。
另外需要需要在 NuGet 里添加 System.Text.Encoding.CodePages并注冊,否則會報錯,注冊如下。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
缺點(diǎn):此方法也比較坑,不支持中文,還需要引用額外的字庫支持組件CodePages。
效果如下:

結(jié)語
本文介紹了.NET三種方法實現(xiàn)Excel轉(zhuǎn)pdf,他們各有優(yōu)點(diǎn),第一種可以自定義樣式,第二種依賴獨(dú)立組件,第三種顯示效果更佳,從使用效果來看小編推薦第三種。
其實還有很多組件實現(xiàn)Excel轉(zhuǎn)pdf,比如Aspose.Cells,有的需要授權(quán)收取費(fèi)用、大家自己可以研究一下。
本項目是基于.NET 7在windows下測試運(yùn)行,在linux下沒有實驗過,大家可以嘗試一下。大家還有什么好的方式實現(xiàn)Excel轉(zhuǎn)pdf呢?歡迎留言討論。
轉(zhuǎn)自:翔星
鏈接:mp.weixin.qq.com/s/7NVe7wr2eVLs-lN2GHILSg
