欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《技术分享》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下
当然这只是一种方法或者格式,还有其他表格类型,那样代码可能稍微有些不同
《技术分享》java导出数据xlsx表《技术分享》java导出数据xlsx表就这样 就可以了哈。
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上测试一下,下载导出的表格
《技术分享》java导出数据xlsx表
文件名好像乱码了,尴尬,自己在看看吧,
《技术分享》java导出数据xlsx表哈哈哈哈哈,还算成功!!!