Java poi Excel导出文件,Java poi 分批次导出大批量数据
================================
©Copyright 蕃薯耀 2018年6月26日
http://fanshuyao.iteye.com/
一、问题描述:
1、当使用WorkbookFactory.create 创建Excel时,其实创建的文档为Excel2003版的,最大容纳65536行数据,超出这个行数就是发生溢出。
WorkbookFactory.create(...);
2、当数据量时,直接从数据库查询出来,内存不够也会溢出。
二、解决方案:
1、解决Excel2003行数溢出,使用XSSFWorkbook对象创建2007版的Excel,能容纳104万行数据。
具体如下:
Excel2003版最大行数是65536,Excel2007最大行数是1048576
Excel2003版最大列数是256,Excel2007最大列数是16384
XSSFWorkbook xSSFWorkbook = new XSSFWorkbook(new FileInputStream(excelTemplatePath));//使用模板文件
2、直接从数据库查询大批量数据导致内存溢出,可以使用分批次的方式查询数据,避免内存一下子暴掉。如要导出数据库100万条数据,每次取1万条,这样分100次取,每次取的数量自己可以定义,保证内存不溢出。
具体例子和代码:
/** * 导出excel文件 * @param request * @param response * @throws Exception */ public void exportPlaceNameQueryExcelFile(HttpServletRequest request,HttpServletResponse response){ Map<String, Object> map = new HashMap<String, Object>();; FileOutputStream fileOutputStream = null; try { Row row = parseRequestParametersToRow(request); String projectPath = getRealPath(request); String excelTemplatePath = projectPath + File.separator + "template" + File.separator + "name" + File.separator + "exportPlaceNameQueryExcelFile.xlsx"; File excelTemplateFile = new File(excelTemplatePath);//模板文件 File destFile = this.createDestExcelFile(request, excelTemplateFile);//目标文件 fileOutputStream = new FileOutputStream(destFile); map.put("absoluteFilePath", destFile.getAbsolutePath()); map.put("fileName", destFile.getName()); int count = getPlaceNameQueryDelegate().getPnPlaceNameCount(row);//获取Excel导出的总数据量,根据数量判断是否进行分批次导出 int pageSize = 1000 * 5;//每次查询的数据量 int startRow = 2;//模板前2行是模板标题,excel行数是从0开始的,除去2行模板标题,此处设置成2 XSSFWorkbook xSSFWorkbook = new XSSFWorkbook(new FileInputStream(excelTemplatePath));//使用模板文件 //Excel2003版最大行数是65536,Excel2007最大行数是1048576 //Excel2003版最大列数是256,Excel2007最大列数是16384 SXSSFWorkbook workbook = new SXSSFWorkbook(xSSFWorkbook, 100);//使用SXSSFWorkbook避免Excel数据超出65536行时报错 //Workbook b = WorkbookFactory.create(destFile);//超出65536行时报错 Sheet sheet = workbook.getSheetAt(0); List<Row> rows = null; if(count > pageSize){//当数量大时,采用分批次获取数据 int page = (count % pageSize == 0) ? (count / pageSize) : (count / pageSize + 1); for(int i=1; i<=page; i++){ row.addColumn("pageNumber", i); row.addColumn("pageSize", pageSize); rows = getPlaceNameQueryDelegate().getAllPlaceNames(row); startRow = this.setSheet(sheet, startRow, rows);//此处要注意回写startRow供下次循环使用 } }else{ rows = getPlaceNameQueryDelegate().getAllPlaceNames(row); startRow = this.setSheet(sheet, startRow, rows); } workbook.write(fileOutputStream); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fileOutputStream != null){ fileOutputStream.close(); } writeJson(response, JsonUtils.toJson(map)); } catch (Exception e) { e.printStackTrace(); } } }
private File createDestExcelFile(HttpServletRequest request, File excelTemplateFile){ try { String destFileName = UUID.randomUUID().toString(); Properties prop = PropertiesUtils.read("placeName.properties"); String destDir = prop.getProperty("destDirForPlaceNameQuery"); File destFileDir = new File(destDir); if(!destFileDir.exists()){ destFileDir.mkdirs(); } String absoluteFilePath = excelTemplateFile.getAbsolutePath(); String suffix = absoluteFilePath.substring(absoluteFilePath.lastIndexOf(".")); File destFile = new File(destDir + destFileName + suffix); FileUtils.copyFile(excelTemplateFile, destFile); return destFile; } catch (Exception e) { e.printStackTrace(); } return null; }
private void writeToSheet(Sheet sheet, int startRow, int startCell, String value){ org.apache.poi.ss.usermodel.Row poiRow = sheet.getRow(startRow); if(poiRow == null){ poiRow = sheet.createRow(startRow); } Cell cell = poiRow.getCell(startCell); if(cell == null){ cell = poiRow.createCell(startCell); } cell.setCellValue(value); }
/** * 根据Excel对象插入数据后,返回可以插入数据下一行的行数,startRow * @param workbook * @param startRow * @param rows * @return int */ private int setSheet(Sheet sheet, int startRow, List<Row> rows){ if(rows != null && rows.size() > 0){ if(startRow < 0){ startRow = sheet.getLastRowNum(); } for (Row row : rows) { int startCell = 0; this.writeToSheet(sheet, startRow, startCell++, row.getString("pn_code")); this.writeToSheet(sheet, startRow, startCell++, row.getString("standard_name"));//地名(standard_name) this.writeToSheet(sheet, startRow, startCell++, row.getString("pinyin"));//拼音(pinyin) this.writeToSheet(sheet, startRow, startCell++, row.getString("tree_path"));//地名类别(tree_path) String statusText = row.getString("status"); if(statusText.equals("1")){ statusText = "有效"; }else if(statusText.equals("0")){ statusText = "无效"; }else if(statusText.equals("2")){ statusText = "审批中"; } this.writeToSheet(sheet, startRow, startCell++, statusText);//状态(status) //额外属性 String type = row.getString("type"); if(!StringUtils.isBlank(type)){ type = type.trim(); if("建筑物".equals(type)){ //紧接着基础信息,startCell不用加 this.setBuildingProperties(sheet, startRow, startCell, row);//建筑物 }else if("道路".equals(type)){ startCell += 10;//除去建筑物的10个属性 this.setRoadProperties(sheet, startRow, startCell, row); }else if("桥梁".equals(type)){ startCell += 18;//除去建筑物、道路的18个属性 this.setBridgeProperties(sheet, startRow, startCell, row); }else if("公园".equals(type)){ startCell += 28;//除去建筑物、道路、桥梁的28个属性 this.setPartProperties(sheet, startRow, startCell, row); }else if("广场".equals(type)){ startCell += 37;//除去建筑物、道路、桥梁、公园的37个属性 this.setSquareProperties(sheet, startRow, startCell, row); }else if("隧道".equals(type)){ startCell += 46;//除去建筑物、道路、桥梁、公园、广场的46个属性 this.setTunnelProperties(sheet, startRow, startCell, row); } } startRow ++;//最后行号加1,必须有,且在最后 } } return startRow; }
private void setBuildingProperties(Sheet sheet, int startRow, int startCell, Row row){ try { Row dataRow = getPlaceNameQueryDelegate().getBuilding(row); if(dataRow != null){ this.writeToSheet(sheet, startRow, startCell++, dataRow.getString("building_func")); this.writeToSheet(sheet, startRow, startCell++, dataRow.getString("start_date")); …… …… } } catch (Exception e) { e.printStackTrace(); } }
private void setRoadProperties(Sheet sheet, int startRow, int startCell, Row row){ try { Row dataRow = getPlaceNameQueryDelegate().getRoad(row); if(dataRow != null){ this.writeToSheet(sheet, startRow, startCell++, dataRow.getString("starting_point")); …… } } catch (Exception e) { e.printStackTrace(); } }
相关推荐
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。
本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache....
Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出...
然后,使用Java POI将数据写入到Excel文件中,并将其下载到客户端。 知识点详解 1. 使用Java POI读写Excel文件 Java POI提供了多种方式来读写Excel文件,包括XSSF、HSSF和SXSSF等。其中,XSSF用于读写xlsx格式的...
Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)...理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java项目中,无论是数据导出、报告生成还是数据分析。
概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...
在java web系统应用中我们经常会用到大批量数据的导出,动辄就上几十万几百万的数据让我们的程序感觉...java中使用poi导出Excel大批量数据到客户端 存在两个导出方法:存在一个分批量导出ZIP文件,一个导出exel文件
Java导出Excel是Java开发中常见的需求,尤其是在数据处理和报表生成方面。Apache POI库是Java领域中广泛使用的工具,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇文章将深入讲解...
java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。
在Java中,如果你需要导出Excel文件,Java POI是一个非常实用的工具。下面将详细介绍如何使用Java POI来实现Excel的导出。 1. **引入依赖** 在Java项目中使用POI,首先需要在项目的构建文件(如Maven的pom.xml或...
在Java编程环境中,Apache POI库是一个非常流行的API,它允许开发者读取、创建和修改Microsoft Office格式的文件,...通过以上步骤,你可以熟练地在Java环境中使用Apache POI库导出Excel文件,满足各种数据导出需求。
本文将深入探讨如何使用POI库来实现Excel文件的导出,以及如何将图片URL转换为图片文件并与其他文件一起打包成压缩包。 首先,让我们了解一下Apache POI。POI是Java开发者的开源API,它允许程序创建、修改和显示...
Apache POI是一个强大的库,它允许开发者使用Java来读取、写入和修改Microsoft Office格式的文件,包括Excel(.xlsx, .xls)。本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,...
通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...
Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)
前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!
### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...
在Java开发中,我们经常使用POI库来处理Excel数据,如读取、写入和修改Excel文件。本篇文章将详细介绍如何使用JAVA POI导出Excel。 一、准备工作 在开始编写代码前,确保已经添加了Apache POI库到项目的依赖管理中...
这篇博客"java使用POI Excel模板导出数据"探讨了如何利用POI库在Java中创建Excel模板并填充数据。下面将详细介绍这个过程以及相关知识点。 首先,我们需要理解Apache POI的基本概念。POI是Apache软件基金会的一个...