java word生成_java生成Word文件的三种方式

前期调研的itext,生成效果不行,版本太老,就不发出来了。

1.使用poi库生成

引入pom.xml

org.apache.poi

poi

4.1.0

org.apache.poi

poi-ooxml

4.1.0

生成文件代码

XWPFDocument document= new XWPFDocument();

//Write the Document in file system

FileOutputStream out = new FileOutputStream(new File("/Users/xxx/work/xxx/create_toc.docx"));

//添加标题

XWPFParagraph titleParagraph = document.createParagraph();

//设置段落居中

titleParagraph.setAlignment(ParagraphAlignment.CENTER);

XWPFRun titleParagraphRun = titleParagraph.createRun();

titleParagraphRun.setText("Java PoI");

titleParagraphRun.setColor("000000");

titleParagraphRun.setFontSize(20);

//段落

XWPFParagraph firstParagraph = document.createParagraph();

firstParagraph.getStyleID();

firstParagraph.setStyle("Heading1");

XWPFRun run = firstParagraph.createRun();

run.setText("段落1。");

run.setColor("696969");

run.setFontSize(18);

//段落

XWPFParagraph firstParagraph1 = document.createParagraph();

firstParagraph.setStyle("Heading1");

XWPFRun run1 = firstParagraph1.createRun();

run1.setText("段落2");

run1.setColor("696969");

run1.setFontSize(16);

document.createTOC();

document.write(out);

out.close();这里有setStyle的参数Heading1,不知道哪里来的吧。看这里:word格式参考:http://www.ecma-international.org/publications/standards/Ecma-376.htm

即使有这个,我也没搞定样式问题,主要是有html的富文本内容,用这库完全不知道怎么做。

2.直接往返回流里写html,不过response的context-type设置为doc.

业务代码:

StringBuffer sb=new StringBuffer();

sb.append("");

...

sb.append("");

OutputStream out=response.getOutputStream();

out.write(sb.toString().getBytes());

out.flush();设置返回头:

String suffix=".doc";

String fileName="文件名";

String recommendedName;

//判断是否是IE11

Boolean flag = request.getHeader("User-Agent").indexOf("like Gecko") > 0;

if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") > 0 || flag) {

recommendedName = URLEncoder.encode(fileName, "UTF-8");//IE浏览器

} else {

//先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,

//这个文件名称用于浏览器的下载框中自动显示的文件名

recommendedName = new String(fileName.replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1");

}

response.setContentType("application/msword");

response.setHeader("Content-disposition", "attachment;filename=" + recommendedName + (suffix == null ? ".doc" : suffix));

OutputStream ouputStream = response.getOutputStream();

writeDoc(ouputStream,paperVo);

ouputStream.flush();

ouputStream.close();

这种方式在windows下的office word,wps都可以支持,但mac的pages不识别这个文件。

3.使用第三方模板库poi-tl

pom.xml引入:

com.deepoove

poi-tl

1.5.0

首先建一个.docx的模板文件,例:

java word生成_java生成Word文件的三种方式_第1张图片

这里的{{变量名}}直接可替换为代码里的字符串,“变量名"前面有"+"号表示此处由另一个模板文件生成,并且是数组形式的。

生成代码:

public void create(TextModel tm,String filePath) throws IOException {

tm.setChapters(new DocxRenderData(

new File("folder/doc/template/chapters_segment.docx"), tm.getChapterList()));

for(AttachSegment cs:tm.getChapterList()) {

cs.setQuestions(new DocxRenderData(

new File("folder/doc/template/question_segment.docx"), cs.getQuestionList()));

}

XWPFTemplate template = XWPFTemplate

.compile("folder/doc/template/text_template.docx").render(tm);

File file=new File(filePath);

if(file.exists()) {

//已存在文件,对其文件名进行"加1"方式重命名

File children[]=file.getParentFile().listFiles();

int nextSeq=1;

int max=-1;

for(File child:children) {

if(child.getName().contains("_")) {

String cName=child.getName();

String numStr=cName.substring(cName.lastIndexOf("_")+1,cName.lastIndexOf(".")).trim();

try {

Integer n=Integer.valueOf(numStr);

if(n>max) {

max=n;

}

}catch(Exception e) {

log.error("导出文件名错误,解析数据异常:"+filePath+ e.getMessage());

}

}

}

if(max!=-1) {

nextSeq=max+1;

}

int end=filePath.lastIndexOf(".");

file=new File(filePath.substring(0,end)+"_"+nextSeq+".docx");

}

FileOutputStream out = new FileOutputStream(file);

template.write(out);

template.close();

out.flush();

out.close();

}

这里有个换行问题需要注意,它比较显示显示效果。

1.以\n换行: office,wps正常显示,pages不换行

2.以\r\n换行:  office,pages(mac)正常显示,wps 会多显示一个空行

你可能感兴趣的:(java,word生成)