`

Java poi Excel导出文件,Java poi 分批次导出大批量数据

阅读更多

 

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();
    }
}
 

Excel文件下载见:

http://fanshuyao.iteye.com/blog/2425604 

 

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!) 


    

================================

©Copyright 蕃薯耀 2018年6月26日

http://fanshuyao.iteye.com/

1
0
分享到:
评论
1 楼 蕃薯耀 2018-07-03  
Java poi Excel导出文件,Java poi 导出Excel文件,Java poi 分批次导出数据,Java Poi内存溢出

===========
蕃薯耀

相关推荐

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。

    JAVA poi 做EXCEL导出(包含图片) 完整版

    本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;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导入导出...

    java poi导出图片到excel示例代码

    然后,使用Java POI将数据写入到Excel文件中,并将其下载到客户端。 知识点详解 1. 使用Java POI读写Excel文件 Java POI提供了多种方式来读写Excel文件,包括XSSF、HSSF和SXSSF等。其中,XSSF用于读写xlsx格式的...

    POI导出Excel文件

    Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)...理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java项目中,无论是数据导出、报告生成还是数据分析。

    java poi导出Excel上传实例 可直接使用

    本实例将详细讲解如何利用Apache POI库在Java项目中导出Excel文件。 首先,我们需要引入Apache POI的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java中使用poi导出Excel大批量数据到客户端

    在java web系统应用中我们经常会用到大批量数据的导出,动辄就上几十万几百万的数据让我们的程序感觉...java中使用poi导出Excel大批量数据到客户端 存在两个导出方法:存在一个分批量导出ZIP文件,一个导出exel文件

    java导出excel POI jar包

    Java导出Excel是Java开发中常见的需求,尤其是在数据处理和报表生成方面。Apache POI库是Java领域中广泛使用的工具,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇文章将深入讲解...

    java使用POI导出 Excel工具类

    java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。

    java poi导出excel

    在Java中,如果你需要导出Excel文件,Java POI是一个非常实用的工具。下面将详细介绍如何使用Java POI来实现Excel的导出。 1. **引入依赖** 在Java项目中使用POI,首先需要在项目的构建文件(如Maven的pom.xml或...

    java版poi导出excel文件

    在Java编程环境中,Apache POI库是一个非常流行的API,它允许开发者读取、创建和修改Microsoft Office格式的文件,...通过以上步骤,你可以熟练地在Java环境中使用Apache POI库导出Excel文件,满足各种数据导出需求。

    POI的EXCEL导出,自动换行

    通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...

    使用POI,实现excel文件导出,图片url导出文件,图片和excel文件导出压缩包

    本文将深入探讨如何使用POI库来实现Excel文件的导出,以及如何将图片URL转换为图片文件并与其他文件一起打包成压缩包。 首先,让我们了解一下Apache POI。POI是Java开发者的开源API,它允许程序创建、修改和显示...

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)

    java 利用POI 导入导出Excel

    前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!

    java poi导出大量数据到Excel

    ### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是在金融、电商等行业。Java POI库作为一款强大的用于读写Microsoft Office文档的Java ...

    POI实现Excel导入导出并附带加载进度条

    Apache POI是一个强大的库,它允许开发者使用Java来读取、写入和修改Microsoft Office格式的文件,包括Excel(.xlsx, .xls)。本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,...

    JAVA POI导出EXCEL代码

    在Java开发中,我们经常使用POI库来处理Excel数据,如读取、写入和修改Excel文件。本篇文章将详细介绍如何使用JAVA POI导出Excel。 一、准备工作 在开始编写代码前,确保已经添加了Apache POI库到项目的依赖管理中...

Global site tag (gtag.js) - Google Analytics