POI 生成word各类问题(设置中文字体,重复图片插入等怪问题......)

一、设置字体(中文)

// 创建 段落
XWPFParagraph xp = j.addParagraph();
// 创建 XWPFRun 对象
XWPFRun title = xp.createRun();

// 普通设置字体方法
title.setFontFamily("仿宋");

// ----实测以上方法只是改了ASCII码的字体,并没有什么软用
// 以下是研究出来改中文字体的

// 新建 字体配置对象
CTFonts font = title.getCTR().addNewRPr().addNewRFonts();
//中文
font.setEastAsia("黑体");
// ASCII
font.setAscii("仿宋");    //上一种方法setFontFamily() 其实只调用了这个方法
// 其他字符(有想法可以自己去研究一下是什么字符的):
font.setCs("仿宋");
font.setHAnsi("楷体");

 二、插入重复图片时只获取已存在图id,而无法添加的问题

  稍微描述一下这个问题吧,就是要插入一个相同的图片时,会遇到POI去读取原先的这个图片id再获取,而不是去新添加这个图片,导致批量插入图片时出现图片紊乱和错误。

/* 先说明一下这个问题的产生原因
 * 该问题是由于POI源码中的
 * XWPFDocument 类的图片添加方法
 * .addPictureData(byte[] pictureData, int format)
 * 在处理图片插入时判断已存在图片的方法:
 * 当重复的图片需要插入时,会直接调用原图id
 * 而不会再往 pictures 列表里再插入,那列表的长度自然也就不会改变
 */
解决办法,这里就文字说明一下。
1.把你 写入 word的工具类继承 POI 的 XWPFDocument 类,这样在写方法时会比较方便,因为 XWPFDocument 类的很多属性都是 protect 的。
2.去看改方法的源码,找到添加图片数据的代码,改写成你想要的逻辑。
3.调用你自写的 XWPFDocument 添加图片数据的方法进行添加图片。

之前研究的。。。有时间再记录吧

  以上方法是通过研究源码得到,学习中请多研究源码。。。

原文地址:https://www.cnblogs.com/AardWolf/p/11268068.html