将Excel转换为PDF而无需安装Office

5
我需要在我正在开发的Windows应用程序中生成PDF报告,方法是将.xlsx文件导出为PDF。目前我正在使用Interop实现这个功能,但是:
  • 我需要做到无需用户购买软件,因此不能使用Microsoft Office Excel。
  • 我也不能使用任何重型依赖项(如Open / Libre Office)。
  • 该应用程序是.NET WinForms,并且是本地应用程序(不依赖于Internet连接)。
我尝试过以下方法:
  • 我尝试过iTextSharp,但是当涉及到列溢出等问题时,它变得非常复杂。
  • 尝试过closedXML,但无法转换为PDF。
  • (如前所述)尝试过Interop,但无法找到使其独立于Office的方法。
感谢您提供帮助,提前致谢 :)
修改:
iTextSharp: 我会使用它,但我需要导出具有可变列数(多达30列)的大DataTable,如果列很多,则处理列溢出就变得非常复杂,而这在Interop中很容易处理。
Aspose: 看起来太昂贵了,因为我为一家资源非常有限的小公司工作。

Aspose 库拥有您所需的内容。 - David Heffernan
你对你的问题有任何想法吗?可以分享一下吗? - j.s.banger
这是PHP编写的,但可以帮助你以一种在C#中呈现数据的方式提取数据:https://github.com/PHPOffice/PHPExcel - halfer
4个回答

8
另一个不错的选择是使用Spire.XLS。虽然它会在顶部显示评估警告,但你可以使用FreeSpire.XLS摆脱它。以下是下载链接:https://www.nuget.org/packages/FreeSpire.XLS/
下面是从https://forums.asp.net/t/2087645.aspx?Saving+xlsx+to+pdf中提取的代码片段。
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Spire.Xls; 

namespace ConvertExcelToPdf 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 

            Workbook workbook = new Workbook(); 
            workbook.LoadFromFile(@"..\..\sample2.xlsx"); 
            workbook.ConverterSetting.SheetFitToPage = true; 
            workbook.SaveToFile(@"..\..\sample.pdf", FileFormat.PDF); 
            System.Diagnostics.Process.Start(@"..\..\sample.pdf"); 
        } 
    } 
} 

2

不要使用Excel来布局您的报告,而是使用HTML。它更加灵活,也是为最终用户布局数据的最简单工具。然后查找众多HTML转PDF解决方案之一(如wkhtmltopdf、安装打印到PDF驱动程序等)。


1

0

我已经为此苦苦挣扎了几天。我不能使用任何付费库,所以我想出了这个解决方案。它需要用户电脑上安装有PDF打印机,但是随着“Microsoft to PDF”和许多其他解决方案的出现,这不应该成为问题。

FileInfo templateFile = new FileInfo("template.xlsx");
    
System.Windows.Forms.PrintDialog printDialog = new System.Windows.Forms.PrintDialog();
// Display the dialog. This returns true if the user presses the Print button.
if (printDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    Process print = new Process();

    print.StartInfo.FileName = templateFile.FullName;

    print.StartInfo.Verb = "PrintTo";

    print.StartInfo.Arguments = printDialog.PrinterSettings.PrinterName;

    print.StartInfo.UseShellExecute = true;

    print.StartInfo.CreateNoWindow = true;

    print.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    print.Start();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接