项目场景
springboot集成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模板,内容为:

导出的内容

导出的本地文件截图

总结
注意:模板中有变量值{{temp}},参数map里面对应的temp值是null或者"",导出的word就会变成抛空指针异常或者{{temp}}、其他带{{ 的形式,直接在map中设置temp的值为" ",就可以导出空白到模板,注意是加了空格的字符串" "。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论