java导出功能(不确定行数列数数据的工具类)

java导出工具类(不确定行数列数数据)



前言

这是导出不确定行数列数数据的导出工具类,导出的文件直接在浏览器下载,直接全部复制使用,下面有导出的数据样式


一、导出的文件样式

表头不是固定的,可以根据需求,增加表头和与之对应的列数据,详情代码看下面

在这里插入图片描述

二、工具类的入参详情

这是表头
在这里插入图片描述
这是具体的每一行数据
在这里插入图片描述

三、具体代码(直接复制使用)

这个是业务层 使用可以copy到你的业务层方法内,然后进行修修改改

    public void export(ExportExcelDto dto, HttpServletResponse response) {

        XSSFWorkbook wb = null;
        try {
        	//假设这一是查询数据库拿到的数据
            List<MonitorDataImportQueryVo> vos = new ArrayList<>();

            if (CollectionUtils.isEmpty(vos)) return;
//          文件名根据时间戳生成
            String fileName = DateUtil.currentSeconds() + ".xlsx";
//          表头
            ArrayList<String> header = Lists.newArrayList(READ_HEAD1, READ_HEAD2, READ_HEAD3, READ_HEAD4);
            //时间的动态表头
            List<String> collect = vos.stream()
            	.map(e -> e.getMonitorTime())
            	.distinct()
            	.sorted()
            	.collect(Collectors.toList());
            //放到表头list后面	
            header.addAll(collect);
//          创建一个导出的数据list
            List<List> dataList = Lists.newArrayList();
            
//			根据查询的数据进行分组战后(根据你的业务去处理)
            Map<String, List<MonitorDataImportQueryVo>> map = vos.stream()
            	.collect(Collectors.groupingBy(e -> e.getMonitorNumber()));
//			遍历放入导出数据list里面(根据你的业务去处理)
            for (String s : keySet) {
                List<MonitorDataImportQueryVo> singleData = map.get(s);
                List<String> data = new ArrayList<>();
                data.add(singleData.get(0).getMonitorNumber());
                data.add(singleData.get(0).getMileage());
                data.add(singleData.get(0).getLink());
                data.add(singleData.get(0).getInitialValue());
                for (String thisValue : singleData.stream()
                	.map(e -> e.getThisValue())
                	.collect(Collectors.toList())) {
                    data.add(thisValue);
                }
                dataList.add(data);
            }
//			调用工具类
            wb = ExportExcelUtil.getXSSFWorkbook("监测数据", header, dataList);
            ExportExcelUtil.buildExcelDocument(fileName, wb, response);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != wb) {
                try {
                    wb.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

具体的工具类,无需修改,也可根据需求改改


import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Description: 导出工具类
 * @Param:
 * @return:
 * @Author: 杨永卓
 * @Date: 2021/9/26 15:47
 */
public class ExportExcelUtil {

    /**
     * @Description: [导出不确定行数列数监测数据]
     * @Param: [sheetName:sheet页名称, headers:第一行表头, data:list里面是每一行数据]
     * @return: org.apache.poi.XSSf.usermodel.XSSFWorkbook
     * @Author: 杨永卓
     * @Date: 2021/9/26 16:11
     */
    public static XSSFWorkbook getXSSFWorkbook(String sheetName, List<String> headers, List<List> dataList) {

        XSSFWorkbook workbook = new XSSFWorkbook();
        //新建工作区并赋名
        XSSFSheet sheet = workbook.createSheet(sheetName);
        XSSFRow row = sheet.createRow(0);

        //设置样式
        XSSFCellStyle cellStyle = workbook.createCellStyle();
        //靠左
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
        //垂直居中
        cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        //设置边框
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
        //还需要设置其他样式可在此添加

        //找出最大列数:对数据进行排序,获取最长那一行的size
        int max = 0;
        for (List l : dataList) {
            if (l.size() > max) {
                max = l.size();
            }
        }

        XSSFCell cell = null;
        //设置列名
        for (int i = 0; i < max; i++) {
            cell = row.createCell(i);
            cell.setCellValue(headers.get(i));
            cell.setCellStyle(cellStyle);
        }

        for (int i = 0; i < dataList.size(); i++) {
            row = sheet.createRow(i + 1);
            //以max作判断-->实现空的单元格也有边框
            for (int j = 0; j < max; j++) {
                cell = row.createCell(j);
                cell.setCellStyle(cellStyle);
                //防止下标越界
                if (j < dataList.get(i).size()) {
                    //单元格数据类型可自行改变,我这里全部字符串化了
                    cell.setCellValue(dataList.get(i).get(j).toString());
                }
            }
        }

        //列宽自适应
        for (int columnNum = 0; columnNum <= max; columnNum++) {
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                XSSFRow currentRow;
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }
                if (currentRow.getCell(columnNum) != null) {
                    XSSFCell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                        int length = currentCell.getStringCellValue().getBytes().length;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            sheet.setColumnWidth(columnNum, columnWidth * 256);
        }
        return workbook;
    }
    
	/**
    * @Description: [导出到浏览器]
    * @Param: [fileName, wb, response]
    * @return: void
    *
    * @Author: 杨永卓
    * @Date: 2021/9/26 15:47
    */
    public static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response) {
        try {
//            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            // 定义输出类型
            response.setContentType("application/octet-stream");
            // 可自行定义编码格式
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            //清除jsp编译html文件的空白,防止excel出现空行
            response.flushBuffer();
            //写出
            wb.write(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}



总结:仰天大笑出门去,我辈岂是蓬蒿人

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT行业小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值