excel(.xlsx)使用开放式办公室转换为pdf(.pdf)时缺少工作表和页面大小问题

我使用JodConverterOpen-Office创建了一个应用程序,用于将excel( .xlsx )转换为PDF ,该应用程序运行正常,但我遇到了两个问题

  1. 输出PDF的页面是A4大小的forms,因为某些工作表内容已被切掉。 因为我希望excel的每个工作表都像在一个页面中一样完整。

  2. 缺少工作表,如果我的excel有8个工作表,我在PDF输出中只得到两个或三个

即使我们试图直接从开放办公室转换为pdf ,它也会给出上述类似的问题

Excel文件 – ss1.xlsx

输出PDF – work.pdf

任何人都可以告诉我一些解决方案

我的代码如下所示

 public class MyConverter { public static void main(String[] args) throws ConnectException { File inputFile = new File("C:/Users/Work/Desktop/ss1.xlsx"); File outputFile = new File("C:/Users/Work/Desktop/work.pdf"); // connect to an OpenOffice.org instance running on port 8100 OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); connection.connect(); // convert DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(inputFile, outputFile); // close the connection connection.disconnect(); } 

我使用(免费)PrimoPDF打印机驱动程序直接从Excel中创建PDF。 大量页面(20+)是由于其中一个工作表中缺少“适合页面”打印选项的事实,如果我记得很清楚则是第3页。 更正后,打印所有工作表的命令仍然会生成2个PDF文件。 PrimoPDF要求两次输入文件名,而它只询问一个文件名。 我假设您的程序只生成与第一部分对应的PDF,因为通常只生成一个PDF。 我没有解释2部分打印。 这可能是由于其中一个工作表中的某些打印设置迫使打印以“两批”执行。 例如,不同的分辨率值可能会阻止一批打印。 结论:解决方法是使用PrimoPDF进行打印,并使用Web上免费提供的程序连接2个PDF文件。 要获得持久的解决方案,您必须详细validation所有工作表的打印设置,并确保它们相同。

我担心我以前的答案不够明确。 所以这就是本质:

  • 除第3张以外的所有工作表的分辨率设置均为600.在第3张工作表中,分辨率保留为空白
  • 将第3张纸的分辨率更改为600
  • 现在将正常生成PDF文件,其中包含所有工作表。

显然,Excel只能生成所有工作表的页面分辨率相同的PDF。 如果它遇到具有不同(空白)分辨率的工作表,它就会停止生成输出而不发出任何警告。 恕我直言这是Excel中的一个错误。 幸运的是,解决方法很简单。

希望这能澄清我以前的答案。

您可以使用Microsoft Excel对PDF进行任何.xlsx转换,我目前正在开发一个使用Jacob的应用程序,(Java Com Bridge)一个薄的包装器,用于连接到Microsoft Office程序的对象模型,但它不支持打开-office,但它在将.xlsx文件转换为PDF文件方面做得很好。 它需要一些设置。 链接雅各布

在查看我在Excel中找到的问题 – >页面设置时,如果将Fit更改为1页宽和1页高,它会挤压每个工作表以适合PDF中的每个页面。 我遇到的另一个问题是wrap text属性,使用它时要小心,因为它可能导致布局问题。

我做了一个小的实现,在Excel 2010和Jacob 1.18上测试过

 import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComFailException; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class ExcelApplication { private final String APP_NAME = "Excel.Application"; private final ActiveXComponent excelApplication; private Dispatch workbooks;//all active workbooks opened private Dispatch activeWorkbook;//active workbook private Dispatch activeWorksheets;//all worksheets in active workbook public ExcelApplication() { excelApplication = new ActiveXComponent(APP_NAME); } public void openExcelFileInvisible(String fileName) { //Opens Excel in the background String fileUrl; if (excelApplication != null) { excelApplication.setProperty("Visible", new Variant(false));//sets excel invisible //file url relative to this class //or you can just give an absolute path fileUrl = getClass().getResource(fileName).toExternalForm(); //get workbooks workbooks = Dispatch.call(excelApplication, "Workbooks").getDispatch(); if (activeWorkbook == null) { try { activeWorkbook = Dispatch.call(workbooks, "Open", fileUrl).getDispatch(); } catch (ComFailException comFailEx) { //error opening the Excel Document } } } } public void closeActiveWorkbookAndSave() { try { //close and save change's to active workbook //this only closes the workbook, not Excel Dispatch.call(activeWorkbook, "Close", new Variant(true)); //if you want to exit the Excel App. //excelApplication.invoke("Quit", new Variant[0]); } catch (ComFailException cfe) { //problem closing the workbook } } public void convert_XLSX_TO_PDF(String pdfFileName) { if (activeWorkbook != null) { String workbookName = Dispatch.call(activeWorkbook, "Name").getString(); activeWorksheets = Dispatch.call(activeWorkbook, "Worksheets").getDispatch(); int workSheetCount = Dispatch.call(activeWorksheets, "Count").getInt(); System.out.println("Workbook Name =" + workbookName); System.out.println("Total Worksheets In Active Document = " + workSheetCount); System.out.println("Converting to PDF...."); try { Dispatch currentWorksheet; String currentWorksheetName; //worksheets not zero based, starts at one for (int i = 1; i < workSheetCount+1; i++) { //get each active work sheet and set up the page setup settings currentWorksheet = Dispatch.call(activeWorksheets, "Item", new Variant(i)).getDispatch(); currentWorksheetName = Dispatch.call(currentWorksheet, "Name").getString(); System.out.println("Setting up page setup for Workbook Sheet ("+ i + ".) - " + currentWorksheetName); //Get page setup for each worksheet Dispatch pageSetup = Dispatch.get(currentWorksheet, "PageSetup").getDispatch(); /**** Zoom must be set to false for FitToPagesWide and FitToPagesTall to take control of scaling */ Dispatch.put(pageSetup, "Zoom", new Variant(false)); //Fit content on each worksheet to fit in a single page Dispatch.put(pageSetup, "FitToPagesWide", new Variant(1)); Dispatch.put(pageSetup, "FitToPagesTall", new Variant(1)); //set print area to not chop off content Dispatch.put(pageSetup, "PrintArea", new Variant(false)); //set left margin small Dispatch.put(pageSetup, "LeftMargin", new Variant(0)); } //[3rd param] = 0 specifies PDF document, 1 is XPS format //[4th param] = 0 specifies high quality, 1 is low quality //[5th param] = true to keep document properties, false to ommit //[6th param] = true to keep print areas set, false does not keep print areas set Dispatch.call(activeWorkbook, "ExportAsFixedFormat", new Variant(0), new Variant(pdfFileName), new Variant(0), new Variant(false), new Variant(true)); System.out.println("Export to PDF has been successful."); //close and save closeActiveWorkbookAndSave(); } catch (ComFailException comFailEx) { //Export Failed System.out.println("Export to PDF has failed"); } } } } public class TestExcel { public static void main(String[] args) { // TODO code application logic here ExcelApplication e = new ExcelApplication(); e.openExcelFileInvisible("ss1.xlsx"); //full path accepted here or if not it will be exported to current directory e.convert_XLSX_TO_PDF("covertedXLSXFile.pdf"); } } 

这是从上面的代码生成的PDF文件。 注意第3页,内容有点斩断,当你删除wrap文本属性和合并单元格时,它生成正常。 转换XLSX

这是为所有工作表设置相同页面参数的Excel VBA代码。 抱歉,我不熟悉Openoffice编程,假设API类似:

 Sub PageSetup_AllSheets() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Activate Setup_Page Next End Sub Sub Setup_Page() ' ' Setup_Page Macro ' Macro recorded 27/08/2014 by Paul ' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" .LeftHeader = "" .CenterHeader = "" .RightHeader = "" .LeftFooter = "" .CenterFooter = "" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.7) .RightMargin = Application.InchesToPoints(0.7) .TopMargin = Application.InchesToPoints(0.75) .BottomMargin = Application.InchesToPoints(0.75) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = -3 .CenterHorizontally = False .CenterVertically = False .Orientation = xlPortrait .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = 1 .PrintErrors = xlPrintErrorsDisplayed End With End Sub