`
iceflyingfox
  • 浏览: 52330 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JXL和POI导出数据

    博客分类:
  • java
 
阅读更多

最近做数据导出为Excel,特地比较了一下JXL和POI的性能,顺便记录下二者的用法

 

先定义一下测试条件

 

 

public class TestCondition {
	
	/**
	 * 生成的记录条数
	 */
	public static final int RECORD_COUNT = 21000;
	
	/**
	 * 模板文件
	 */
	public static final String TEMPLATE_FILE = "E:/MyKernelPlatformWorkspace/Template/query_order.xls";
	
	/**
	 * JXL生成文件位置
	 */
	public static final String JXL_TARGET_FILE_NAME = "E:/MyKernelPlatformWorkspace/Template/target/jxl_order.xls";
	
	/**
	 * POI生成文件位置
	 */
	public static final String POI_TARGET_FILE_NAME = "E:/MyKernelPlatformWorkspace/Template/target/poi_order.xls";
	
	/**
	 * JXL临时文件位置
	 */
	public static final String JXL_TEMP_DIR = "E:/MyKernelPlatformWorkspace/Template/temp";
	
}

 

然后在此测试条件下编写JXL和POI的测试类,首先是JXL的

 

 

public class JXLExcel {
	
	/**
	 * 起始行
	 */
	private static final int start_row = 3;
	
	private WorkbookSettings settings;
	
	private File target;
	
	public JXLExcel() {
		this.settings = new WorkbookSettings();
		
		//设定JXL在生成excel文件时使用临时文件
		settings.setUseTemporaryFileDuringWrite(true);
		settings.setTemporaryFileDuringWriteDirectory(new File(TestCondition.JXL_TEMP_DIR));
		
		this.target = new File(TestCondition.JXL_TARGET_FILE_NAME);
	}
	
	public void execute() throws Exception {

		// 读入模板文件
		Workbook template = Workbook.getWorkbook(new File(TestCondition.TEMPLATE_FILE));
		
		WritableWorkbook worbook = Workbook.createWorkbook(target, template, settings);
		
		// 获取第一个sheet
		WritableSheet sheet = worbook.getSheet(0);
		
		Random random = new Random();
		
		// 循环写入数据
		for(int i = 0;i < TestCondition.RECORD_COUNT;i++) {
			int row = i + start_row;
			sheet.insertRow(row);
			
			Label col1 = new Label(0, row, String.valueOf(i + 1));
			Label col2 = new Label(1, row, String.valueOf(random.nextLong()));
			Label col3 = new Label(2, row, String.valueOf(random.nextLong()));
			Label col4 = new Label(3, row, "merchant" + (i +1));
			jxl.write.Number col5 = new Number(4, row, random.nextDouble());
			jxl.write.Number col6 = new Number(5, row, random.nextDouble());
			jxl.write.Number col7 = new Number(6, row, random.nextDouble());
			jxl.write.Number col8 = new Number(7, row, random.nextDouble());
			Label col9 = new Label(8, row, String.valueOf(random.nextLong()));
			Label col10 = new Label(9, row, "PAY");
			Label col11 = new Label(10, row, "POS");
			Label col12 = new Label(11, row, "2010-09-03 12:45:13");
			Label col13 = new Label(12, row, "2010-09-09 12:45:13");
			Label col14 = new Label(13, row, "interface" + (i + 1));
			Label col15 = new Label(14, row, "18701001830");
			Label col16 = new Label(15, row, "ccbc");
			Label col17 = new Label(16, row, String.valueOf(random.nextLong()));
			Label col18 = new Label(17, row, String.valueOf(random.nextLong()));
			jxl.write.Number col19 = new Number(18, row, random.nextDouble());
			jxl.write.Number col20 = new Number(19, row, random.nextDouble());
			Label col21 = new Label(20, row, "payer" + (i + 1));
			Label col22 = new Label(21, row, String.valueOf(random.nextLong()));
			Label col23 = new Label(22, row, "192.168.1.1");
			Label col24 = new Label(23, row, "192.168.1.1");
			
			sheet.addCell(col1);
			sheet.addCell(col2);
			sheet.addCell(col3);
			sheet.addCell(col4);
			sheet.addCell(col5);
			sheet.addCell(col6);
			sheet.addCell(col7);
			sheet.addCell(col8);
			sheet.addCell(col9);
			sheet.addCell(col10);
			sheet.addCell(col11);
			sheet.addCell(col12);
			sheet.addCell(col13);
			sheet.addCell(col14);
			sheet.addCell(col15);
			sheet.addCell(col16);
			sheet.addCell(col17);
			sheet.addCell(col18);
			sheet.addCell(col19);
			sheet.addCell(col20);
			sheet.addCell(col21);
			sheet.addCell(col22);
			sheet.addCell(col23);
			sheet.addCell(col24);
		}
		
		worbook.write();
		worbook.close();
	}

}

 

 

执行Main函数

 

 

public class JXLMain {

	/**    
	 * 描述:    
	 * @param args    
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		 
		long jxlStart = System.currentTimeMillis();
		JXLExcel jxl = new JXLExcel();
		jxl.execute();
		long jxlStop = System.currentTimeMillis();
		System.out.println("jxl takes : " + (jxlStop - jxlStart)/1000 + " seconds.");
		
	}
 

 

然后是POI的

 

public class POIExcel {

	/**
	 * 起始行
	 */
	private static final int start_row = 3;

	public void execute() throws Exception {

		// 读入模板文件
		InputStream is = new FileInputStream(TestCondition.TEMPLATE_FILE);
		POIFSFileSystem poifsFileSystem = new POIFSFileSystem(is);
		
		HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
		
		// 获取第一个sheet
		HSSFSheet sheet = workbook.getSheetAt(0);

		Random random = new Random();

		// 将模板的最后两行移动
		sheet.shiftRows(3, 4, TestCondition.RECORD_COUNT);
		
		OutputStream os = new FileOutputStream(
				TestCondition.POI_TARGET_FILE_NAME);

		// 循环写入数据
		for (int i = 0; i < TestCondition.RECORD_COUNT; i++) {
			int rowNum = i + start_row;
			HSSFRow row = sheet.createRow(rowNum);

			HSSFCell cell1 = row.createCell(0);
			cell1.setCellValue(i + 1);
			
			HSSFCell cell2 = row.createCell(1);
			cell2.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell3 = row.createCell(2);
			cell3.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell4 = row.createCell(3);
			cell4.setCellValue("merchant" + (i +1));
			
			HSSFCell cell5 = row.createCell(4);
			cell5.setCellValue(random.nextDouble());
			
			HSSFCell cell6 = row.createCell(5);
			cell6.setCellValue(random.nextDouble());
			
			HSSFCell cell7 = row.createCell(6);
			cell7.setCellValue(random.nextDouble());
			
			HSSFCell cell8 = row.createCell(7);
			cell8.setCellValue(random.nextDouble());
			
			HSSFCell cell9 = row.createCell(8);
			cell9.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell10 = row.createCell(9);
			cell10.setCellValue("PAY");
			
			HSSFCell cell11 = row.createCell(10);
			cell11.setCellValue("POS");
			
			HSSFCell cell12 = row.createCell(11);
			cell12.setCellValue(new Date());
			
			HSSFCell cell13 = row.createCell(12);
			cell13.setCellValue(new Date());
			
			HSSFCell cell14 = row.createCell(13);
			cell14.setCellValue("interface" + (i + 1));
			
			HSSFCell cell15 = row.createCell(14);
			cell15.setCellValue("18701001830");
			
			HSSFCell cell16 = row.createCell(15);
			cell16.setCellValue("ccbc");
			
			HSSFCell cell17 = row.createCell(16);
			cell17.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell18 = row.createCell(17);
			cell18.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell19 = row.createCell(18);
			cell19.setCellValue(random.nextDouble());
			
			HSSFCell cell20 = row.createCell(19);
			cell20.setCellValue(random.nextDouble());
			
			HSSFCell cell21 = row.createCell(20);
			cell21.setCellValue("payer" + (i + 1));
			
			HSSFCell cell22 = row.createCell(21);
			cell22.setCellValue(String.valueOf(random.nextLong()));
			
			HSSFCell cell23 = row.createCell(22);
			cell23.setCellValue("192.168.1.1");
			
			HSSFCell cell24 = row.createCell(23);
			cell24.setCellValue("192.168.1.1");
			
		}
		workbook.write(os);
		os.close();
	}
 

执行Main函数

 

 

public class POIMain {

	/**    
	 * 描述:    
	 * @param args    
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		
		long jxlStart = System.currentTimeMillis();
		POIExcel poi = new POIExcel();
		poi.execute();
		long jxlStop = System.currentTimeMillis();
		System.out.println("poi takes : " + (jxlStop - jxlStart)/1000 + " seconds.");
	}

}

 

经过测试发现,在默认的JVM内存下,24列数据,POI在15000行以上就会发生out of memory异常,而jxl到21000以上才会发生异常,jxl使用时急着开启使用临时文件,可以有效地提高导出性能。

另外POI支持excel2003和2007,而jxl只支持excel2003。

分享到:
评论
3 楼 18335864773 2017-06-06  
使用POI、JXL直接生成Excel,很容易就造成内存溢出了。即使不溢出,由于代码执行耗时太久也会长时间阻塞web页面,导致web系统并发访问性能急剧下降。

一个PageOffice软件,本质上也是在客户端生成Excel表格的,但是这个产品提供的是服务器端的编程对象,接口很简单,调用起来比js舒服多了,通过对这个产品提供的服务器端Excel操作对象编程,客户端就能在用户需要Excel表格的时候实时生成,也同时解决了文件的在线预览和打印问题。PageOffice肯定是对Excel的接口做过深度优化的,填充上万行数据也能瞬间完成,还支持赋值公式、单元格样式和文本样式的设置,所以在此与大家分享一下,有兴趣可以去PageOffice的官网下载一个试用版测试。
2 楼 18335864773 2017-06-06  
使用POI、JXL直接生成Excel,很容易就造成内存溢出了。即使不溢出,由于代码执行耗时太久也会长时间阻塞web页面,导致web系统并发访问性能急剧下降。
1 楼 安静听歌 2015-08-04  
我想请问一下,jxl 开启临时文件怎么用啊,我的报:系统找不到指定的路径。我看过了的,temp文件我也试过手动创建,,,都是不行,,,

相关推荐

    Excel生成导出JXL和POI两种方式小demo

    提供的压缩包文件"excel导出"可能包含了使用JXL和POI生成Excel的示例代码,通过查看这些代码,你可以更好地理解如何在实际项目中应用这两个库。 总结来说,JXL和Apache POI都是Java中用于处理Excel的强大工具,各...

    java操作excel——jxl和poi比较

    本文将对比两种主流的Java Excel处理库:jxl和Apache POI,并探讨它们的特性和适用场景。 首先,jxl是较早的Java Excel处理库,主要用于读写Excel 97-2003格式的.XLS文件。它的API简洁,易于上手,对于简单的读写...

    Excel导入导出 jxl及Poi 工具类

    工具类可能包含如`exportToExcel()`和`importFromExcel()`等方法,分别用于数据导出和导入。导入时,通常会解析Excel文件,将数据映射到Java对象,然后存储在数据库中;导出时,从数据库获取数据,生成Excel文件。 ...

    JXL 和 POI 操作Excel 表格

    JXL和Apache POI是两个Java库,专门设计用于读取、写入和操作Excel文件。这两个库为开发者提供了便利,使他们能够在Java应用程序中无缝地与Excel工作簿交互。 **JXL库** JXL(Java Excel API)是一个开源库,支持...

    JXL、POI实现Excel导入导出

    在IT行业中,处理Excel数据是一项常见的任务,尤其是在数据分析、报表生成和数据交换等场景下。JXL和Apache POI是两个流行的Java库,专门用于读取、写入和操作Excel文件。下面将详细介绍这两个库以及如何利用它们...

    jxl与poi jar

    jxl是一个流行的开源库,专门用于读写Microsoft Excel格式的文件,而Apache POI是另一个强大的开源库,同样支持创建、修改和读取Microsoft Office格式的文件,包括Excel。 在描述中提到的"jxl的jar包以及相应的使用...

    操作Excel文件(读取和生成)jxl和poi

    JXL和Apache POI是两个广泛使用的库,分别提供了对Excel文件的读取和生成的支持。本篇文章将深入探讨这两个库的使用方法及其特点。 首先,JXL是一个Java API,主要用于读写Excel 97-2003格式的工作簿,即.xls文件。...

    poi jxl 生成EXCEL 报表

    在Java编程环境中,生成Excel报表是一项常见的任务,尤其在数据处理和数据分析中。Apache POI 和 JExcelAPI(JXL)是两个广泛使用的库,分别用于处理Microsoft Office的POI格式(包括Excel)和Java环境中的Excel文件...

    jxls报表生成利器,比起jxl,poi牛逼得很

    3. **模板设计**: 使用jxls,可以在Excel中直接设计报表模板,包含所需的格式、样式和计算公式,然后在Java代码中用jxls API处理模板和数据,生成最终的Excel报表。 4. **数据绑定**: jxls通过`@Param`注解实现数据...

    使用JXL和POI实现EXCEL的导入和导出及DTREE的使用

    本资源主要讲解了如何利用JXL和Apache POI这两个库来实现Excel的导入与导出,并介绍了DTREE(决策树)的使用。 JXL是一个广泛使用的Java库,它提供了读写Microsoft Excel文件的能力,支持多种格式,如.xls。使用JXL...

    Jxl和poi读取写入excel

    本文将深入探讨如何使用Jxl和Apache POI库来读取和写入Excel文件,同时会区分2007年之后的.xlsx格式(基于OpenXML)和2003及之前的.xls格式(基于BIFF)。 首先,让我们了解一下Jxl库。Jxl是Java Excel API的简称,...

    jxl poi技术对excel操作

    jxl jxl包 poi技术导出数据至excel中 poi-bin-2.5.1包 jxl对excel表格 代码操作 poi技术 java代码从数据库取数据导入至Excel表中 poi-bin-2.5.1-final-20040804.jar

    jxl和poi读取写入表格jar包,文档和示例

    在Java编程环境中,处理...总之,无论选择JXL还是Apache POI,Java开发者都能够有效地处理Excel文件,实现数据的读取和写入。结合提供的文档和示例,开发者可以更好地理解这两个库的工作原理,并将其应用到实际项目中。

    poi 和 jxl

    在实际应用中,你可以利用Apache POI和JXL来实现各种功能,比如自动化报表生成、数据导入导出、数据分析等。通过这两个库,你可以避免依赖Microsoft Office应用程序来处理Excel文件,使得你的程序可以在任何支持Java...

    POI和JXL两种方式导出EXCEL

    本话题将探讨使用Apache POI和JExcelApi(JXL)两个库来实现这一功能。这两种库都是Java中广泛使用的处理Microsoft Office文件格式的库,特别是Excel。 首先,Apache POI是一个开源项目,它提供了读取和写入...

    poi,jxl.jar

    标题 "poi,jxl.jar" 暗示了我们讨论的主题是使用Apache POI库与JExcelAPI(jxl.jar)来操作...在实际应用中,理解并熟练运用这些库,可以帮助开发者高效地处理Excel数据,无论是数据导入导出、报表生成还是数据分析。

    jxls-poi导出excel示例代码文件

    **正文** 在IT行业中,数据处理和展示是一个重要的任务,Excel作为广泛使用的表格工具,常被用于数据分析和报告生成。...在实际项目中,根据需求调整模板和数据结构,可以实现各种复杂的Excel报告生成。

    dwr结合jQuery实现Ajax技术 ,Oracle作为后台数据库,jxl + poi报表

    标题中的“dwr结合jQuery实现Ajax技术”是指在Web开发中使用Direct Web Remoting (DWR) 和 jQuery库来创建...开发者需要掌握Java编程、Ajax技术、SQL查询、Oracle数据库管理以及使用jxl和POI处理Excel文件的相关技能。

    通过JXL使用模板导出EXCEL

    在Java编程环境中,导出数据到Excel是一种常见的需求,特别是在数据分析、报表生成或者数据交换的场景下。...通过对这个示例的分析和学习,你应该能更好地理解如何在实际项目中运用JXL库进行Excel模板导出。

Global site tag (gtag.js) - Google Analytics