首页 > 其他分享 >两步实现springBoot导出带动态表格的word docx文档

两步实现springBoot导出带动态表格的word docx文档

时间:2023-08-19 12:34:25浏览次数:47  
标签:docx word springBoot cell headers import document data col

1.第一步 导入poi依赖

<!-- Apache POI -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- Apache POI OOXML -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

2.第二步 创建导出接口

package com.mybatis.plus.controller;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.math.BigInteger;
import java.util.Objects;

@Controller

public class WordExportController {

    @GetMapping("/export")
    public void exportWord(HttpServletResponse response) throws IOException {
        // 创建一个新的Word文档

        XWPFDocument document = new XWPFDocument();

        // 添加段落1
        addParagraph(document, "1.段落1");

        // 添加内容
        addContent(document,"我是内容XXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        addContent(document,"我是内容XXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        // 添加段落2
        addParagraph(document, "2.段落2");

        // 添加表格
        List<String> headers = Arrays.asList("姓名", "年龄", "成绩");
        List<List<String>> data = Arrays.asList(
                Arrays.asList("张三", "5", "20"),
                Arrays.asList("李四", "5", "60")
        );
        addTable(document, headers, data);

        // 设置响应头信息
        response.setHeader("Content-Disposition", "attachment; filename=word_export.docx");
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");

        // 将文档写入输出流
        document.write(response.getOutputStream());
        document.close();
    }

    /**
     * @author: 官昌洪
     * @Description: 添加基础文本内容
     * @Date: 2023/8/19 12:12
     * @Param: 
     * @return: 
     */
    private void addContent(XWPFDocument document, String content) {
        document.createParagraph().createRun().setText(content);
    }

    /**
     * @author: 官昌洪
     * @Description: 添加段落
     * @Date: 2023/8/19 12:11
     * @Param: 
     * @return: 
     */
    private void addParagraph(XWPFDocument document, String s) {
        XWPFParagraph paragraph1 = document.createParagraph();
        paragraph1.setAlignment(ParagraphAlignment.LEFT);
        XWPFRun run1 = paragraph1.createRun();
        run1.setBold(true);
        run1.setFontSize(16); // 设置标题字体大小
        run1.setText(s);
    }

    /**
     * @author: 官昌洪
     * @Description: 添加动态表格
     * @Date: 2023/8/19 12:11
     * @Param:
     * @return:
     */
    private void addTable(XWPFDocument document, List<String> headers, List<List<String>> data) {
        Integer rowNum = 1;
        if (!Objects.isNull(data.get(0))) {
            rowNum = data.get(0).size();
        }
        // 添加表格
        XWPFTable table = document.createTable(rowNum, headers.size()); // 创建一个3行3列的表格
        // 设置表头
        for (int col = 0; col < headers.size(); col++) {
            XWPFTableCell cell = table.getRow(0).getCell(col);
            cell.setText(headers.get(col));
            cell.setWidth("1000");
            addCellCenterStyle(cell);
        }
        // 设置示例数据
        for (int row = 0; row < data.size(); row++) {
            for (int col = 0; col < headers.size(); col++) {
                XWPFTableCell cell = table.getRow(row + 1).getCell(col);
                cell.setText(data.get(row).get(col));
                cell.setWidth("1000");
                addCellCenterStyle(cell);
            }
        }
    }

    /**
     * @author: 官昌洪
     * @Description: 添加水平居中韩国样式
     * @Date: 2023/8/19 12:11
     * @Param: 
     * @return: 
     */
    private void addCellCenterStyle(XWPFTableCell cell) {
        CTTc ctTc = cell.getCTTc();
        //获取 CTP
        CTP ctP = (ctTc.sizeOfPArray() == 0) ?
                ctTc.addNewP() : ctTc.getPArray(0);
        //获取段落
        XWPFParagraph par = cell.getParagraph(ctP);
        //设置水平居中
        par.setAlignment(ParagraphAlignment.CENTER);
    }
}

 

运行结果:

 

标签:docx,word,springBoot,cell,headers,import,document,data,col
From: https://www.cnblogs.com/guanxiaohe/p/17642321.html

相关文章

  • 基于springboot的医护人员排班系统
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足,创建了一个计算机管理医护人员排班系统的方案。文章介绍了医护人员排班系统的系统分析部分,包括可行性分析等,系统设......
  • 基于springboot图书个性化推荐系统的设计与实现
    本论文主要论述了如何使用JAVA语言开发一个图书个性化推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述图书个性化推荐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分......
  • 基于springboot网页时装购物系统
    项目内容及可行性分析制作一个可以供消费者购买商品的网上购物平台,用户可以点击自己需要购买的商品,然后完成购买。该系统主要分为用户模块和管理员模块,用户模块主要关于系统的功能方面的使用,管理员模块则是专注于后台对于系统的维护与信息管理;用户模块具有:登陆、注册、商品查询、商......
  • 基于springboot学生心理咨询评估系统
    使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在学生心理咨询评估信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的学生心理咨询评估系统有管理员和用户。管理员可以......
  • 快速创建一个SpringBoot项目
    一、概述使用社区版创建SpringBoot脚手架的时候,如果使用SpringBoot的官网创建,一旦无法联网就无法创建。下面提供两种创建地址,一种国内的,一种是官网创建。二、解决办法1.使用Spring官网进行创建https://start.spring.io/ 点击下面的按钮获取代码,用idea导入......
  • SpringBoot究竟应该如何学习呢
    如果你有Spring的基础,学习SpringBoot就很简单了。首先要知道SpringBoot是建立在Spring框架之上的,它旨在简化和加速Java应用程序的开发过程。SpringBoot的目标是简化Spring应用程序的配置和开发,通过提供自动配置、快速开发和零配置的特性来减少开发人员的工作量。接下来,就可以......
  • SpringBoot整合(部分内容)
    1.springboot整合数据源--连接数据库1.1pom文件配置首先,创建SpringBoot项目时勾选创建好之后在pom文件中继续添加Druid数据库连接池依赖<!--数据库连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spri......
  • 基于springboot的舞台服装租赁管理系统设计与实现-计算机毕业设计源码+LW文档
    文献综述:舞台服装租赁管理系统也属于电子商务的一部分,最早出现在美国克林顿,电子商务推出以来,对美国的经济造成了非常巨大的影响,带动了国内经济产值。从电子商务的形式来划分,包括企业对企业、企业对消费者,消费者和消费者模式。在电子商务发展过程中,也呈现出多种商务模式,比如企业和......
  • springboot验证码-GoogleReCaptcha3 ReCaptcha
    现在的应用中对于登录,注册,短信验证码。。。这些场景来说,验证码真的是必不可少。随着技术的发展,也使得验证码从当初的图形验证码,发展到今天的滑块,倒立文字点击,数学计算,手势滑动,拼图,刮图。。。等等各种花样,总之一个目的,阻止机器人的访问。验证码这玩意儿,确实给用户带来了很不好的体......
  • springboot验证码-AJ-captcha
    准备资料:若依版本:ruoyi-vue3.8.2【点我去下载】aj-captcha版本:1.3.0【去下源码】参考:若依官方文档-集成aj-captcha开始若依vue版本的验证码用了数学运算,还得手工输入计算结果。看了官方文档,改成了目前比较流行的拖动滑块方式。1.引入MAVEN依赖若依官方引入的是1.2.7版......