WordExport4.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package com;
  2. import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
  3. import org.apache.poi.xwpf.usermodel.*;
  4. import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
  5. import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
  6. import java.io.*;
  7. import java.math.BigInteger;
  8. /**
  9. * @Author :huZhiHao
  10. * @Date :Created in 2020/4/7 16:46
  11. * @Description: TODO
  12. * @Modified By:
  13. * @Version: v0.0.1
  14. */
  15. public class WordExport4 {
  16. // POI方案为word添加页眉
  17. public static void main(String[] args) throws IOException {
  18. File is = new File("E:/upload/苏州国家高新区产业用地预审办文单.docx");//文件路径
  19. FileInputStream fis = new FileInputStream(is);
  20. XWPFDocument docx = new XWPFDocument(fis);//文档对象
  21. createHeader(docx, null, null);
  22. OutputStream os = new FileOutputStream("E:/upload/Test__.docx");
  23. docx.write(os);//输出到本地
  24. }
  25. public static void createHeader(XWPFDocument doc, String orgFullName, String logoFilePath) {
  26. /*
  27. * 对页眉段落作处理,使公司logo图片在页眉左边,公司全称在页眉右边
  28. * */
  29. CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
  30. XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);
  31. XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
  32. XWPFParagraph paragraph = header.getParagraphArray(0);
  33. paragraph.setAlignment(ParagraphAlignment.LEFT);
  34. paragraph.setBorderBottom(Borders.THICK);
  35. CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  36. tabStop.setVal(STTabJc.RIGHT);
  37. int twipsPerInch = 1440;
  38. tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
  39. XWPFRun run = paragraph.createRun();
  40. setXWPFRunStyle(run, "新宋体", 10);
  41. /*
  42. * 根据公司logo在ftp上的路径获取到公司到图片字节流
  43. * 添加公司logo到页眉,logo在左边
  44. * */
  45. /*if (StringUtils.isNotEmptyOrNull(logoFilePath)) {
  46. String imgFile = FileUploadUtil.getLogoFilePath(logoFilePath);
  47. byte[] bs = FtpUtil.downloadFileToIo(imgFile);
  48. InputStream is = new ByteArrayInputStream(bs);
  49. XWPFPicture picture = run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU(80), Units.toEMU(45));
  50. String blipID = "";
  51. for(XWPFPictureData picturedata : header.getAllPackagePictures()) { //这段必须有,不然打开的logo图片不显示
  52. blipID = header.getRelationId(picturedata);
  53. }
  54. picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID);
  55. run.addTab();
  56. is.close();
  57. }*/
  58. /*
  59. * 添加字体页眉,公司全称
  60. * 公司全称在右边
  61. * */
  62. /*if (StringUtils.isNotEmptyOrNull(orgFullName)) {
  63. run = paragraph.createRun();
  64. run.setText(orgFullName);
  65. setXWPFRunStyle(run,"新宋体",10);
  66. }*/
  67. run = paragraph.createRun();
  68. run.setText("orgFullName");
  69. setXWPFRunStyle(run, "新宋体", 10);
  70. }
  71. public static void createFooter(XWPFDocument document, String telephone, String orgAddress) throws Exception {
  72. /*
  73. * 生成页脚段落
  74. * 给段落设置宽度为占满一行
  75. * 为公司地址和公司电话左对齐,页码右对齐创造条件
  76. * */
  77. CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
  78. XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
  79. XWPFFooter footer = headerFooterPolicy.createFooter(STHdrFtr.DEFAULT);
  80. XWPFParagraph paragraph = footer.getParagraphArray(0);
  81. paragraph.setAlignment(ParagraphAlignment.LEFT);
  82. paragraph.setVerticalAlignment(TextAlignment.CENTER);
  83. paragraph.setBorderTop(Borders.THICK);
  84. CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
  85. tabStop.setVal(STTabJc.RIGHT);
  86. int twipsPerInch = 1440;
  87. tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
  88. /*
  89. * 给段落创建元素
  90. * 设置元素字面为公司地址+公司电话
  91. * */
  92. XWPFRun run = paragraph.createRun();
  93. // run.setText((StringUtils.isNotEmptyOrNull(orgAddress) ? orgAddress : "") + (StringUtils.isNotEmptyOrNull(telephone) ? " " + telephone: ""));
  94. setXWPFRunStyle(run, "仿宋", 10);
  95. run.addTab();
  96. /*
  97. * 生成页码
  98. * 页码右对齐
  99. * */
  100. run = paragraph.createRun();
  101. run.setText("第");
  102. setXWPFRunStyle(run, "仿宋", 10);
  103. run = paragraph.createRun();
  104. CTFldChar fldChar = run.getCTR().addNewFldChar();
  105. fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
  106. run = paragraph.createRun();
  107. CTText ctText = run.getCTR().addNewInstrText();
  108. ctText.setStringValue("PAGE \\* MERGEFORMAT");
  109. ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
  110. setXWPFRunStyle(run, "仿宋", 10);
  111. fldChar = run.getCTR().addNewFldChar();
  112. fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
  113. run = paragraph.createRun();
  114. run.setText("页 总共");
  115. setXWPFRunStyle(run, "仿宋", 10);
  116. run = paragraph.createRun();
  117. fldChar = run.getCTR().addNewFldChar();
  118. fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
  119. run = paragraph.createRun();
  120. ctText = run.getCTR().addNewInstrText();
  121. ctText.setStringValue("NUMPAGES \\* MERGEFORMAT ");
  122. ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
  123. setXWPFRunStyle(run, "仿宋", 10);
  124. fldChar = run.getCTR().addNewFldChar();
  125. fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
  126. run = paragraph.createRun();
  127. run.setText("页");
  128. setXWPFRunStyle(run, "仿宋", 10);
  129. }
  130. /**
  131. * 设置页脚的字体样式
  132. *
  133. * @param r1 段落元素
  134. */
  135. private static void setXWPFRunStyle(XWPFRun r1, String font, int fontSize) {
  136. r1.setFontSize(fontSize);
  137. CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
  138. CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
  139. fonts.setAscii(font);
  140. fonts.setEastAsia(font);
  141. fonts.setHAnsi(font);
  142. }
  143. }