C#实现Excel转PDF的完整指南

引言

在许多企业应用中,需要将Excel文件转换为PDF格式以进行归档、共享或打印。C#作为.NET平台的主要编程语言,提供了多种实现Excel转PDF的方案。本文将详细介绍这些方法及其优缺点。

方法一:使用EPPlus库

EPPlus是一个强大的.NET库,用于读写Excel 2007+文件。虽然它本身不直接支持PDF转换,但可以通过与PDF库结合实现。

// 安装NuGet包:EPPlus, iTextSharp
using OfficeOpenXml;
using iTextSharp.text;
using iTextSharp.text.pdf;

public void ExcelToPdf(string excelPath, string pdfPath)
{
    using (var package = new ExcelPackage(new FileInfo(excelPath)))
    {
        var workbook = package.Workbook;
        var document = new Document(PageSize.A4, 50, 50, 50, 50);
        PdfWriter.GetInstance(document, new FileStream(pdfPath, FileMode.Create));
        document.Open();

        foreach (var worksheet in workbook.Worksheets)
        {
            PdfPTable table = new PdfPTable(worksheet.Dimension.Columns);
            for (int row = 1; row <= worksheet.Dimension.Rows; row++)
            {
                for (int col = 1; col <= worksheet.Dimension.Columns; col++)
                {
                    table.AddCell(worksheet.Cells[row, col].Text);
                }
            }
            document.Add(table);
            document.NewPage();
        }
        document.Close();
    }
}

方法二:使用Microsoft.Office.Interop.Excel

这是微软官方提供的COM互操作库,可以调用Excel应用程序进行转换。优点是转换效果好,缺点是需要安装Excel且性能较低。

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

public void ConvertWithInterop(string excelPath, string pdfPath)
{
    Excel.Application excelApp = new Excel.Application();
    Excel.Workbook workbook = excelApp.Workbooks.Open(excelPath);
    workbook.ExportAsFixedFormat(
        Excel.XlFixedFormatType.xlTypePDF,
        pdfPath,
        Excel.XlFixedFormatQuality.xlQualityStandard,
        true, // IncludeDocProperties
        false, // IgnorePrintAreas
        1, // From
        workbook.Sheets.Count, // To
        true // OpenAfterPublish
    );
    workbook.Close();
    Marshal.ReleaseComObject(workbook);
    excelApp.Quit();
    Marshal.ReleaseComObject(excelApp);
}

方法三:使用第三方库Spire.XLS

Spire.XLS是一个商业库,提供强大的Excel处理和PDF转换功能,无需安装Microsoft Office。

using Spire.Xls;

public void ConvertWithSpire(string excelPath, string pdfPath)
{
    Workbook workbook = new Workbook();
    workbook.LoadFromFile(excelPath);
    workbook.SaveToFile(pdfPath, Spire.Xls.FileFormat.PDF);
}

性能对比与选择建议

  • EPPlus + iTextSharp:轻量级,适合简单表格转换,但复杂格式可能丢失。
  • Microsoft.Office.Interop.Excel:转换质量高,但依赖Office安装,服务器环境需注意许可问题。
  • Spire.XLS:功能全面,转换效果好,但需要购买商业许可。

常见问题解决

问题1:中文乱码
解决方案:在生成PDF时指定字体,例如使用iTextSharp的BaseFont.CreateFont加载中文字体。

问题2:格式丢失
解决方案:对于复杂格式,建议使用Interop或Spire.XLS,它们能更好保留样式。

问题3:性能问题
解决方案:批量转换时考虑多线程处理,或选择异步API。

总结

C#实现Excel转PDF有多种方案,开发者应根据项目需求、预算和环境选择合适的方法。对于简单的应用,EPPlus+iTextSharp是不错的选择;对于高质量转换,可以考虑Interop或Spire.XLS。