Java实现导出excel表格功能,大部分都会使用apache poi,apache poi API 地址
POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
代码:
git地址 有3.9jar包

package qs.test;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;/*** ClassName: SXSSFTest* @Description: TODO* @author qiaoshuai*/
public class SXSSFTest {public static void main(String[] args) throws IOException {// 创建基于stream的工作薄对象的SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,// exceeding rows will be// flushed to disk// SXSSFWorkbook wb = new SXSSFWorkbook();// wb.setCompressTempFiles(true); // temp files will be gzippedSheet sh = wb.createSheet();// 使用createRow将信息写在内存中。for (int rownum = 0; rownum < 1000; rownum++) {Row row = sh.createRow(rownum);for (int cellnum = 0; cellnum < 10; cellnum++) {Cell cell = row.createCell(cellnum);String address = new CellReference(cell).formatAsString();cell.setCellValue(address);}}// Rows with rownum < 900 are flushed and not accessible// 当使用getRow方法访问的时候,将内存中的信息刷新到硬盘中去。for (int rownum = 0; rownum < 900; rownum++) {System.out.println(sh.getRow(rownum));}// ther last 100 rows are still in memoryfor (int rownum = 900; rownum < 1000; rownum++) {System.out.println(sh.getRow(rownum));}// 写入文件中FileOutputStream out = new FileOutputStream("G://sxssf.xlsx");wb.write(out);// 关闭文件流对象out.close();System.out.println("基于流写入执行完毕!");}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

在此基础上再优化的方案是导出的Excel表格生成多个工作表即生成多个sheet。
代码:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;import com.common.DateFormatUtil;public class ExlUtil2 {/*** @param excelHeader*            表头信息* @param list*            要导出到excel的数据源,List类型* @param sheetName*            表名* @return*/public static ResponseEntity<byte[]> getDataStream(ExcelHeader excelHeader,List list, String sheetName) {LinkedHashMap<String, List> map = new LinkedHashMap<String, List>();List<String[]> headNames = new ArrayList<String[]>();List<String[]> fieldNames = new ArrayList<String[]>();String[] sheetNames = new String[100];//处理Excel生成多个工作表 //定义为每个工作表数据为50000条if (list.size() > 50000) {int k = (list.size() + 50000) / 50000;for (int i = 1; i <= k; i++) {if (i < k) {map.put(sheetName + i,list.subList((i - 1) * 50000, i * 50000));} else {map.put(sheetName + i,list.subList((i - 1) * 50000, list.size()));}headNames.add(excelHeader.getHeadNames().get(0));fieldNames.add(excelHeader.getFieldNames().get(0));sheetNames[i - 1] = sheetName;}} else {map.put(sheetName, list);headNames.add(excelHeader.getHeadNames().get(0));fieldNames.add(excelHeader.getFieldNames().get(0));sheetNames[0] = sheetName;}byte[] buffer = null;try {buffer = ExcelUtil2.output(headNames, fieldNames, sheetNames, map);} catch (IllegalArgumentException | IllegalAccessException| IOException e) {e.printStackTrace();}HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);/** try { sheetName=URLEncoder.encode(sheetName,"UTF8"); } catch* (UnsupportedEncodingException e) { e.printStackTrace(); }*/try {sheetName = new String(sheetName.getBytes("gbk"), "iso-8859-1");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}String fileGenerateTime = DateFormatUtil.toStr(new Date());headers.setContentDispositionFormData("attachment", sheetName+ fileGenerateTime + ".xlsx");return new ResponseEntity<byte[]>(buffer, headers, HttpStatus.CREATED);};}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

代码

java poi导出Excel表格超大数据量解决方案相关推荐

  1. excel导出java不完整_有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。...

    我在table变换excel之后发现合并的单元格不能显示全部边框,在网上找了半天解决方案,终于解决了.具体解决代码如下; /** * 设置合并单元格的边框样式 * * @param sheet 当前表 ...

  2. java poi导出Excel表格(动态表头)

    HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象Sheet sheet = xssfWorkbook.createSheet(); / ...

  3. java中poi导出Excel表格(前台流文件接收)

    java中poi导出Excel表格,前端以流的方式接收,而非直接生成文件再下载,解决多台服务器部署后,路径地址不统一导致的下载问题. 生成Excel示例图: 2.代码说明 ① 在上次的基础上增加了底部 ...

  4. java实现这个无表头空表格,《java程序导出excel表格是空白的没有数据?》 java怎么导入数据库...

    java程序导出excel表格是空白的没有数据? 看一下是否可以链接上数据库,或者查看一下链接的数据库是否有数据 java从数据库中导出excel poi 建议你使用pageoffice. java ...

  5. Java web项目利用POI导出EXCEL表格

    SSH2 POI导出EXCEL表格 1.首先导入poi的jar包 HSSFWorkbook :工作簿,代表一个excel的整个文档 HSSFSheet:工作表 HSSFRow :行 HSSFCell: ...

  6. easyexcel导出excel,大数据量100万以内分页查询zip格式导出

    easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...

  7. java 导入导出excel表格

    java 导入导出excel表格 业务上有需求上传excel表格并读取内容,本文记录一下该方法 表格导入 引入相应的工具包 <dependency><groupId>cn.af ...

  8. java poi对Excel表格进行单元行删除

    java poi对Excel表格进行单元行删除 前几天工作时,突然需要去使用POI 来对Excel 表格进行操作,其他的操作都都没什么问题,但是在需要删除某些单元行的时候碰到了一下小坑,记录下来,防止 ...

  9. Spring Boot poi 导出Excel表格、Txt到浏览器下载

    Spring Boot & poi 导出Excel表格.Txt到浏览器下载 原文链接:小回博客 文章目录 Spring Boot & poi 导出Excel表格.Txt到浏览器下载 一 ...

最新文章

  1. 机器学习基础-逻辑回归-09
  2. elasticsearch的cross_fields查询
  3. Performance Co-Pilot
  4. 【CodeForces - 266C】Below the Diagonal (递归,子问题,贪心模拟)
  5. Unity 检测物体是否在相机视野范围内
  6. 想悄悄的做渗透测试?这里的工具足够你用了
  7. ASP.NET Core 3.0 实战:构建多版本 API 接口
  8. 【C++】fill函数,fill与memset函数的区别
  9. 那些年开发中遇到的坑。。。
  10. [转载] numpy.exp,numpy.sqrt,np.power等函数的详细理解
  11. 和大家分享一下我最近的编程心得!!!
  12. tracepro杂散光分析例子_第二期青年矿床学家网络论坛(刘琰碳酸岩杂岩体型稀土矿;王小林CO2成矿效应)...
  13. 用CAJViewer识别图片文字
  14. python 计算众数、中位数、分位数、偏度、峰度
  15. 2021小白Python入门学习记录Day3(win10系统、Python3.9、使用Pycharm)python高级数据类型(字符串、列表、元组、字典、集合) 及其操作
  16. 知名卸载软件Revo Uninstaller Pro挑战Deep Freeze卸载动画视频教程
  17. 76.0.3809.100版本的谷歌浏览器对应能用的chromedriver版本
  18. LibreCAD环境配置
  19. python 批量下载财务数据_Python+Wind 批量下载上市公司年报 - Part 1/2
  20. 稳压二极管1N4733A使用方法

热门文章

  1. window.open的小问题
  2. Jupyter 中 ValueError: Duplicate names are not allowed.的问题解决
  3. ffmpeg+rtmp推流/拉流(十)
  4. Mac安装IDA后各版本android_server
  5. Ubuntu上: insufficient permissions for device解决
  6. C++多态虚函数/纯虚函数demo
  7. 解决Tensorflow使用CPU报错
  8. 深入剖析Android音频(三)AudioPolicyService
  9. 把复杂变简单,能产生颠覆的力量
  10. android之camera