《技术分享》java导出数据xlsx表
程序员文章站
2022-07-15 10:18:48
...
场景:在有些系统里可以看见有导出功能,导出一些数据,这时候可以把数据查出来,封装在一个list集合里返回到controller,然后实现导出。
也就是说 service层以下的代码实现和正常查询一样,把你需要导出的数据查出来,然后返回。我们可以在controller层来写导出功能代码。
1.首先在pom文件里添加一个插件
一开始不知道要添加这个插件,结果写完代码报错,报一个IOP…Exception,具体什么异常忘记了,哈哈。现在来看这个插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.6</version>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
2.来准备一个xlsx表格模板,放在静态资源resoucers下
当然这只是一种方法或者格式,还有其他表格类型,那样代码可能稍微有些不同
就这样 就可以了哈。
3.然后就需要去controller写一个接口。二话不说直接上代码
/**
* @Description: 水质水量导出
*@Param:
* @return:
* @Author: 毕
* @Date: 2020/1/8 14:26
*/
@ApiOperation(value = "水质水量导出",httpMethod="POST")
@PostMapping("/queryWaterQuantityListExport")
public void queryWaterQuantityListExport(
@ApiParam(name = "", value = "条件筛选") @RequestBody MonitorItemRelationDto monitorItemRelationDto){
//这里是调用方法普通查询得到的一个对象集合(现在要把这个导出)
List<MonitorItemRelationDto> monitorItemRelationDtos = waterQuantitysService.queryWaterQuantityList(monitorItemRelationDto);
//这里是开始写导出的功能了,开始看这
ServletOutputStream outputStream=null;
try {
//输入流来获取刚才你建的那个表格
InputStream inputStream = this.getClass().getResourceAsStream("/excel/WaterQuantitysExcel.xlsx");
//这个XSSFWorkbook 注意,看一下自己的文件是不是.xlsx,是才对应XSSFWorkbook
XSSFWorkbook xls = new XSSFWorkbook(inputStream);
//你文件里下边工作表页的名字
XSSFSheet sheet = xls.getSheet("Sheet1");
//导出行的样式
XSSFCellStyle cellStyle = xls.createCellStyle();
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
int row = 2;
//遍历需要导出的集合
for (MonitorItemRelationDto waterQuantity : monitorItemRelationDtos) {
//开始循环每行,给每列注入值
XSSFRow dataRow = sheet.createRow(row);
XSSFCell serialNumber = dataRow.createCell(0);
serialNumber.setCellValue(row);
XSSFCell MonitorObjectName = dataRow.createCell(1);
MonitorObjectName.setCellValue(waterQuantity.getMonitorObjectName());
XSSFCell LocationTypeName = dataRow.createCell(2);
LocationTypeName.setCellValue(waterQuantity.getLocationTypeName());
XSSFCell MonitorType = dataRow.createCell(3);
MonitorType.setCellValue(waterQuantity.getMonitorType());
XSSFCell ScadaPointItemDicCode = dataRow.createCell(4);
ScadaPointItemDicCode.setCellValue(waterQuantity.getScadaPointItemDicCode());
XSSFCell Value = dataRow.createCell(5);
Value.setCellValue(waterQuantity.getValue().toString());
XSSFCell DesignLowerValue = dataRow.createCell(6);
DesignLowerValue.setCellValue(waterQuantity.getDesignLowerValue().toString());
XSSFCell DesignUpperValue = dataRow.createCell(7);
DesignUpperValue.setCellValue(waterQuantity.getDesignUpperValue().toString());
XSSFCell monitorTime = dataRow.createCell(8);
monitorTime.setCellValue(DateUtil.DateFormat(waterQuantity.getMonitorTime()));
//上面定义的样式
serialNumber.setCellStyle(cellStyle);
MonitorObjectName.setCellStyle(cellStyle);
LocationTypeName.setCellStyle(cellStyle);
MonitorType.setCellStyle(cellStyle);
ScadaPointItemDicCode.setCellStyle(cellStyle);
Value.setCellStyle(cellStyle);
DesignLowerValue.setCellStyle(cellStyle);
DesignUpperValue.setCellStyle(cellStyle);
monitorTime.setCellStyle(cellStyle);
row++;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
//SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String fileName = "水质水量监测"+simpleDateFormat.format(new Date());
response.setContentType("application/vnd.ms-excel;charset=utf-8;fileName="+fileName+ ".xlsx");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
outputStream = response.getOutputStream();
xls.write(outputStream);
}catch (Exception e){
e.printStackTrace();
//return new ResultMoudel("error", "创建Excel失败");
}finally {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
//return new ResultMoudel("error", "IO流关闭异常");
}
}
}
到这里就可以了,开始测试…
我这用了swagger注解,可以在swagger上测试一下,下载导出的表格
文件名好像乱码了,尴尬,自己在看看吧,
哈哈哈哈哈,还算成功!!!