Java·Excel导出百万级数据
POI依赖介绍
excel对行列的限制
| excel2003 | 65536 | 256|
| excel2007 | 1048576 | 16384 |
1. Excel2003格式(java对象使用HSSFWorkbook
)
Excel2003支持每个工作表中最多有 65536 行
和 256列
。对于工作表能够支持的最大个数,受CPU反应速度和内存大小影响。
采用常用导出方式导出数据时,需要注意的是Excel 2003行数和列数的限制。常用导出方式中的POI支持该格式的只有HSSF包
,当导出数据量大于一页的最大行数(65536)时,可采取分页的形式进行存储。
2. Excel2007格式(java对象使用SXSSFWorkbook
)
Excel 2007是Excel 2003的升级版,Excel 2007支持每个工作表中最多有 1,048,576 行
和16,384 列
。采用常用导出方式导出数据时,需要注意的是Excel 2007行数和列数的限制,常用导出方式支持该格式的只有XSSF包,包含SXSSF扩展包,并且仅有SXSSF支持大数据。
CSV格式介绍
CSV没有最大行数的限制,使用excel打开时会限制显示一百万行多点
CSV是一种通用的、相对简单的文件格式,广泛的应用在程序之间转移表格数据。
它通常具有以下特征:
1)纯文本,可以使用Excel和文本编辑器打开;
2)每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可 以包括可选的空格);
3)常用导出方式不会引起内存溢出问题。
常用导出方式推荐:1
JXL依赖介绍
1. JXL介绍
JXL是一个开源的Java Excel API项目。它能作为Java Excel API的一个共同的支持库,是因为它的基本功能是可创建,读取和写入电子表格。基本特征如下:
1)生成Excel文件
2)从工作簿和电子表格导入数据
3)获得行和列的总数
此方式对中文支持很好,不会出现乱码情况,支持单元格的常用操作,满足一般需求,该方式在写入效率上优于POI方式。
需要注意:JXL只支持xls档案格式,并且处理的数据量非常有限。
使用依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!---myBatis整合springboot框架起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 使用poi 导出excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
</dependency>
<!-- 使用jxl excel导出-->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
</dependencies>
上下文配置
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mm?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
# 开启驼峰命名,不然数据库序列化时查询的数据会为null值
mybatis.configuration.map-underscore-to-camel-case=true
Excel2003格式导出
定义接口类
@Mapper
public interface QyjsdetaMapper {
@Select("select id, account_id ,external_id from table_name")
public List<QyjsdetaMode> qyjs();
}
# 或 (使用传参的形式)
@Mapper
public interface QyjsdetaMapper {
@Select("select id, account_id, external_id from table_name limit #{id}")
public List<QyjsdetaMode> qyjs(int id);
}
实体类对象:用来序列化接受数据库中的数据
public class QyjsdetaMode{
public String id ;
public String accountId ;
public String externalId ;
省略了get、set方法
}
测试数据库表是否可以正常打印
@RestController
public class tableController {
@Autowired
public QyjsdetaMapper table;
@RequestMapping(value = "/mm", method = RequestMethod.GET)
public List<QyjsdetaMode> Qust2(int id ) {
List<QyjsdetaMode> dd = table.qyjs(id);
System.out.println("=====打印===");
System.out.println("=======================helloworld=========================="+"\n" );
return dd ;
}
}
**测试打印数据库数据100行**
http://localhost:8080/mm?id=100
导出Excel实现
@Controller
@RequestMapping("/")
public class QyjsExceldown {
@Resource
public QyjsdetaMapper qyjsdetaMpper;
@RequestMapping(value = "/dd", method = RequestMethod.GET)
public void downloadAllClassmate(HttpServletResponse response) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();//创建HSSFWorkbook对象, excel的文档对象
HSSFSheet sheet = workbook.createSheet("信息表"); //excel的表单
HSSFSheet sheet2 = workbook.createSheet("信息表2"); //excel的表单
List<QyjsdetaMode> classmateList = qyjsdetaMpper.qyjs();
System.out.println