最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF的實(shí)戰(zhàn)指南

 更新時(shí)間:2026年03月23日 08:48:50   作者:Java小王子呀  
這篇文章主要介紹了兩種將Excel轉(zhuǎn)換為PDF的方法,第一種使用Spire.XLS免費(fèi)版,第二種方法(破解版)支持多頁(yè)轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

一、只適合三頁(yè)內(nèi)的PDF

使用幾行代碼就可以將我們的Excel轉(zhuǎn)為PDF格式,

先說(shuō)缺點(diǎn):這個(gè)jar包是收費(fèi)的,只能導(dǎo)出3頁(yè),不適合超過(guò)3頁(yè)P(yáng)DF文件的轉(zhuǎn)換。

1、在pom文件中導(dǎo)入workbook的所需依賴

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.1.0</version>
</dependency>

如果不能自動(dòng)導(dǎo)入,則手動(dòng)導(dǎo)入

下載jar包到本地后

2.Win+R打開運(yùn)行,輸入cmd回車打開doc命令窗口

mvn install:install-file -Dfile=D:\spire.xls.free-5.1.0.jar -DgroupId=e-iceblue -DartifactId=spire.xls.free -Dversion=5.1.0 -Dpackaging=jar

顯示如下圖就是成功了

3.使用workbook導(dǎo)出整個(gè)Excel文件的代碼只需要兩步,我們可以直接看代碼示例:

    /**
     * 使用spire簡(jiǎn)單整個(gè)Excel轉(zhuǎn)換為pdf
     *
     * @param inputFilePath Excel文件路徑
     * @param outputFilePath 導(dǎo)出的PDF文件路徑
     */
    public static void totalExcelToPDF(String inputFilePath, String outputFilePath) {
        Workbook wb = new Workbook();
//        引入Excel文件
        wb.loadFromFile(inputFilePath);
//        導(dǎo)出PDF文件
        wb.saveToFile(outputFilePath, FileFormat.PDF);
    }

本地文件快速測(cè)試:

import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;

    @Test
    public void test() {
        // Excel文件路徑
        String excelFilePath = "C:\\Users\\admin\\Downloads\\crossdock_plan_bol_2025-10-22 (1)\\test.xlsx";
        
        // 加載Excel文件
        Workbook workbook = new Workbook();
        workbook.loadFromFile(excelFilePath);
        
        // 構(gòu)造PDF文件路徑(與Excel文件同路徑,僅文件擴(kuò)展名不同)
        String pdfFilePath = excelFilePath.replaceAll("\\.xlsx$", ".pdf");

        // 保存為PDF到同路徑下
        workbook.saveToFile(pdfFilePath, FileFormat.PDF);
        
        System.out.println("PDF文件已保存到: " + pdfFilePath);
    }

也指定單個(gè)的sheet頁(yè)轉(zhuǎn)為PDF,輸入指定的sheet頁(yè)的下標(biāo)即可。代碼示例如下:

/**
 * 使用spire將單個(gè)sheet轉(zhuǎn)成pdf
 *
 * @param inputFilePath Excel文件路徑
 * @param outputFilePath 導(dǎo)出的PDF文件路徑
 * @param sheetNum 導(dǎo)出的sheet頁(yè)下標(biāo)
 */
public static void partExcelToPDF(String inputFilePath, String outputFilePath, int sheetNum) {
    //加載Excel文檔
    Workbook wb = new Workbook();
    wb.loadFromFile(inputFilePath);
    //獲取到哪一個(gè)sheet頁(yè)
    Worksheet sheet = wb.getWorksheets().get(sheetNum);
    //調(diào)用方法保存為PDF格式
    sheet.saveToPdf(outputFilePath);
}

補(bǔ)充:

這個(gè)好像也可以,都差不多

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

二、多頁(yè)的(破解版)

移除水印原理:

替換指定文字為白色的遮罩層

            String afterDestPdfFileName = "formal-" + middleFileName + ".pdf";
            AsposePdfUtil.replaceStr(attachRecordsThinVo.getDirectoryName().concat(destPdfFileName),
                    attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName),
                    "Evaluation Only. Created with Aspose.Cells for Java.Copyright 2003 - 2023 Aspose Pty Ltd.");
    /**
     * 替換指定文字為白色的遮罩層
     * @param src 需要被轉(zhuǎn)換的帶全路徑文件名
     * @param dest 轉(zhuǎn)換之后pdf的帶全路徑文件名
     * @param replaceStr 指定轉(zhuǎn)換的文字(水印的文字)
     */
    public static void replaceStr(String src, String dest, String replaceStr) {
        try {
            List<String> resu = new ArrayList<>();
            PdfReader reader = new PdfReader(src);
            //獲取指定文字的坐標(biāo)(就是上一步生成的pdf水印)
            getKeyWords(reader,replaceStr,resu);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
            for (int i = 1; i <= resu.size(); i++) {
                String xy = resu.get(i - 1);
                PdfContentByte canvas = stamper.getOverContent(i);
//                canvas.showTextAligned(PdfContentByte.ALIGN_CENTER, "", 15, 15, 0);
//                canvas.set
                canvas.saveState();
                //設(shè)置顏色
                canvas.setColorFill(BaseColor.WHITE);
                //解析坐標(biāo)
                double x = Double.valueOf(xy.split("--")[0]);
                double y = Double.valueOf(xy.split("--")[1]) - 10;
                //后面2個(gè)參數(shù)分別是寬高
                canvas.rectangle(x, y, 450, 100);
                canvas.fill();
                canvas.restoreState();
            }
            stamper.close();
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

補(bǔ)充:

private  AttachRecords complex_fill_pod_excel_to_pdf(KeyVo keyVo, List<BaseVo> detailInfo, ResourceLoader resourceLoader, String fileName) throws IOException {
        log.info("complex_fill_pod_excel_to_pdf input param,keyVo:{},detailInfo:{},fileName:{}", JSONObject.toJSONString(keyVo),
                JSONObject.toJSONString(detailInfo), fileName);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            // 模板注意 用{} 來(lái)表示你要用的變量 如果本來(lái)就有"{","}" 特殊字符 用"\{","\}"代替
            // {} 代表普通變量 {.} 代表是list的變量
            InputStream inputStream = resourceLoader.getResource(BOL_POD_TEMPLATE_NEW_FORMAT).getInputStream();
            ExcelWriter excelWriter = EasyExcel.write(bos).withTemplate(inputStream).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 這里注意 入?yún)⒂昧薴orceNewRow 代表在寫入list的時(shí)候不管list下面有沒有空行 都會(huì)創(chuàng)建一行,然后下面的數(shù)據(jù)往后移動(dòng)。默認(rèn) 是false,會(huì)直接使用下一行,如果沒有則創(chuàng)建。
            // forceNewRow 如果設(shè)置了true,有個(gè)缺點(diǎn) 就是他會(huì)把所有的數(shù)據(jù)都放到內(nèi)存了,所以慎用
            // 簡(jiǎn)單的說(shuō) 如果你的模板有l(wèi)ist,且list不是最后一行,下面還有數(shù)據(jù)需要填充 就必須設(shè)置 forceNewRow=true 但是這個(gè)就會(huì)把所有數(shù)據(jù)放到內(nèi)存 會(huì)很耗內(nèi)存
            // 如果數(shù)據(jù)量大 list不是最后一行 參照下一個(gè)
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(detailInfo, fillConfig, writeSheet);
            excelWriter.fill(keyVo, writeSheet);
            excelWriter.finish();



            if (ObjectUtil.isEmpty(bos) || bos.size() == 0){
                log.error("complex_fill_pod_excel_to_pdf error bos is null");
                return null;
            }

            String middleFileName = UUID.randomUUID().toString();
            // 生成原excel文件
            String sourceExcelFileName = "excel-" + middleFileName + ".xlsx";
            AttachRecordsThinVo attachRecordsThinVo = attachRecordsService.directSaveFile(sourceExcelFileName, bos.toByteArray());
            if (ObjectUtil.isEmpty(attachRecordsThinVo)){
                log.error("attachRecordsThinVo is null");
                return null;
            }

            // 轉(zhuǎn)成pdf
            String destPdfFileName = "temp-" + middleFileName + ".pdf";
            AsposePdfUtil.excel2pdf(attachRecordsThinVo.getDirectoryName().concat(sourceExcelFileName),
                    attachRecordsThinVo.getDirectoryName().concat(destPdfFileName), null);

            // 移除水印
            String afterDestPdfFileName = "formal-" + middleFileName + ".pdf";
            AsposePdfUtil.replaceStr(attachRecordsThinVo.getDirectoryName().concat(destPdfFileName),
                    attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName),
                    "Evaluation Only. Created with Aspose.Cells for Java.Copyright 2003 - 2023 Aspose Pty Ltd.");

            // 本地生成的文件,上傳到阿里oss
            AttachRecords attachRecords = attachRecordsService.uploadAttachRecords(fileName,
                    attachRecordsThinVo.getDownloadDirectoryName().concat(afterDestPdfFileName),
                    FileUtils.readFileToByteArray(new File(attachRecordsThinVo.getDirectoryName().concat(afterDestPdfFileName))));

            log.info("complex_fill_pod_excel_to_pdf result attachRecords:{}",JSONObject.toJSONString(attachRecords));
            return attachRecords;
        } catch (Exception e) {
            log.error("complex_fill_pod_excel_to_pdf error!", e);
            e.printStackTrace();
            throw new ApiException(ResultCode.FAULT);
        } finally {
            bos.close();
        }
    }

到此這篇關(guān)于Java輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java Excel轉(zhuǎn)PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)

    詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)

    IoC?和?DI?是?Spring?中最重要的兩個(gè)概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實(shí)現(xiàn)。那么?DI?實(shí)現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來(lái)和大家一起詳細(xì)聊聊
    2022-08-08
  • SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)

    這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring Cloud之注冊(cè)中心Nacos的使用詳解

    Spring Cloud之注冊(cè)中心Nacos的使用詳解

    本文介紹SpringCloud Alibaba中的Nacos組件,對(duì)比了Nacos與Eureka的區(qū)別,展示了如何在項(xiàng)目中引入SpringCloud Alibaba和Nacos,并配置負(fù)載均衡,通過(guò)實(shí)際操作,驗(yàn)證了服務(wù)注冊(cè)和負(fù)載均衡的功能,感興趣的朋友一起看看吧
    2025-03-03
  • Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    這篇文章主要介紹了Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢

    實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢

    這里我們來(lái)以實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢,包括一對(duì)多、多對(duì)一的關(guān)聯(lián)查詢以及自身關(guān)聯(lián)映射的方法等,需要的朋友可以參考下
    2016-06-06
  • IDEA git版本回滾使用解讀

    IDEA git版本回滾使用解讀

    這篇文章主要介紹了Git的分區(qū)和回滾操作,包括工作區(qū)、暫存區(qū)和版本庫(kù)的概念,以及如何在不同狀態(tài)下進(jìn)行回滾操作,如未commit、commit未push、已commit但未push以及已commit并push的情況
    2025-10-10
  • Hystrix?Turbine聚合監(jiān)控的實(shí)現(xiàn)詳解

    Hystrix?Turbine聚合監(jiān)控的實(shí)現(xiàn)詳解

    微服務(wù)架構(gòu)下,?個(gè)微服務(wù)往往部署多個(gè)實(shí)例,如果每次只能查看單個(gè)實(shí)例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場(chǎng)景下,我們可以使??Hystrix?Turbine?進(jìn)?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控?cái)?shù)據(jù)聚合在?起,便于查看
    2022-09-09
  • jmeter接口測(cè)試之使用rsa算法加密解密的代碼

    jmeter接口測(cè)試之使用rsa算法加密解密的代碼

    這篇文章主要介紹了jmeter接口測(cè)試-使用rsa加密解密算法,部分接口采用了rsa加密算法,我們的jmeter 也是可以直接拿來(lái)調(diào)用的,不需要開發(fā)配合去掉加密代碼,需要的朋友可以參考下
    2022-03-03
  • Maven依賴沖突問(wèn)題及解決過(guò)程

    Maven依賴沖突問(wèn)題及解決過(guò)程

    文章主要討論Maven依賴沖突問(wèn)題,及提供解決方法,首先描述了依賴沖突現(xiàn)象的nd導(dǎo)致類NoClassDefFoundError的情況;然后介紹了查找沖突包的方法,最后總結(jié)了Maven依賴管理的幾種策略,包括依賴調(diào)解、依賴排除和依賴范圍控制;強(qiáng)調(diào)了合理配置POM文件的重要性
    2026-04-04

最新評(píng)論

嘉峪关市| 五寨县| 长阳| 弥勒县| 扎赉特旗| 哈巴河县| 霍城县| 沛县| 保康县| 永登县| 鲁山县| 陇川县| 东乡族自治县| 宁津县| 吉木萨尔县| 农安县| 淄博市| 博兴县| 宜宾县| 潮安县| 庄浪县| 五寨县| 图木舒克市| 麻栗坡县| 浪卡子县| 定日县| 邻水| 惠安县| 金华市| 图木舒克市| 呼图壁县| 黄陵县| 通许县| 通城县| 长沙县| 海门市| 皋兰县| 定远县| 清河县| 武平县| 三台县|