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

Java實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔的方法步驟

 更新時間:2025年01月12日 08:25:43   作者:lzj2014  
我們在開發(fā)一些系統(tǒng)的時候,例如OA系統(tǒng),經(jīng)常能遇到將審批單數(shù)據(jù)導(dǎo)出為word和excel文檔的需求,導(dǎo)出為excel是比較簡單的,但是word文檔的格式不像表格那樣可以輕松的定位,所以本文給大家介紹了Java怎樣實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔,需要的朋友可以參考下

我們在開發(fā)一些系統(tǒng)的時候,例如OA系統(tǒng),經(jīng)常能遇到將審批單數(shù)據(jù)導(dǎo)出為word和excel文檔的需求,導(dǎo)出為excel是比較簡單的,因?yàn)閑xcel有單元格來供我們定位數(shù)據(jù)位置,但是word文檔的格式不像表格那樣可以輕松的定位,要想將數(shù)據(jù)導(dǎo)出為一些帶有圖片和表格的這種結(jié)構(gòu)復(fù)雜的word文檔該怎樣實(shí)現(xiàn)呢。

poi-tl 1是一款可以幫助我們實(shí)現(xiàn)這種功能的Java開源項(xiàng)目,它把POI和Freemarker相結(jié)合,可以基于我們繪制好的word文檔模板來填充數(shù)據(jù)進(jìn)去,然后生成新的word文檔。

例如,我們要生成一個差旅行程單,首先要繪制這樣的一個word文檔模板,用{{name}}代表姓名進(jìn)行占位,姓名就是普通文字類型,以此類推。tripList作為渲染行程表格的數(shù)據(jù)源的名字,是ArrayList集合類型,放在表格的表頭,用[from]表示tripList集合中每個元素的from屬性的值,渲染到當(dāng)前行的某一列上,以此類推。最后的三個簽署對應(yīng)的是領(lǐng)導(dǎo)的簽名筆跡圖片,圖片類型要用變量名前多一個@的形式{{@****Pin}}來表示

如果表格中某一列是圖片,則表示為[@變量]

模板繪制好以后,開始使用poi-tl工具生成word文檔,首先新建maven項(xiàng)目,引入poi-tl的依賴和需要的其他依賴,然后將這個繪制好的word模板文件放在工程的根目錄

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

然后,新建一個Entity類: org.example.TravelApplyExportVO

package org.example;

import com.deepoove.poi.data.PictureRenderData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TravelApplyExportVO {
    private String no;
    private String name;
    private String dept;
    private String employeeNo;
    private String start;
    private String end;
    private String days;
    private String address;
    private String reason;
    /**
     * com.deepoove.poi.data.PictureRenderData 代表圖片
     */
    private PictureRenderData applyPin;
    private PictureRenderData bossPin;
    private PictureRenderData leaderPin;

    private String date;

    /**
     * 用于渲染表格的集合
     */
    private List<Route> tripList = new ArrayList<>();

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Route {
        private String from;
        private String to;
        private String flight;
        private String depTime;
        private String arrTime;
        private String cabin;
    }
}

新建測試類: org.example.Main,用poi-tl組件基于剛剛繪制的word模板生成一個差旅行程單

package org.example;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import lombok.SneakyThrows;


import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;

public class Main {

    @SneakyThrows
    public static void main(String[] args) {

        TravelApplyExportVO vo = new TravelApplyExportVO();
        vo.setNo("202500001");
        vo.setName("lzj");
        vo.setDept("技術(shù)部");
        vo.setEmployeeNo("00000001");
        vo.setStart("2025-01-01");
        vo.setEnd("2025-02-01");
        vo.setDays("30");
        vo.setAddress("中國香港");
        vo.setReason("系統(tǒng)維護(hù)");

        // 在項(xiàng)目根路徑讀取筆跡圖片,并設(shè)置大小
        PictureRenderData data1 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img2.png")))
                .size(120, 60)
                .create();

        PictureRenderData data2 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img.png")))
                .size(120, 60)
                .create();

        PictureRenderData data3 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img.png")))
                .size(120, 60)
                .create();

        vo.setApplyPin(data1 );
        vo.setBossPin( data2);
        vo.setLeaderPin( data3);

        vo.setDate("2025-01-10");

        // 行程List,最終渲染到文檔的表格中
        vo.setTripList(new ArrayList<TravelApplyExportVO.Route>() {
            {
                add(new TravelApplyExportVO.Route("BJX","ZQZ","ZH5643","2025-01-01 15:00","2025-01-01 16:00","E"));
                add(new TravelApplyExportVO.Route("ZQZ","CDE","JUH6532","2026-01-01 15:00","2025-12-01 16:00","A"));
                add(new TravelApplyExportVO.Route("BJX","ZQZ","KJU0954","2027-01-01 15:00","2025-05-01 16:00","Q"));
            }
        });

        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();

        // !!將tripList通過表格來渲染
        Configure config = Configure.builder()
                .bind("tripList", policy)
                .build();

        XWPFTemplate template = XWPFTemplate
                .compile("模板.docx", config)
                .render(vo);

        template.writeAndClose(Files.newOutputStream(Paths.get("output.docx")));
    }
}

然后領(lǐng)導(dǎo)簽名筆記圖片素材img.png,img2.png也需要放進(jìn)工程根目錄下

都完成后,執(zhí)行main()方法測試,程序運(yùn)行結(jié)束后,將在根路徑生成文件output.docx,打開就是我們想要的效果了。

到此這篇關(guān)于Java實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Word文檔的方法步驟的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)導(dǎo)出為Word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解java創(chuàng)建一個女朋友類(對象啥的new一個就是)==建造者模式,一鍵重寫

    詳解java創(chuàng)建一個女朋友類(對象啥的new一個就是)==建造者模式,一鍵重寫

    這篇文章主要介紹了java建造者模式一鍵重寫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java過濾器與監(jiān)聽器間區(qū)別與聯(lián)系

    Java過濾器與監(jiān)聽器間區(qū)別與聯(lián)系

    監(jiān)聽器是一個接口內(nèi)容由我們實(shí)現(xiàn),會在特定時間被調(diào)用,監(jiān)聽器用于監(jiān)聽web應(yīng)用中三大域?qū)ο?request,session,application),信息的創(chuàng)建,銷毀,增加,修改,刪除等動作的發(fā)生,然后做出相應(yīng)的響應(yīng)處理
    2023-01-01
  • java 中二分法查找的應(yīng)用實(shí)例

    java 中二分法查找的應(yīng)用實(shí)例

    這篇文章主要介紹了java 中二分法查找的應(yīng)用實(shí)例的相關(guān)資料,希望通過本文大家能掌握二分法的使用方法,需要的朋友可以參考下
    2017-09-09
  • JavaGUI模仿QQ聊天功能完整版

    JavaGUI模仿QQ聊天功能完整版

    這篇文章主要為大家詳細(xì)介紹了JavaGUI模仿QQ聊天功能完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)

    SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)

    本文主要介紹了SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java設(shè)計模式之策略模式示例詳解

    Java設(shè)計模式之策略模式示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java的策略模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • eclipse maven 插件的安裝和配置詳解

    eclipse maven 插件的安裝和配置詳解

    這篇文章主要介紹了eclipse maven 插件的安裝和配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java詳細(xì)分析講解泛型

    Java詳細(xì)分析講解泛型

    在正式進(jìn)入內(nèi)容之前說明一下:泛型的內(nèi)容太多,也太復(fù)雜。這里因?yàn)镴ava中寫數(shù)據(jù)結(jié)構(gòu)的時候會使用到,所以加上。關(guān)于泛型我找了挺多文章,再結(jié)合自己的理解,盡可能將其講清楚。不求會使用泛型,只要求后面數(shù)據(jù)結(jié)構(gòu)出現(xiàn)泛型的時候能夠知道是在干什么即可
    2022-05-05
  • SpringBoot給所有接口配置跨域的方法詳解

    SpringBoot給所有接口配置跨域的方法詳解

    簡單而言,跨域請求就是當(dāng)一臺服務(wù)器資源從另一臺服務(wù)器(不同 的域名或者端口)請求一個資源或者接口,就會發(fā)起一個跨域 HTTP 請求,本文給大家介紹了SpringBoot給所有接口配置跨域的方法,需要的朋友可以參考下
    2025-09-09
  • 使用SpringCloudApiGateway之支持Cors跨域請求

    使用SpringCloudApiGateway之支持Cors跨域請求

    這篇文章主要介紹了使用SpringCloudApiGateway之支持Cors跨域請求的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

东乌| 康定县| 仙居县| 安西县| 开封县| 资阳市| 施甸县| 莲花县| 龙岩市| 肥乡县| 岳西县| 集贤县| 信丰县| 合阳县| 松溪县| 康马县| 思茅市| 临沂市| 迭部县| 清河县| 青州市| 孟州市| 鲁甸县| 蒲城县| 合川市| 九龙县| 简阳市| 高要市| 江津市| 青州市| 芜湖县| 福安市| 宁河县| 麻江县| 新安县| 广州市| 两当县| 贵州省| 琼结县| 青阳县| 门源|