三种方法让.NET轻松实现Excel转PDF

前一段时间有网友问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字符串。首先,它添加<table>标签作为表格的开始。然后,通过遍历工作表的行和列,将每个单元格的值添加到HTML字符串中作为一个td元素。最后,添加table标签作为表格的结束,并将构建好的HTML字符串返回。

缺点:此方法可能需要依赖office,网友回复反馈;另外需要用html进行格式处理,也是个麻烦事情。

效果:

eadaa95c9ecaf775a08e4840ab559f1e.png

、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行就是引用字库的地方,大家可以把字库拷贝到自己的项目引用。

缺点:默认不支持中文字库,需要单独引用;另外输出格式不带表格(可能可以调);免费版本有水印,这个网上有解决方案,大家可以去某度搜索。

效果如下:

e3cfe862866f0f5dfe16a065d099fed1.png

三、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。

效果如下:

9a28505495a945101b19c7b1367f44cc.png

结语

本文介绍了.NET三种方法实现Excel转pdf,他们各有优点,第一种可以自定义样式,第二种依赖独立组件,第三种显示效果更佳,从使用效果来看小编推荐第三种。其实还有很多组件实现Excel转pdf,比如Aspose.Cells,有的需要授权收取费用、大家自己可以研究一下。本项目是基于.NET7在windows下测试运行,在linux下没有实验过,大家可以尝试一下。大家还有什么好的方式实现Excel转pdf呢?欢迎留言讨论。

来源公众号:DotNet开发跳槽
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容