通过代码实现Excel转Pdf

序言

在数字化时代,数据的转换和呈现方式对于提高工作效率和信息共享至关重要。Excel作为微软推出的一款功能强大的电子表格软件,广泛应用于数据处理、分析和可视化。然而,Excel文件的格式限制了其在不同平台和设备上的通用性。PDF(Portable Document Format)文件格式以其跨平台兼容性和稳定性而广受欢迎,能够确保文档在不同设备和操作系统上保持原貌。 不过在.net平台下,想要实现 Excel 转 Pdf确有一些麻烦,网上资源不少,但都不是很完美,本人找了很久,要么收费,要么转换时无法保留Excel的样式,或者平台兼容性不好。前段时间在github上闲逛,还真被我发现了一些宝贝,今天分享出来,希望能帮到需要的朋友。

实现思路

如果要直接将Excel转为Pdf比较困难,至少我没有发现好的方法,如果有人知道更直接的方法,还请大家评论区告诉我一声。网上一般的做法是,先将Excel转换为Html,在将Html转换为Pdf,我也采取这一思路。 Excel转Html的过程,用的是这个库:ExccelToHtml.Core,可惜没人给Star,我先给一个。Html转Pdf用的是 ChromeHtmlToPdf,这个库依赖Chrome浏览器,因此需要先安装Chrome浏览器,它的特点是跨平台,还可以将url地址直接转成Pdf。

调用代码

csharp 复制代码
using ChromiumHtmlToPdfLib;
using ChromiumHtmlToPdfLib.Enums;
using ChromiumHtmlToPdfLib.Settings;
using Excel2PdfDemo.Excel2Html;

await Excel2Pdf("test.xlsx", "test.pdf");

async Task Excel2Pdf(string excelFileName, string savedFileName)
{
    var html = await Excel2Html(excelFileName, "test.html");

    await Html2Pdf(savedFileName, html, null);
}

async ValueTask Html2Pdf(string savedFileName, string? html, string? url)
{
    if (string.IsNullOrWhiteSpace(html) && string.IsNullOrWhiteSpace(url)) return;
    var pageSettings = new PageSettings
    {
        PrintBackground = true
    };
    
    await using var converter = new Converter();
    if (!string.IsNullOrWhiteSpace(url))
        await converter.ConvertToPdfAsync(new ConvertUri(url), savedFileName, pageSettings);
    else
        await converter.ConvertToPdfAsync(html, savedFileName, pageSettings);
}

async Task<string> Excel2Html(string excelFilePath, string? savedFileName = null)
{
    await using var stream = new FileStream(excelFilePath, FileMode.Open,
        FileAccess.ReadWrite);
    var result = await ExcelToHtmlConverter.GenerateUiAsync(stream);
    var html = result.ToString();
    if (!string.IsNullOrWhiteSpace(savedFileName))
        await File.WriteAllTextAsync(savedFileName, result.ToString());

    return html;
}

说明:调用代码没什么好说的,提前准备了一个 test.xlsx 文件,按照 github 说明调用即可。

效果展示

  • 原excel如下图:
  • 转换后的pdf如下图:

问题发现

看截图,大家应该发现了吧,转换之后的pdf完全不是我想要的那个样子,有几个问题:

  1. 左边有一串序号,应该是excel转html时,把excel的序号列给渲染出来了
  2. 转换后的pdf被"限宽"了,本来只有一页,结果硬生生的被"切了一刀"。
  3. 在pdf底部,多了一个 Sheet1字样,这个在大部分场景下是不需要的。

代码改造之旅

针对问题1和3,阅读过源码后,发现了改造的入口点,请看截图及代码:

ini 复制代码
//取消Excel2Html源码中的 序号列
private static string RemoveNumberColumn(string html)
{
    var tableDoc = new HtmlDocument();
    tableDoc.LoadHtml(html);
    var table = tableDoc.DocumentNode.SelectSingleNode("//table");
    var cells = table.SelectNodes("(//td|//th)");
    return cells.Where(IsFirstColumn).Aggregate(html, (current, cell) => current.Replace(cell.OuterHtml, ""));
}

private static bool IsFirstColumn(HtmlNode cell)
{
    var row = cell.ParentNode;
    var firstCell = row.FirstChild;
    var r= Equals(cell, firstCell);
    return r;
}

问题2,看过文档发现没有直接设置pdf横向的相关设置,只能将页面规格,由默认的A4改为A2,请看截图: 改造之后,再看看效果:

结束语

随着代码的调试和问题的逐步解决,我们不仅成功地将Excel文件转换为PDF格式,而且在这个过程中获得了宝贵的经验。这个过程教会我们,面对技术挑战时,耐心和细致的分析是解决问题的关键。 我们通过这次实践,不仅加深了对编程语言和库的理解,还学习了如何高效地处理文件格式转换。这不仅仅是一个技术实现的过程,更是一个不断学习和成长的过程。

相关推荐
阳光是sunny3 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦3 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny3 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
皮皮林5513 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨4 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康5 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司5 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒6 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学6 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈7 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端