POI读取Excel模板并导出大量数据

本文介绍了在使用POI处理百万级数据时遇到的问题及解决方案,包括XSSFWorkbook内存限制、SXSSFWorkbook的使用,以及如何结合两者处理模板文件。在处理过程中遇到了行数据为空、内存限制、行数超出窗口大小等问题,最终通过调整模板、设置SXSSFSheet的访问窗口大小和删除多余行解决了问题。
摘要由CSDN通过智能技术生成

POI读取Excel模板并导出大量数据

我在使用XSSFWorkbook读取Excel模板并导出大量数据(百万级)时,发现很长时间没有响应,debugger模式发现在读取第三四十万条数据时,程序直接停了,如下代码:

使用之前首先引入maven依赖,我使用的是POI版本为3.17

	<!-- apache-poi引入 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.17</version>
		</dependency>
		
		<dependency>
    		<groupId>org.apache.poi</groupId>
    		<artifactId>poi-ooxml</artifactId>
    		<version>3.17</version>
    	</dependency>

问题代码:

	/**
	 * SSOSystemPrivTask.java
	 * 用户对应的角色与权限
	 */
	public void exportUserRolePermits() {
   
		FileOutputStream out = null;
		XSSFWorkbook workbook = null;
		try {
   
			//excel模板路径
			String filePath = "/template/业务系统角色与权限关联数据(模板一).xlsx";
			//导出路径
			String exportFilePath = CmUtil.getProps("/conf.properties").getProperty("all_permit_export_path","/"); 
	        
			//读取excel模板
			InputStream in = SSOSystemPrivTask.class.getResourceAsStream(filePath);
			workbook = new XSSFWorkbook(in);
			
	        //获取角色关联权限
	        List<List<String>> privList = this.ssoTaskService.getRolePermits();
	        if (privList != null && privList.size() > 0) {
   
	        	XSSFSheet sheet0 = workbook.getSheetAt(0);//角色对应权限页签
	        	
		        //在相应的单元格进行赋值
		        for (int i = 0; i < privList.size(); i++) {
   
		        	Row row = sheet0.getRow(i+1);
		        	if (row == null) {
   
		        		row = sheet0.createRow(i+1);
		        	}
		        	for (int j = 0; j < privList.get(i).size()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您可以使用 Apache POI 库来导出 Excel 模板。这是一个用于创建和修改 Microsoft Office 格式文件的 Java 库。以下是一个示例代码,演示如何使用 POI 创建一个简单的 Excel 模板: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelTemplateExporter { public static void main(String[] args) { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 创建行,并设置行索引为0(第一行) Row row = sheet.createRow(0); // 创建单元格,并设置列索引为0(第一列) Cell cell = row.createCell(0); // 设置单元格的值 cell.setCellValue("姓名"); // 创建单元格,并设置列索引为1(第二列) cell = row.createCell(1); // 设置单元格的值 cell.setCellValue("年龄"); // 保存工作簿到文件 try (FileOutputStream outputStream = new FileOutputStream("template.xlsx")) { workbook.write(outputStream); System.out.println("Excel 模板导出成功!"); } catch (IOException e) { e.printStackTrace(); } // 关闭工作簿 try { workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例代码使用了 Apache POI 的 XSSF(XML SpreadSheet Format)实现,用于处理 Excel 2007 及以上版本的文件。如果需要处理 Excel 2003 及以下版本的文件,可以使用 HSSF(Horrible SpreadSheet Format)实现。 您可以根据自己的需求对 Excel 模板进行修改和扩展。希望这可以帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值