一 生成一百万条测试数据
生成一百万条测试数据
二 查询数据写入到excel
实现思路: 分页查询数据每1000条数据写入到一个sheet
@GetMapping ( "/test/export" )
public AjaxResult testExport ( ) throws FileNotFoundException {
long startTime = System . currentTimeMillis ( ) ;
int minId = appUserService. getMinId ( ) ;
int maxId = appUserService. getMaxId ( ) ;
int i = 0 ;
int limit = minId + 1000 ;
OutputStream fileOutputStream = new FileOutputStream ( new File ( "d://test.csv" ) ) ;
ExcelWriter excelWriter = EasyExcelFactory . write ( fileOutputStream) . build ( ) ;
while ( minId < maxId) {
Map < String , Integer > paramMap = new HashMap < > ( 16 ) ;
paramMap. put ( "minId" , minId) ;
paramMap. put ( "limit" , limit) ;
List < AppUserDTO > appUsers = appUserService. selectAppUserByLimit ( paramMap) ;
WriteSheet sheet = EasyExcel . writerSheet ( ) . sheetName ( "sheet" + i) . head ( AppUserDTO . class ) . build ( ) ;
excelWriter. write ( appUsers, sheet) ;
minId += 1000 ;
limit += 1000 ;
i ++ ;
}
excelWriter. finish ( ) ;
excelWriter. close ( ) ;
long endTime = System . currentTimeMillis ( ) ;
System . out. println ( "程序运行时间是======>" + ( endTime - startTime) ) ;
return AjaxResult . success ( ) ;
}
< select id= "getMinId" resultType= "java.lang.Integer" >
select MIN ( id) from app_user
< / select>
< select id= "getMaxId" resultType= "java.lang.Integer" >
select MAX ( id) from app_user
< / select>
< select id= "selectAppUserByLimit" resultType= "com.ruoyi.system.domain.dto.AppUserDTO" parameterType= "java.util.Map" >
< include refid= "selectAppUserVo" / >
where id >= #{ minId} and id & lt; #{ limit}
order by id asc
< / select>
三 总结
1 想过在写入文件的时候采用线程池多线程异步写入,结果一直报错空指针在问chatGPT后得到回答
2 表的字段并不复杂百万数据导出用40多秒可以接受,如果是多表字段复杂情况怎么做?
个人感觉 :可以单独新增一个数据表专门用作导出功能,还有有没有更好的方法可以一起讨论
3 我上面用的查询数据库的方法需要数据是自增主键如果是分库分表的情况就不适合了
4 如果是用户浏览器下载,可以现在服务器导出生成文件然后生成文件下载地址返回给用户,供用户下载
最后 一百万导出用时40多秒是不是还是有些慢,还有哪些更好的办法提高速度呢?用python pandas库效果会怎样呢,后面试试