@ApiOperation(value = "导出水位记录")
@GetMapping("/createFile")
public void createFile(HttpServletResponse response,
@RequestParam(value = "pustId")String pustId,
@RequestParam(value = "startDate")String startDate,
@RequestParam(value = "endDate")String endDate) throws IOException {
//创建文本对象
XWPFDocument docxDocument = new XWPFDocument();
List<FloodPustRunWaterVo> floodPustRunWaterVoList = floodPustRunWaterService.findFloodPustRunWater(pustId,startDate,endDate);
String year = startDate.substring(0, 4);
if (floodPustRunWaterVoList.size() > 0){
FloodPustRunWaterVo floodPustRunWaterVo = floodPustRunWaterVoList.get(0);
//切割list后在进行遍历,这样才能使每页都有表头和标题
List<List<FloodPustRunWaterVo>> lists = splitList(floodPustRunWaterVoList, 18);
for (List<FloodPustRunWaterVo> list : lists) {
//创建第一段落
XWPFParagraph firstParagraphX = docxDocument.createParagraph();
firstParagraphX.setAlignment(ParagraphAlignment.CENTER);
XWPFRun runTitle = firstParagraphX.createRun();
runTitle.setText("水位记录表");
runTitle.setBold(true);
runTitle.setFontSize(24);
runTitle.setFontFamily("宋体");
runTitle.addCarriageReturn();//回车键
runTitle.setKerning(30);
XWPFParagraph paragraphX = docxDocument.createParagraph();
paragraphX.setAlignment(ParagraphAlignment.CENTER);
XWPFRun runTitle2 = paragraphX.createRun();
String protectionZoneName = floodPustRunWaterVo.getProtectionZoneName();
protectionZoneName = StringUtils.isNotBlank(protectionZoneName) ? protectionZoneName: " ";
runTitle2.setText("***:"+protectionZoneName +" ***:"+floodPustRunWaterVo.getPustName()+" 年度:"+year+" 年");
runTitle2.setFontSize(14);
runTitle2.setFontFamily("宋体");
runTitle2.addCarriageReturn();//回车键
runTitle2.setKerning(30);
runTitle2.addCarriageReturn();//回车键
//创建表格 x行*x列(创建table 时,会有一个默认一行一列的表格)
//留出两行表头
XWPFTable table = docxDocument.createTable(2+list.size(),7);
//设置表格居中
CTJc jc = table.getCTTbl().getTblPr().getJc();
if(jc == null){
jc = table.getCTTbl().getTblPr().addNewJc();
}
jc.setVal(STJc.CENTER);
table.getCTTbl().getTblPr().setJc(jc);
// 设置表每列宽度 与没行高度,这里应该有批量设置的方法,但是我没找到
for (XWPFTableRow row : table.getRows()) {
row.setHeight(560);
List<XWPFTableCell> tableCells = row.getTableCells();
for (XWPFTableCell tableCell : tableCells) {
tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
CTTcPr cellPr = tableCell.getCTTc().addNewTcPr();
CTTblWidth cellw = cellPr.addNewTcW();
cellw.setType(STTblWidth.DXA);
//设置宽度
cellPr.addNewTcW().setW(BigInteger.valueOf(2700));
//表格文字居中
XWPFParagraph cellParagraph = tableCell.getParagraphArray(0);
cellParagraph.setAlignment(ParagraphAlignment.CENTER);
}
}
mergeCellsVertically(table,0,0,1,"日期");
mergeCellsVertically(table,1,0,1,"时刻");
mergeCellsHorizontal(table,0,2,4,"水位");
XWPFTableRow row2 = table.getRow(1);
row2.getCell(2).setText("***");
row2.getCell(3).setText("**");
row2.getCell(4).setText("***");
mergeCellsVertically(table,5,0,1,"记录员");
mergeCellsVertically(table,6,0,1,"备注");
//给表格填充文本
setTableText(table,list);
}
}
response.setContentType("application/vnd.ms-excel");
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("charset", "utf-8");
response.addHeader("Pragma", "no-cache");
String encodeName = URLEncoder.encode("hhh.doc", StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);
docxDocument.write(response.getOutputStream());
response.flushBuffer();
写入文本的方法
private void setTableText(XWPFTable table,List<FloodPustRunWaterVo> list) {
//获取第一个表格
for (int i = 0; i < list.size(); i++) {
XWPFTableRow row = table.getRow(i + 2);
row.getCell(0).setText(list.get(i).getRecordDate()!=null ? list.get(i).getRecordDate().toString():"");
row.getCell(1).setText(list.get(i).getRecordTime()!=null ? list.get(i).getRecordTime():"");
row.getCell(2).setText(list.get(i).getInletWater()!=null ? list.get(i).getInletWater().toString():"");
row.getCell(3).setText(list.get(i).getBeforePoolWater()!=null ? list.get(i).getBeforePoolWater().toString():"");
row.getCell(4).setText(list.get(i).getOutletWater()!=null ? list.get(i).getOutletWater().toString():"");
row.getCell(5).setText(list.get(i).getRecordPersonName()!=null ? list.get(i).getRecordPersonName().toString():"");
row.getCell(6).setText(list.get(i).getRemarks());
}
}
合并单元格的方法
/**
* @Description: 跨行合并
* table要合并单元格的表格
* col要合并哪一列的单元格
* fromRow从哪一行开始合并单元格
* toRow合并到哪一个行
*/
public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow,String date) {
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
XWPFTableCell cell = row.getCell(col);
if ( rowIndex == fromRow ) {
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
cell.setText(date);
} else {
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
cell.setText(date);
}
}
}
/**
* @Description: 跨列合并
* table要合并单元格的表格
* row要合并哪一行的单元格
* fromCell开始合并的单元格
* toCell合并到哪一个单元格
*/
public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell,String date) {
for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
if ( cellIndex == fromCell ) {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
cell.setText(date);
} else {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
cell.setText(date);
}
}
}
拆分list的方法
public static <T> List<List<T>> splitList(List<T> sourceList, int groupSize) {
int length = sourceList.size();
// 计算可以分成多少组
int num = (length + groupSize - 1) / groupSize;
List<List<T>> newList = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
// 开始位置
int fromIndex = i * groupSize;
// 结束位置
int toIndex = (i + 1) * groupSize < length ? (i + 1) * groupSize : length;
newList.add(sourceList.subList(fromIndex, toIndex));
}
return newList;
}
生成的word 文档样式