spring boot集成easypoi导出word换行处理

news2025/1/6 20:27:26

项目场景:

spring boot集成easypoi导出word

<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-spring-boot-starter</artifactId>
	<version>4.4.0</version>
</dependency>

问题描述

spring boot集成easypoi导出word时,内容包含换行符\n,导出word时换行符失效,会将换行符\n识别为空格。


解决方案:

第一种:生成段落的方式

示例代码:

import com.xinghuo.common.base.ActionResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Cleanup;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileOutputStream;

@RestController
@Api(tags = "测试")
@RequestMapping("/test")
public class TestController {

    @ApiOperation("导出Word")
    @GetMapping("/export")
    public ActionResult export() {
        exportWord();
        return ActionResult.success();
    }

    /**
     * 导出Word,支持换行
     */
    public void exportWord(){
        try{
            String content = "第一行\n第二行中文\n"+"第三行";

            @Cleanup XWPFDocument doc = new XWPFDocument();

            if(content != null && content.contains("\n")) {
                //设置换行
                String[] text = content.split("\n");
                for (int i = 0; i < text.length; i++) {
                    XWPFParagraph p = doc.createParagraph();
                    p.createRun().setText(text[i]);
                }
            }else{
                XWPFParagraph p = doc.createParagraph();
                p.createRun().setText(content);
            }

            String name = "测试换行内容.docx";
            String filePath = "F:"+ File.separator + name;
            @Cleanup FileOutputStream output = new FileOutputStream(filePath);
            doc.write(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

导出的word内容

 


第二种:替换模板的情况,换行符替换成回车

示例代码:

import cn.afterturn.easypoi.word.WordExportUtil;
import com.xinghuo.common.base.ActionResult;
import com.xinghuo.common.util.XSSEscape;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Cleanup;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@Api(tags = "测试")
@RequestMapping("/test")
public class Test1Controller {

    @ApiOperation("导出Word")
    @GetMapping("/export")
    public ActionResult export() {
        exportWordTemplate();
        return ActionResult.success();
    }

    /**
     * 导出Word替换模板,支持换行
     */
    public void exportWordTemplate(){
        try{
            String content = "第一行\n第二行中文\n"+"第三行";
            Map<String, Object> map = new HashMap<>();
            map.put("content",content);

            @Cleanup XWPFDocument doc = WordExportUtil.exportWord07("F:/export_template.docx", map);
            //文本换行
            addBreakInCell(doc.getParagraphs());

            String name = "测试换行内容-替换模板.docx";
            String filePath = "F:"+ File.separator + name;
            @Cleanup FileOutputStream output = new FileOutputStream(XSSEscape.escapePath(filePath));
            doc.write(output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 文本换行
     */
    public static void addBreakInCell(List<XWPFParagraph> paragraphs) {
        for (XWPFParagraph p : paragraphs) {
            for (XWPFRun run : p.getRuns()) {//XWPFRun对象定义具有一组公共属性的文本区域
                if(run.getText(0)!= null && run.getText(0).contains("\n")) {
                    String[] lines = run.getText(0).split("\n");
                    if(lines.length > 0) {
                        run.setText(lines[0], 0); // set first line into XWPFRun
                        for(int i=1;i<lines.length;i++){
                            // add break and insert new text
                            run.addBreak();//中断
//                              run.addCarriageReturn();//回车符,但是不起作用
                            run.setText(lines[i]);
                        }
                    }
                }
            }
        }
    }
}

 其中export_template.docx文件是word模板,内容为:

导出的内容

 


导出的本地文件截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1908348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中Request和Response的详细介绍

1.Request和Response的概述 # 重点 1. service方法的两个参数request和response是由tomcat创建的void service(ServletRequest var1, ServletResponse var2) 2. request 表示请求数据, tomcat将浏览器发送过来的请求数据解析并封装到request对象中servlet开发者可以通过reques…

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…

美妆网页设计(前端)

目录 一、 网站背景&#xff1a; 1、 背景介绍 2、 项目意义 二、 系统设计&#xff1a; 1.系统目标 2.系统功能结构 3.开发环境 三、 开发实现 1、导航栏 2、轮播效果效果 3、下拉菜单效果 4、模态框 遇到的问题及解决办法 五、 总结&#xff1a; 网站背景&…

【LabVIEW学习篇 - 5】:数据类型——数值、字符串

文章目录 数值枚举下拉列表控件 字符串字符串与十六进制截取字符串连接字符串 字符串与数值间的转换字符串转为数值数值转为字符串 数值 如下图所示&#xff0c;各种数值型数据的不同之处在于存储和表示数据时所使用的位置不同。 浮点型 整型 在LabVIEW中&#xff0c;想要改…

Android计算器界面的设计——表格布局TableLayout实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button等实现一个计算器界面&#xff0c;界面如图1所示。 图1 计算器界面效果图 任务分析 界面整体使用表格布局&#xff0c;第一行使用一个TextView控件&#xff0c;横跨4列&#xff0c;中间4行4列&#xff0c;最后一…

Mysql笔记-v2

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

OS Copilot测评-CSDN

登录控制台 安装插件 sudo yum install -y os-copilot效果如下 配置 AccessKey ID 与 AccessKey Secret 注意安全&#xff0c;使用完成后&#xff0c;别忘了去控制台删除&#xff0c;一般情况使用子Key就可以 检测是否可用 co hi实际操作(当前为官方案例请求) 实操1&…

分区Partition

理解Partition 向量检索服务DashVector的Collection具有分区&#xff08;Partition&#xff09;的能力&#xff0c;同一个Collection下的Doc可通过不同的Partition进行物理和逻辑上的分区。各种Doc操作&#xff08;如插入Doc、检索Doc等&#xff09;若指定Partition&#xff0…

超好用的傲软录屏下载和解锁版安装教程 (专业好用的桌面录屏软件)

录屏系列软件安装目录 一、ZD屏幕录像机解锁版下载及安装教程 (一款小巧的轻量级屏幕录像工具) 二、班迪录屏Bandicam v7解锁版安装教程&#xff08;高清录屏软件&#xff09; 三、Mirillis Action v4 解锁版安装教程(专业高清屏幕录像软件) 四、Aiseesoft Screen Recorder…

react-类组件1

类组件&#xff1a; import { Component } from "react";class App extends Component {constructor() {super();this.state {message: "xxxxx",};}render() {return (<div><div>{this.state.message}</div></div>);} }export d…

如 何 避 开 职 场 雷 区

01 管理好自己的情绪 在职场中切忌过于情绪化&#xff0c;学会管理好自己的情绪是一个职场人必备的技能之一。坏情绪并不会帮助你解决任何问题&#xff0c;过多的抱怨&#xff0c;只会使你成为负能量的传播者。 在职场中&#xff0c;需要做的是管理好自己的情绪&#xff0c;积…

Python--并发编程--协程

概念 协程是轻量级的线程&#xff0c;它是程序员管理的并发机制&#xff0c;使得在一个线程中程序可以在多个函数之间交替运行。 Python中主要通过asyncio模块实现协程。 协程函数 用async修饰的函数 import asyncio# func为协程函数 async def func():await asyncio.slee…

【C语言】extern 关键字详解

在C语言中&#xff0c;extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中&#xff0c;通常用于声明全局变量或函数&#xff0c;这些变量或函数的定义位于其他文件中。 基本用法 变量声明…

[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_f…

考CISP,不要踩坑的几点建议

当你立志要在信息安全领域闯出一片天&#xff0c;可能多少都会听行内人说&#xff0c;搞本CISP。但这个认证究竟该怎么拿&#xff1f;需要培训吗&#xff1f;培训又是怎么一回事&#xff1f;价格如何&#xff1f;还有&#xff0c;什么时候开始准备最好&#xff1f;这些问题可能…

简易Qt串口助手

界面显示如下 关于串口类 初始化 设置串口号 设置波特率 打开串口 发送按钮功能实现 接收数据显示在控件中 关闭串口

FFmpeg 实现从麦克风获取流并通过RTMP推流

使用FFmpeg库实现从麦克风获取流并通过RTMP推流&#xff0c;FFmpeg版本为4.4.2-0。RTMP服务器使用的是SRS&#xff0c;我这边是跑在Ubuntu上的&#xff0c;最好是关闭掉系统防火墙。拉流端使用VLC。如果想要降低延时&#xff0c;请看我另外一篇博客&#xff0c;里面有说降低延时…

【密码学基础】基于LWE(Learning with Errors)的全同态加密方案

学习资源&#xff1a; 全同态加密I&#xff1a;理论与基础&#xff08;上海交通大学 郁昱老师&#xff09; 全同态加密II&#xff1a;全同态加密的理论与构造&#xff08;Xiang Xie老师&#xff09; 现在第二代&#xff08;如BGV和BFV&#xff09;和第三代全同态加密方案都是基…

数据集 | 人脸公开数据集的介绍及下载地址

本文介绍了人脸相关算法的数据集。 1.人脸数据集详情 1.1.Labeled Faces in the Wild (LFW) 论文 下载地址&#xff1a;LFW Face Database : Main (umass.edu) 是目前人脸识别的常用测试集&#xff0c;其中提供的人脸图片均来源于生活中的自然场景&#xff0c;因此识别难度会…