导出效果
1.pom文件
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0.M2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xerces/xercesImpl -->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.9.1</version>
</dependency>
对应数据实体类
@Data
public class QuestionnaireStatisticsVo {
private String type;
private String title;
private List<OptionsList> options;
@Data
public class OptionsList {
private String name;
private BigDecimal currentNum;
private Integer sum;
}
}
对应的测试
package com.hs.cn.text;
import cn.hutool.poi.word.TableUtil;
import cn.hutool.poi.word.Word07Writer;
import com.hs.cn.scheduledtask.vo.QuestionnaireStatisticsVo;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.;
import java.awt.;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.;
import java.util.List;
public class WordText {
public static void main(String[] args) throws IOException, InvalidFormatException {
QuestionnaireStatisticsVo vo = new QuestionnaireStatisticsVo();
vo.setTitle("您目前或者曾经是否有以下的明确诊断的疾病?");
vo.setType("1");
java.util.List<QuestionnaireStatisticsVo.OptionsList> optionsListList = new ArrayList<>();
QuestionnaireStatisticsVo.OptionsList optionsList = vo.new OptionsList();
optionsList.setName("高血压");
optionsList.setSum(6);
optionsList.setCurrentNum(BigDecimal.valueOf(40));
QuestionnaireStatisticsVo.OptionsList optionsList2 = vo.new OptionsList();
optionsList2.setName("糖尿病");
optionsList2.setSum(6);
optionsList2.setCurrentNum(BigDecimal.valueOf(40));
QuestionnaireStatisticsVo.OptionsList optionsList3 = vo.new OptionsList();
optionsList3.setName("冠心病");
optionsList3.setSum(6);
optionsList3.setCurrentNum(BigDecimal.valueOf(20));
QuestionnaireStatisticsVo.OptionsList optionsList4 = vo.new OptionsList();
optionsList4.setName("脑卒中");
optionsList4.setSum(6);
optionsList4.setCurrentNum(BigDecimal.valueOf(0));
QuestionnaireStatisticsVo.OptionsList optionsList5 = vo.new OptionsList();
optionsList5.setName("高脂血症");
optionsList5.setSum(6);
optionsList5.setCurrentNum(BigDecimal.valueOf(0));
QuestionnaireStatisticsVo.OptionsList optionsList6 = vo.new OptionsList();
optionsList6.setName("肥胖");
optionsList6.setSum(6);
optionsList6.setCurrentNum(BigDecimal.valueOf(0));
optionsListList.add(optionsList);
optionsListList.add(optionsList2);
optionsListList.add(optionsList3);
optionsListList.add(optionsList4);
optionsListList.add(optionsList5);
optionsListList.add(optionsList6);
vo.setOptions(optionsListList);
QuestionnaireStatisticsVo vo1 = new QuestionnaireStatisticsVo();
vo1.setTitle("您的直系亲属,目前或曾经是否有以下病史?");
vo1.setType("2");
java.util.List<QuestionnaireStatisticsVo.OptionsList> optionsListList1 = new ArrayList<>();
QuestionnaireStatisticsVo.OptionsList options = vo1.new OptionsList();
options.setName("高血压");
options.setSum(6);
options.setCurrentNum(BigDecimal.valueOf(40));
QuestionnaireStatisticsVo.OptionsList options2 = vo1.new OptionsList();
options2.setName("糖尿病");
options2.setSum(6);
options2.setCurrentNum(BigDecimal.valueOf(40));
QuestionnaireStatisticsVo.OptionsList options3 = vo1.new OptionsList();
options3.setName("冠心病");
options3.setSum(6);
options3.setCurrentNum(BigDecimal.valueOf(20));
QuestionnaireStatisticsVo.OptionsList options4 = vo1.new OptionsList();
options4.setName("脑卒中");
options4.setSum(6);
options4.setCurrentNum(BigDecimal.valueOf(0));
optionsListList1.add(options);
optionsListList1.add(options2);
optionsListList1.add(options3);
optionsListList1.add(options4);
vo1.setOptions(optionsListList1);
java.util.List<QuestionnaireStatisticsVo> implExcelList = new ArrayList<>();
implExcelList.add(vo);
implExcelList.add(vo1);
/*
* 行间距没有找到怎么设置的,用的换行????
* */
Word07Writer writer = new Word07Writer();
// 添加段落(标题)居中
writer.addText(ParagraphAlignment.CENTER,new Font("方正小标宋简体", Font.PLAIN, 15), "阶段性总检问卷");
for (int i = 0; i < implExcelList.size(); i++) {
writer.addText(new Font("宋体", Font.PLAIN, 10), i + 1 + "."
+ implExcelList.get(i).getTitle()
+"("+("1".equals(implExcelList.get(i).getType())?"单选题":"2".equals(implExcelList.get(i).getType())?"多选题":"填空题")+")");
writer.addText(new Font("宋体", Font.PLAIN, 8), "");
List<QuestionnaireStatisticsVo.OptionsList> voOptions = implExcelList.get(i).getOptions();
List<Map<String, Object>> tableMap = new ArrayList<>();
for (QuestionnaireStatisticsVo.OptionsList voOption : voOptions) {
Map<String, Object> map = new HashMap<>();
map.put("选项", voOption.getName());
map.put("小计", voOption.getSum());
map.put("比例", voOption.getCurrentNum()+"%");
tableMap.add(map);
}
TableUtil.createTable(writer.getDoc(), tableMap);
writer.addText(new Font("宋体", Font.PLAIN, 8), "");
}
XWPFDocument doc = writer.getDoc();
List<XWPFTable> tables = doc.getTables();//所有表格
for (int a = 0; a < tables.size(); a++) {
CTTblPr tblPr = tables.get(a).getCTTbl().getTblPr();
tblPr.getTblW().setType(STTblWidth.DXA);
tblPr.getTblW().setW(new BigInteger("7000"));
List<XWPFTableRow> rows = tables.get(a).getRows();//表格行属性
for (int i = 0; i < rows.size(); i++) {
XWPFTableRow xwpfTableRow = rows.get(i);
xwpfTableRow.setHeight(400);
List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();//单元格
for (int b = 0; b < tableCells.size(); b++) {
if(b==1 || b==2){
CTTc ctTc = tableCells.get(b).getCTTc();
CTTblWidth cellWidth = ctTc.addNewTcPr().addNewTcW();
cellWidth.setW(BigInteger.valueOf(1000));
CTTcPr pr = ctTc.addNewTcPr();
pr.addNewVAlign().setVal(STVerticalJc.CENTER);
ctTc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
}
if(i==0){
XWPFParagraph paragraphArray = tableCells.get(b).getParagraphArray(0);
List<XWPFRun> runs = paragraphArray.getRuns();
for (int j = 0; j < rows.size(); j++) {
runs.get(i).setFontSize(15);
runs.get(i).setBold(true);
if(j==1 || j==2){
runs.get(i).setVerticalAlignment("center");
}
}
}
}
}
}
// 写出到文件
OutputStream os = new FileOutputStream("C:\\Users\\John\\Desktop\\word测试001.doc");
//写入文件
doc.write(os);
doc.close();
// 关闭
writer.close();
}
}