国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

這篇具有很好參考價(jià)值的文章主要介紹了Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

1.準(zhǔn)備好docx文件模板

舉例:動(dòng)態(tài)生成表格數(shù)據(jù),以下是list數(shù)組類型的freemarker語法

Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

將寫好的word模板加入到templates目錄下
Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

2.在pom.xml中導(dǎo)入相關(guān)依賴
		<dependency>
			<groupId>fr.opensagres.xdocreport</groupId>
			<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
			<version>2.0.3</version>
		</dependency>
            <dependency>
			<groupId>io.minio</groupId>
			<artifactId>minio</artifactId>
			<version>8.2.1</version>
		</dependency>
3.關(guān)于Minio的介紹

Minio 是一個(gè)開源的對象存儲(chǔ)服務(wù)器,可用于存儲(chǔ)和訪問海量數(shù)據(jù)。以下是 Minio 的基本用法:

(1)安裝 Minio

首先,你需要下載和安裝 Minio。你可以從 Minio 的官方網(wǎng)站(https://min.io/)下載適用于你的操作系統(tǒng)的安裝包,然后按照 Minio 的安裝說明進(jìn)行操作。

(2)啟動(dòng) Minio

安裝完成后,你可以通過運(yùn)行以下命令來啟動(dòng) Minio:

bash復(fù)制代碼

minio server /path/to/data

其中 /path/to/data 是你用于存儲(chǔ)數(shù)據(jù)的目錄或磁盤空間。

(3)訪問 Minio

一旦 Minio 啟動(dòng)成功,你就可以使用 Web 瀏覽器、命令行工具或 SDK 來訪問和操作 Minio。

  • Web 瀏覽器:在瀏覽器中輸入 Minio 的訪問地址(默認(rèn)為 localhost:9000),即可看到 Minio 的管理界面。你可以使用默認(rèn)的用戶名和密碼(分別為 miniominio123)登錄。
  • 命令行工具:你可以使用 Minio 提供的命令行工具(如 mcbs)來訪問和操作 Minio。這些工具提供了豐富的命令行選項(xiàng)和 SDK,方便你進(jìn)行數(shù)據(jù)的上傳、下載、備份、恢復(fù)等操作。
  • SDK:Minio 還提供了多種編程語言的 SDK,如 Java、Python、Go、JavaScript 等。你可以使用這些 SDK 在應(yīng)用程序中集成 Minio 的功能,以便更方便地管理和操作數(shù)據(jù)。

總之,使用 Minio 可以通過簡單的安裝和配置,快速構(gòu)建一個(gè)可靠的對象存儲(chǔ)服務(wù),方便你存儲(chǔ)和訪問海量數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-493108.html

4.在application.yml中添加Minio配置
minio:
//host和port自行填寫
  endpoint: http://127.0.0.1:9000
  accessKey: minio
  secretKey: minio123
  bucketName: carbon
  expires: 86400

5.導(dǎo)入MinioConfig配置類
@Data
@Configuration
public class MinioConfig {

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.bucketName}")
    private String bucketName;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.expires}")
    private Integer expires = 86400;

}

6.導(dǎo)入U(xiǎn)ploadFileService類與其實(shí)現(xiàn)類UploadFileServiceImpl(直接CV過去)
public interface UploadFileService {

    void createBucket(String bucketName);

    /**
     * 獲取全部bucket
     * <p>
     * https://docs.minio.io/cn/java-client-api-reference.html#listBuckets
     */
    List<Bucket> getAllBuckets();

    /**
     * 根據(jù)bucketName獲取信息
     *
     * @param bucketName bucket名稱
     */
    // @SneakyThrows
    Optional<Bucket> getBucket(String bucketName);

    /**
     * 根據(jù)bucketName刪除信息
     *
     * @param bucketName bucket名稱
     */
    void removeBucket(String bucketName);

    /**
     * 根據(jù)文件前置查詢文件
     *
     * @param bucketName bucket名稱
     * @param prefix     前綴
     * @param recursive  是否遞歸查詢
     * @return MinioItem 列表
     */
    List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive);

    /**
     * 獲取文件外鏈
     *
     * @param bucketName bucket名稱
     * @param objectName 文件名稱
     * @param expires    過期時(shí)間 <=7
     * @return url
     */
    String getObjectURL(String bucketName, String objectName, Integer expires);

    /**
     * 獲取文件
     *
     * @param bucketName bucket名稱
     * @param objectName 文件名稱
     * @return 二進(jìn)制流
     */
    InputStream getObject(String bucketName, String objectName);

    /**
     * 上傳文件
     *
     * @param bucketName bucket名稱
     * @param stream     文件流
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
     */
    void putObject(String bucketName, String objectName, InputStream stream);

    /**
     * 上傳文件
     *
     * @param bucketName  bucket名稱
     * @param objectName  文件名稱
     * @param stream      文件流
     * @param size        大小
     * @param contextType 類型
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
     */
    void putObject(String bucketName, String objectName, InputStream stream, long size, String contextType);

    /**
     * 獲取文件信息, 如果拋出異常則說明文件不存在
     *
     * @param bucketName bucket名稱
     * @param objectName 文件名稱
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject
     */
    StatObjectResponse getObjectInfo(String bucketName, String objectName);

    /**
     * 刪除文件
     *
     * @param bucketName bucket名稱
     * @param objectName 文件名稱
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject
     */
    boolean removeObject(String bucketName, String objectName) throws Exception;
}

@Slf4j
@Service
public class UploadFileServiceImpl implements UploadFileService {

    private MinioClient minioClient;

    @Autowired
    MinioConfig minioConfig;

    @PostConstruct
    public void init() {
        this.minioClient =
                MinioClient.builder()
                        .endpoint(minioConfig.getEndpoint())
                        .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
                        .build();
    }

    @Override
    @SneakyThrows
    public void createBucket(String bucketName) {
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    @Override
    @SneakyThrows
    public List<Bucket> getAllBuckets() {
        // 列出所有存儲(chǔ)桶
        return minioClient.listBuckets();
    }

    @Override
    @SneakyThrows
    public Optional<Bucket> getBucket(String bucketName) {
        return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
    }

    @Override
    @SneakyThrows
    public void removeBucket(String bucketName) {
        // 刪除之前先檢查bucketName是否存在。
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (found) {
            // 刪除bucketName存儲(chǔ)桶,注意,只有存儲(chǔ)桶為空時(shí)才能刪除成功。
            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
        } else {
            log.info(bucketName + "does not exist");
        }
    }

    @Override
    @SneakyThrows
    public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
        List<Item> list = new ArrayList<>();
        Iterable<Result<Item>> objectsIterator = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).prefix(prefix)
                        .recursive(recursive).build()
        );
        if (objectsIterator != null) {
            Iterator<Result<Item>> iterator = objectsIterator.iterator();
            if (iterator != null) {
                while (iterator.hasNext()) {
                    Result<Item> result = iterator.next();
                    Item item = result.get();
                    list.add(item);
                }
            }
        }

        return list;
    }

    @Override
    @SneakyThrows
    public String getObjectURL(String bucketName, String objectName, Integer expires) {
        return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(objectName)
                        .expiry(expires, TimeUnit.DAYS)
                        .build());
    }

    @Override
    @SneakyThrows
    public InputStream getObject(String bucketName, String objectName) {
        return minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .build());
    }

    @Override
    @SneakyThrows
    public void putObject(String bucketName, String objectName, InputStream stream) {
        // 檢查存儲(chǔ)桶是否已經(jīng)存在
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
                        stream, stream.available(), -1)
                        .build());
    }

    @Override
    @SneakyThrows
    public void putObject(String bucketName, String objectName, InputStream stream, long size, String contextType) {
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName)
                        .object(objectName).stream(stream, size, -1)
                        .contentType(contextType).build());
    }

    @Override
    @SneakyThrows
    public StatObjectResponse getObjectInfo(String bucketName, String objectName) {
        StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
        return statObjectResponse;
    }

    @Override
    public boolean removeObject(String bucketName, String objectName) throws Exception {
        try {
            minioClient.removeObject(
                    RemoveObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .build());
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}

7.編寫ReportData類
@Slf4j
@Data
@Component
public class ReportData {
//generateReport可加入需要的參數(shù)
    public String generateReport() throws IOException, XDocReportException {
        //通過freemarker模板引擎加載文檔,并緩存到registry中
        ClassPathResource resource= new ClassPathResource("templates/report.docx");
        InputStream input = resource.getInputStream();
        IXDocReport report = XDocReportRegistry
                .getRegistry()
                .loadReport(input, TemplateEngineKind.Freemarker);

        //匹配填充字段和填充數(shù)據(jù),進(jìn)行填充
        IContext context = report.createContext();
        //獲取要放入報(bào)告的數(shù)據(jù)(省略),假設(shè)獲取到了一個(gè)list數(shù)組dataList
        

        //context.put(" ", )放入相應(yīng)的數(shù)據(jù),可在word模板中動(dòng)態(tài)調(diào)用
        context.put("time", LocalDateTime.now());
        context.put("dataList",dataList);

        ByteArrayOutputStream output = new ByteArrayOutputStream();
        report.process(context, output);
        
        ByteArrayInputStream inputStream = new ByteArrayInputStream(output.toByteArray());
         String objectName = "Document/"+"報(bào)告.docx";
        uploadFileService.putObject(minioConfig.getBucketName(),objectName, inputStream);
        return objectName;
    }
}
8.controller層調(diào)用
 @RequestMapping(value = "/reportExport", method = RequestMethod.POST)
//UserServiceByReportExport中可填寫所需參數(shù)
    public void UserServiceByReportExport(HttpServletRequest request, HttpServletResponse response) throws IOException, XDocReportException {
        // TODO 使用預(yù)置的word文檔導(dǎo)出
        String objectName = reportData.generateReport();
        Optional<InputStream> inputOp = Optional.of(uploadFileService.getObject(minioConfig.getBucketName(), objectName));
        if (!inputOp.isPresent()) {
            throw new NullPointerException("報(bào)告生成失敗");
        }

        try (InputStream input1 = inputOp.get();
             OutputStream output1 = response.getOutputStream()) {
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            response.addHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode( "報(bào)告.docx", "UTF-8"));
            response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
            IoUtils.copy(input1, output1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

到了這里,關(guān)于Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

    根據(jù)模板動(dòng)態(tài)生成word(一)使用freemarker生成word

    @ 目錄 一、準(zhǔn)備模板 1、創(chuàng)建模板文件 2、處理模板 2.1 處理普通文本 2.2 處理表格 2.3 處理圖片 二、項(xiàng)目代碼 1、引入依賴 2、生成代碼 三、驗(yàn)證生成word 首先先建立一個(gè)word文件,輸入模板內(nèi)容freemaker的內(nèi)容,下面是本次演示的word文件。 然后將word文件另存為 .xml 文件,然后再

    2024年02月13日
    瀏覽(30)
  • 根據(jù)模板動(dòng)態(tài)生成word(三)使用poi-tl生成word

    根據(jù)模板動(dòng)態(tài)生成word(三)使用poi-tl生成word

    @ 目錄 一、前言 1、什么是poi-tl 2、官方信息 2.1 源碼倉庫 2.2 中文文檔 2.3 開源協(xié)議 3、poi-tl的優(yōu)勢 3.1 poi-tl和其他模板引擎的對比 3.2 poi-tl Word模板引擎支持的功能 二、基本的使用配置 1、引入依賴 1.1 Maven 1.2 Gradle 2、配置 2.1 新建配置 2.2 標(biāo)簽前后綴替換 2.3 加載模板 2.4 填充數(shù)

    2024年02月13日
    瀏覽(22)
  • java 根據(jù)word模板生成word文件

    java 根據(jù)word模板生成word文件

    Java可以使用Apache POI庫來生成Word文件,并且也可以使用freemarker等模板引擎來實(shí)現(xiàn)根據(jù)Word模板生成Word文件的功能。 下面是一個(gè)簡單的示例代碼,可以幫助您快速入門。 模板制作:offer,wps都行,我使用wps進(jìn)行操作? 第一步制作模板 CTRL+f9生成域------》鼠標(biāo)右鍵編輯域------》選

    2024年02月14日
    瀏覽(20)
  • Java根據(jù)word模板生成word文檔并轉(zhuǎn)成PDF文件

    Java根據(jù)word模板生成word文檔并轉(zhuǎn)成PDF文件

    定義完我們的模板之后,我們要將文檔保存為xml的格式 生成的xml格式看起來比較亂,沒有層次感, 所以需要格式化一下 格式化 基礎(chǔ)信息的定義 基礎(chǔ)信息的定義只要保證我們轉(zhuǎn)化成的xml文件中的${name}等格式?jīng)]錯(cuò)誤即可 表格的定義 遍歷實(shí)現(xiàn),表格的數(shù)據(jù)填充 在xml文件中我們的

    2024年02月09日
    瀏覽(35)
  • Java使用ftl模板文件生成Word,以及Word轉(zhuǎn)換圖片或Pdf工具類

    Java使用ftl模板文件生成Word,以及Word轉(zhuǎn)換圖片或Pdf工具類

    一、寫在前面 最近在項(xiàng)目中使用打印功能,發(fā)現(xiàn)這個(gè)功能我已經(jīng)寫過多次了,下面這個(gè)文章的發(fā)步日期在2020年,不得不感慨時(shí)間之快啊。 https://blog.csdn.net/weixin_43238452/article/details/109636200?spm=1001.2014.3001.5501 下面介紹一下應(yīng)用場景:這次項(xiàng)目依舊是springboot項(xiàng)目,使用ftl模版生

    2024年02月15日
    瀏覽(38)
  • itextpdf實(shí)現(xiàn)word模板生成文件

    itextpdf實(shí)現(xiàn)word模板生成文件

    使用word模板生成文件,如下圖,將左側(cè)的模板生成為右側(cè)的填充word文檔。 引入依賴 創(chuàng)建模板,創(chuàng)建一份template2.docx文件,內(nèi)容如下 編寫代碼 編寫測試用例,并執(zhí)行測試用例 生成得到被填充出來的文件。

    2024年02月11日
    瀏覽(27)
  • java 使用POI-TL根據(jù)word模版,生成word文件,含圖片,富文本。

    java 使用POI-TL根據(jù)word模版,生成word文件,含圖片,富文本。

    1.引入mavna坐標(biāo)` 2 .poi-tl-ext插件主要用于富文本內(nèi)容格式在word展現(xiàn) 3.word模版創(chuàng)建 3.具體代碼實(shí)現(xiàn) 4.本文的miniourl路徑實(shí)質(zhì)為網(wǎng)絡(luò)路徑的文件。

    2024年02月16日
    瀏覽(20)
  • Selenium+Java+Maven(12):引入Allure作為報(bào)告生成器

    Selenium+Java+Maven(12):引入Allure作為報(bào)告生成器

    本篇作為Selenium+Java系列的補(bǔ)充,講了如何使用Allure作為測試報(bào)告生成器,來替代TestNG自帶的測試報(bào)告或ReportNG測試報(bào)告,生成更加美觀的(領(lǐng)導(dǎo)更喜歡的)測試報(bào)表。話不多說,一起來學(xué)習(xí)吧~ 【1】安裝及環(huán)境變量配置 需要先在本機(jī)安裝一個(gè)Allure,并配置好環(huán)境變量。 下載

    2024年02月07日
    瀏覽(17)
  • 【問題解決】Java-生成word和pdf中文亂碼(小方框)

    項(xiàng)目中生成pdf報(bào)告采用的邏輯為:對代碼中resoure下的固定的word模版進(jìn)行文件讀取,替換,生成word,然后word轉(zhuǎn)pdf的思路。 在本地運(yùn)行沒有問題,簽章和頁面字體均為問題,但部署服務(wù)器后出現(xiàn)漢字亂碼為小方框。 服務(wù)為docker部署,容器中沒有該字體包導(dǎo)致 1.服務(wù)器安

    2024年01月25日
    瀏覽(32)
  • 【Java】poi-tl 使用Word模板渲染動(dòng)態(tài)表格

    【Java】poi-tl 使用Word模板渲染動(dòng)態(tài)表格

    poi-tl 是一個(gè)基于 Apache POI 和 FreeMarker 的 Java 模板引擎,可以用于動(dòng)態(tài)生成 Word、Excel、PowerPoint 等文檔。使用 poi-tl 可以方便地將數(shù)據(jù)填充到模板中,生成符合要求的文檔。 poi-tl官方文檔地址:http://deepoove.com/poi-tl/#_%E7%89%88%E6%9C%AC 先附上導(dǎo)出效果圖: 這步建議手動(dòng)創(chuàng)建,之前客服

    2024年01月21日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包