一、使用模板文件生成标题
1、创建模板文件
新建一个doc文件,如format.doc,创建标题,如标题1、标题2……
2、获得模板文档的整体样式
// 新建的word文档对象
XWPFDocument doc = new XWPFDocument();
// word整体样式
// 读取模板文档
XWPFDocument template = new XWPFDocument(new FileInputStream("D:\\test\\poi\\word\\format.docx"));
// 获得模板文档的整体样式
CTStyles wordStyles = template.getStyle();
// 获取新建文档对象的样式
XWPFStyles newStyles = doc.createStyles();
// 关键行// 修改设置文档样式为静态块中读取到的样式
newStyles.setStyles(wordStyles);
3、使用标题样式
// 标题1,1级大纲
XWPFParagraph para1 = doc.createParagraph();
// 关键行// 1级大纲
para1.setStyle("1");
XWPFRun run1 = para1.createRun();
// 标题内容
run1.setText("标题1");
// 标题2,2级大纲
XWPFParagraph para2 = doc.createParagraph();
// 关键行// 2级大纲
para2.setStyle("2");
XWPFRun run2 = para2.createRun();
// 标题内容
run2.setText("标题2");
// 正文
XWPFParagraph paraX = doc.createParagraph();
XWPFRun runX = paraX.createRun();
for(int i=0;i<100;i++) {
// 正文内容
runX.setText("正文\r\n");
}
// word写入到文件
FileOutputStream fos;
try {
fos = new FileOutputStream("D:\\test\\poi\\word\\test.docx");
doc.write(fos);
fos.close();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
4、结果展示
二、自定义标题
1、生成标题方法
/**
*
* @param doc
* @param styles
* @param strStyleId 标题id
* @param headingLevel 标题级别
* @param pointSize 字体大小(/2)
* @param hexColor 字体颜色
* @param typefaceName 字体名称(默认宋体)
*/
public void createHeadingStyle(XWPFDocument doc, XWPFStyles styles, String strStyleId,
int headingLevel, int pointSize, String hexColor, String typefaceName) {
//创建样式
CTStyle ctStyle = CTStyle.Factory.newInstance();
//设置id
ctStyle.setStyleId(strStyleId);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal(strStyleId);
ctStyle.setName(styleName);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
// 数字越低在格式栏中越突出
ctStyle.setUiPriority(indentNumber);
CTOnOff onoffnull = CTOnOff.Factory.newInstance();
ctStyle.setUnhideWhenUsed(onoffnull);
// 样式将显示在“格式”栏中
ctStyle.setQFormat(onoffnull);
// 样式定义给定级别的标题
CTPPr ppr = CTPPr.Factory.newInstance();
ppr.setOutlineLvl(indentNumber);
ctStyle.setPPr(ppr);
XWPFStyle style = new XWPFStyle(ctStyle);
CTHpsMeasure size = CTHpsMeasure.Factory.newInstance();
size.setVal(new BigInteger(String.valueOf(pointSize)));
CTHpsMeasure size2 = CTHpsMeasure.Factory.newInstance();
size2.setVal(new BigInteger(String.valueOf(pointSize)));
CTFonts fonts = CTFonts.Factory.newInstance();
if(typefaceName == null || typefaceName.equals("")) typefaceName = "宋体";
fonts.setAscii(typefaceName); //字体
CTRPr rpr = CTRPr.Factory.newInstance();
rpr.setRFonts(fonts);
rpr.setSz(size);
rpr.setSzCs(size2); //字体大小
CTColor color=CTColor.Factory.newInstance();
color.setVal(hexToBytes(hexColor));
rpr.setColor(color); //字体颜色
style.getCTStyle().setRPr(rpr);
// is a null op if already defined
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
public static byte[] hexToBytes(String hexString) {
HexBinaryAdapter adapter = new HexBinaryAdapter();
byte[] bytes = adapter.unmarshal(hexString);
return bytes;
}
2、调用生成标题方法
// 新建的word文档对象
XWPFDocument doc = new XWPFDocument();
// 获取新建文档对象的样式
XWPFStyles newStyles = doc.createStyles();
String heading1 = "My Heading 1";
docUtils.createHeadingStyle(doc, newStyles, heading1, 1, 45, "000000", "宋体");
XWPFParagraph para1 = doc.createParagraph();
para1.setStyle("My Heading 1");
XWPFRun run1 = para1.createRun();
run1.setText("My Heading 1");
// word写入到文件
FileOutputStream fos;
try {
fos = new FileOutputStream("D:\\test\\poi\\word\\test.docx");
doc.write(fos);
fos.close();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
3、结果展示
参考文章: