Java导出Excel百万条数据表格数据实现分页easyexcel方法和apach poi方法

news/2024/7/21 7:41:37 标签: java, excel, 开发语言

excel_0">注意: 此导出excel样式只是简单设置而已

1、创建实体类 ExcelModel 导出数据库对应实体数据列表

简单样式设计

MAVEN仓库依赖或者下载依赖jar包

javascript"><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

javascript">@Data
@ContentRowHeight(21)   //行高
@HeadRowHeight(30)  //excel内头高度
@ColumnWidth(15)  //每列宽度

public class ExcelModel {
	@ExcelIgnore		//忽略此表头内容
    private Integer id;// 主键ID
    @ExcelProperty(value = "姓名") //表头内容
    private String name;// 姓名
	@ExcelProperty(value = "年龄")
    private Integer age;// age
	@ExcelProperty(value = "地址")
    private String address;// 地址
	@ExcelProperty(value = "性别")
    private String sex;// 性别
    @ExcelIgnore	
	private Integer pageStartIndex;//起始索引 查询索引位置
	@ExcelIgnore	
    private Integer pageSize;//每页数量  相当于数据库内数据步长
}

1.1创建mapper接口

@Param 选择 引入 import org.apache.ibatis.annotations.Param;

javascript">	Integer selecttxxxCount(@Param("model")ExcelModel  model);
	List<ExcelModel> selectData(@Param("model")ExcelModel   model);	

1.2创建mapper.xml

javascript">	<select id="selecttxxxCount" resultType="Integer">
		select  *
		from table_name  
		<where>
		动态sql筛选条件
		</where>
	</select>	


	<select id="selectData" resultType="ExcelModel">
		select  *
		from table_name  
		<where>
		动态sql筛选条件
		</where>
		<if test="model.pageStartIndex!=null and model.pageSize!=null">
	limit #{model.pageStartIndex},#{model.pageSize}
	</select>	

2、创建 services 实现类

客户端是下载的作用,数据的处理是在服务器端进行的

javascript">xxxClass    类   作用接收前端传递来的对应数据参数 比如 页码、每页大小 其他筛选条件等
xxxentity   类对应的实例
xxxMapper   对应的mapper文件名
//响应输出流在下方使用了  这个就不用了
ServletOutputStream outputStream = response.getOutputStream();

2.1、方法1==》核心代码 分页写入–适应数据量百万

javascript">select * from table_name  limit  startIndex,step
举例  select * from table_name  limit 15,1000

xxxentity.setPageStartIndex(i * page_size);   ---对应起始索引
xxxentity.setPageSize(page_size);			--对应查询的记录行数
javascript">//核心代码
    public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");
        //查询总条数
        List<Integer> total = xxxMapper.selecttxxxCount(xxxentity);       
        //计算页数
        // 定义每个sheet数据数量
        int page_size = 3000;
        //计算将分多少页
        int export_pagenumber = total % page_size > 0 ? total / page_size + 1 : total / page_size;
		//创建输出流 
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ExcelModel.class).build();
        for (int i = 0; i < export_pagenumber; i++) {
            WriteSheet writeSheet = new WriteSheet();	//创建工作簿
            writeSheet.setSheetName("第"+(i+1)+"页");
            xxxentity.setPageStartIndex(i * page_size);  //某处起始索引  (固定步长行数*第几个i)
            xxxentity.setPageSize(page_size);//从起始索引开始对应的截取数据 step 步长行数
            List<ExcelModel> dataList = xxxMapper.selectData(xxxentity);
            //每循环一次  查出的数据进行写入一个sheet 工作簿
            excelWriter.write(dataList,writeSheet);
        }
        //循环结束   
        excelWriter.finish();//整个Excel文件写数据结束
        response.flushBuffer();//强制刷新
    }

2.2、方法2==》一次性写入 --适应数量1万左右

javascript">//核心代码
    public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");
  
	//一次性查询数据
		List<ExcelModel> dataList= xxxMapper.selectData(xxxentity);
        //循环结束   
       EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);
    }

2.3、代码误区 ----其实这种方法本质是一次性写入 --错误

导致内存溢出(OOM)

javascript"> List<ExcelModel> datalist = new ArrayList<>();
       for (int i = 0; i < export_pagenumber; i++) {
            xxxentity.setPageStartIndex(i * page_size);
            xxxentity.setPageSize(page_size);
            List<ExcelModel> list= xxxMapper.selectData(xxxentity);
			datalist.addAll(list.subList(0,list.size()));//将查询出的集合集中收集在datalist
        }
EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);

3、性能比较

在这里插入图片描述

excel_151">4、导出excel

在这里插入图片描述

5、oom 内存溢出

6、sax模式

javascript">SAX解析器读取输入文档并在处理文档时将每个事件推给文档处理器(MyContentHandler)。与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。另外,你无需像在DOM中那样为所有节点创建对象。最后,SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。

7、apach poi 有机会说 --适应小数据量


http://www.niftyadmin.cn/n/160373.html

相关文章

总结:Grafana

一、介绍Grafana 是一个开源的数据可视化工具&#xff0c;它可以帮助用户将数据源中的数据进行图形化展示和实时监控&#xff0c;以便于用户能够更加直观地理解数据。Grafana 支持多种数据源&#xff0c;包括 Graphite、Elasticsearch、InfluxDB、Prometheus 等&#xff0c;也支…

js array 转字符串 和 字符串拼接哪种效率高

在 JavaScript 中&#xff0c;join() 方法通常比字符串拼接更高效&#xff0c;因为它避免了字符串拼接时不断创建新字符串的问题。每次进行字符串拼接时&#xff0c;JavaScript 都需要创建一个新的字符串&#xff0c;并将原始字符串和要添加的内容都复制到新的字符串中&#xf…

【SpringBoot】Spring JDBC JTA实现分布式事务

一、举例说明分布式事务 在上一节代码的的Service层做一下测试&#xff0c;人为制造一个被除数为0的异常。然后对该服务对应的Controller方法发送请求。&#xff08;postman&#xff09; Resource private JdbcTemplate primaryJdbcTemplate; Resource private JdbcTemplate …

光伏并网逆变器学习1-simulink

分为三个部分&#xff1a;光伏电池 、 boostmppt 、 并网逆变 光伏电池&#xff1a; 其内部数学模型&#xff1a; 内部参数&#xff1a;短路电流、最大电流、开路电压、最大电压 外部参数&#xff1a;光照强度、温度 输出&#xff1a;功率以及电压、电流关系式 Boost部分&am…

云主机如何实现资源动态扩容?

随着信息技术的快速发展&#xff0c;越来越多的企业开始采用云计算技术来部署应用程序和存储数据&#xff0c;以提高业务效率和降低成本。然而&#xff0c;不同的业务场景和用户需求对云主机资源的使用和扩容提出了更高的要求&#xff0c;因此&#xff0c;了解云主机如何实现资…

【Java学习笔记】30.Java 数据结构及集合框架

前言 本章介绍Java的数据结构和集合框架。 Java 数据结构 Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类&#xff1a; 枚举&#xff08;Enumeration&#xff09;位集合&#xff08;BitSet&#xff09;向量&#xff08;Vector&#xff09;栈…

开发环境配置

1.下载jdk1.8版本并安装 链接&#xff1a;https://pan.baidu.com/s/1gT2qvyno35ULWVcLyACcsw 提取码&#xff1a;21ak 安装教程参考&#xff1a;(30条消息) Java JDK 1.8版本安装教程&#xff08;史上最详&#xff09;_jdk1.8安装教程_五月CG的博客-CSDN博客 2.下载mysql5.7…

ssh: connect to host localhost port 22: Connection refused解决方法

在通过ssh远程连接树莓派时遇到以下问题ssh: connect to host 192.168.88.88 port 22: Connection refused1.检查是否安装了openssh-server 如果出现了sshd&#xff0c;则说明安装了&#xff0c;反之则没安装。ps -e|grep ssh既然问题找到了&#xff0c;我们就开始用命令来安装…