Java+LibreOffice实现Excel转PDF并横向一页显示所有列

 更新时间:2025年06月17日 10:39:22   作者:懂行者,行天下。  
在实际业务场景中,用户往往会提供格式不一的 Excel 文件,有时希望将其转换为 PDF 并横向显示,所有列压缩在一页内,下面我们来看看具体实现方法吧

背景需求

在实际业务场景中,用户往往会提供格式不一的 Excel 文件(尤其列非常多),希望将其转换为 PDF 并横向显示,所有列压缩在一页内

用户不会手动设置打印参数,因此希望通过 Java 代码实现自动化转换,保证视觉效果统一。

技术方案概览

技术栈

工具用途
Apache POI修改 Excel 页设置(横向、一页宽)
LibreOffice使用 headless 模式导出 PDF
Java实现逻辑控制和流程管理

页面设置关键代码

Apache POI 5.2.5

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public static void adjustExcelPageSetup(String inputPath, String tempPath) throws IOException {
    FileInputStream fis = new FileInputStream(inputPath);
    Workbook workbook = new XSSFWorkbook(fis);
    for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
        Sheet sheet = workbook.getSheetAt(i);
        PrintSetup printSetup = sheet.getPrintSetup();
        printSetup.setLandscape(true); // 横向打印
        sheet.setAutobreaks(true); // 自动分页
        sheet.setFitToPage(true); // 启用适应页面
        printSetup.setFitWidth((short) 1); // 一页宽度
        printSetup.setFitHeight((short) 0); // 高度不限(0 = 自动)
        }
        FileOutputStream fos = new FileOutputStream(tempPath);
        workbook.write(fos);
        workbook.close();
        fis.close();
        fos.close();
}

LibreOffice 命令行调用

public static void convertToPdf(String libreOfficePath, String inputPath, String outputDir) throws IOException, InterruptedException {
    List<String> command = Arrays.asList(
        libreOfficePath,
        “–headless”,
        “–norestore”,
        “–convert-to”, “pdf”,
        “–outdir”, outputDir,
        inputPath
        );
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.inheritIO();
        Process process = pb.start();
        int exitCode = process.waitFor();

if (exitCode == 0) {
    System.out.println("转换成功: " + inputPath);
    
} else {
    System.err.println("转换失败: " + inputPath);
    
}
    
}

常见问题 FAQ

1.setFitToWidth() 报错:方法不存在?

是早期示例误导,正确方法是:

printSetup.setFitWidth((short) 1);
printSetup.setFitHeight((short) 0);

2.temp_wide_excel.xlsx 是否需要预创建?

不需要,只要目录存在,程序会自动创建并写入该文件。

3.文件路径有空格导致 LibreOffice 转换失败?

请使用 “路径” 包含引号或使用 new File(path).getAbsolutePath() 避免错误。

4.Excel 很宽时 PDF 仍分页?

请务必:

使用 printSetup.setFitWidth((short) 1) 设置一页宽

启用 sheet.setFitToPage(true)

使用 LibreOffice 转换前,先保存好设置

完整流程

接收原始 Excel 文件(.xlsx)

使用 Apache POI 设置打印参数(横向、一页宽)

输出为临时文件(如 temp_wide_excel.xlsx)

使用 LibreOffice 命令行导出 PDF

输出 PDF 横向显示、列不分页

示例目录结构

D:\input\wide_excel.xlsx        // 原始文件
D:\input\temp_wide_excel.xlsx   // 临时设置后文件
D:\output\wide_excel.pdf        // 最终 PDF 输出

扩展建议

支持批量处理整个文件夹 Excel 文件

自动清理临时文件

包装为 CLI 工具或 Sp

到此这篇关于Java+LibreOffice实现Excel转PDF并横向一页显示所有列的文章就介绍到这了,更多相关Java Excel转PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java的Hibernate框架中的继承映射学习教程

    Java的Hibernate框架中的继承映射学习教程

    Hibernate中的映射可以将类与表对应,并利用类的继承特性,这里我们就来看一下Java的Hibernate框架中的继承映射学习教程
    2016-07-07
  • Java修改eclipse中web项目的server部署路径问题

    Java修改eclipse中web项目的server部署路径问题

    这篇文章主要介绍了Java修改eclipse中web项目的server部署路径,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java多线程与线程池技术分享

    Java多线程与线程池技术分享

    这篇文章主要介绍了Java多线程与线程池技术分享,线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,下文相关介绍需要的小伙伴可以参考一下
    2022-03-03
  • Java web数据可视化实现原理解析

    Java web数据可视化实现原理解析

    这篇文章主要介绍了Java web数据可视化实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spring BeanFactory和FactoryBean区别解析

    Spring BeanFactory和FactoryBean区别解析

    这篇文章主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spring运行时动态注册bean的方法

    Spring运行时动态注册bean的方法

    这篇文章主要介绍了Spring运行时动态注册bean的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • java的IO流详细解读

    java的IO流详细解读

    这篇文章主要介绍了java的IO流详细解读,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringSecurity6.0 如何通过JWTtoken进行认证授权

    SpringSecurity6.0 如何通过JWTtoken进行认证授权

    这篇文章主要介绍了SpringSecurity6.0 通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • java栈实现二叉树的非递归遍历的示例代码

    java栈实现二叉树的非递归遍历的示例代码

    这篇文章主要介绍了java栈实现二叉树的非递归遍历,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java实现带缓冲的输入输出流

    Java实现带缓冲的输入输出流

    本文详细讲解了Java实现带缓冲的输入输出流,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论