使用Java编写导出不确定行数列数数据的工具类

 更新时间:2024年03月15日 16:14:17   作者:IT行业小趴菜  
这篇文章主要为大家详细介绍了如何使用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();
        }
    }

}

到此这篇关于使用Java编写导出不确定行数列数数据的工具类的文章就介绍到这了,更多相关Java导出数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何实现数字逆序

    Java如何实现数字逆序

    这篇文章主要介绍了Java如何实现数字逆序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot+OCR实现PDF内容识别的示例代码

    SpringBoot+OCR实现PDF内容识别的示例代码

    在SpringBoot中,您可以结合OCR库来实现对PDF文件内容的识别和提取,本文就来介绍一下如何使用 Tesseract 和 pdf2image 对 PDF 文件进行OCR识别和提取,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 简单了解springboot eureka交流机制

    简单了解springboot eureka交流机制

    这篇文章主要介绍了简单了解springboot eureka交流机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java多线程之同步工具类Exchanger

    Java多线程之同步工具类Exchanger

    这篇文章主要介绍了Java多线程之同步工具类Exchanger,Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,下面来看看具体内容吧
    2021-10-10
  • Java 高并发编程之最实用的任务执行架构设计建议收藏

    Java 高并发编程之最实用的任务执行架构设计建议收藏

    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求,高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等
    2021-10-10
  • Java使用lombok消除冗余代码的方法步骤

    Java使用lombok消除冗余代码的方法步骤

    这篇文章主要介绍了Java使用lombok消除冗余代码的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot项目微信云托管入门部署实践

    SpringBoot项目微信云托管入门部署实践

    本文主要介绍了SpringBoot项目微信云托管入门部署实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java RocketMQ快速入门基础知识

    java RocketMQ快速入门基础知识

    这篇文章主要介绍了java RocketMQ快速入门基础知识,所以RocketMQ是站在巨人的肩膀上(kafka),又对其进行了优化让其更满足互联网公司的特点。它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。,需要的朋友可以参考下
    2019-06-06
  • SpringBoot使用Validation进行参数校验的示例详解

    SpringBoot使用Validation进行参数校验的示例详解

    在 SpringBoot项目开发中,有一个观点是不要相信前端传入的参数,因为你不知道用户是怎么操作我们接口的,所以在后端也需要对参数进行校验,这篇文章主要讲讲我们项目中最常使用的验证方案
    2023-05-05
  • Java 集合去重的三种方法

    Java 集合去重的三种方法

    本主要介绍了Java 集合去重的三种方法,包含HashSet,Stream API和手动遍历并使用Map三种,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07

最新评论