解决java poi导出excel2003不能超过65536行的问题

news/2024/7/21 5:50:57 标签: java, poi, excel, 存储, 分页

我们都知道java poi在导出数据到excel2003工作表中时一个工作表只能存储65536行数据,如果超过这个数据就会失败,excel2007并没有这个问题,但是为了兼容性我们通常都是导出到2003版本上的,下面我们看看如何用java poi解决这个问题,为了便于理解我就将整个excel poi导出功能贴出来了。 java poi自动sheet分页效果:


以下是service层的处理方法(关键)

	/**
	 * 如果达到50000条数据则重新创建工作表的逻辑
	 */
	@Override
	public void exportExcel(List<HolidayItemForm> formList, ServletOutputStream outputStream){
		try {
			//工作表名后面的数字,如表1,表2
			int i = 0;
			//记录总行数
			int rownum = 0;
			//记录每个sheet的行数
			int tempnum = 0;
			//分页条数达到此条数则创建工作表
			int page = 5;
			//创建工作薄
			HSSFWorkbook workbook = new HSSFWorkbook();
			//创建列标题栏样式
			HSSFCellStyle cellStyle = ExcelUtils.createCellStyle(workbook, (short)10);
			while(true){
				//创建工作表并应用上面的样式
				HSSFSheet sheet = ExcelUtils.createWorkbook(workbook,cellStyle,++i);
				rownum++;
				//将数据库中的数据列表写入excel中
				if(formList != null){
					tempnum = 0;
					for (int j=rownum-i; j<formList.size(); j++) {
						//进入第2个sheet写出的行数从第2条数据开始(++tempnum等于1,因为标题行占了1行)
						HSSFRow row2 = sheet.createRow(++tempnum);
						rownum++;
						row2.createCell(0).setCellValue(formList.get(j).getUserId());
						row2.createCell(1).setCellValue(formList.get(j).getUserName());
						row2.createCell(2).setCellValue(formList.get(j).getDeptName());
						row2.createCell(3).setCellValue(formList.get(j).getUserJob());
						row2.createCell(4).setCellValue(formList.get(j).getTypeName());
						row2.createCell(5).setCellValue(formList.get(j).getBeginDate());
						row2.createCell(6).setCellValue(formList.get(j).getEndDate());
						row2.createCell(7).setCellValue(formList.get(j).getHolidayHour());
						row2.createCell(8).setCellValue(formList.get(j).getCreateDate());
						//达到5条退出并创建另外一个sheet
						if(rownum%page == 0){
							break;
						}
					}
				}
				//如果记录的行数等于集合的总行数则退出
				if((rownum-i) == formList.size()){
					break;
				}
			}
			//输出
			workbook.write(outputStream);
			workbook.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
ExcelUtils工具类上的两个方法,跟解决此问题没什么关联,只是上面有用到,我就把它贴出来了。
	/**
	 * 创建列标题栏样式
	 * 水平垂直居中
	 */
	public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontSize) {
		HSSFCellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		HSSFFont font = workbook.createFont();
		font.setBold(true);
		font.setFontHeightInPoints(fontSize);
		cellStyle.setFont(font);
		return cellStyle;
	}

	/**
	 * 创建新工作表
	 */
	public static HSSFSheet createWorkbook(HSSFWorkbook workbook,HSSFCellStyle cellStyle,int num) {
		HSSFSheet sheet = workbook.createSheet("明细"+num);
		sheet.setDefaultColumnWidth(18);
		String [] titles = {"工号","姓名","部门","职务","假期类型","开始日期","结束日期","请假小时","创建时间"};
		HSSFRow row = sheet.createRow(0);
		for(int i=0; i<titles.length; i++){
			HSSFCell cell = row.createCell(i);
			cell.setCellStyle(cellStyle);
			cell.setCellValue(titles[i]);
		}
		return sheet;
	}
Controller层传给service层一个list集合和outputstream输出流。

	//导出假期明细列表
	@RequiresPermissions("approval:holiday:detail:view")
	@RequestMapping("/holidaydetail/excelexport")
	public void exportExcel(HolidayItemForm form,HttpServletRequest request,HttpServletResponse response){
		Map<String,Object> paramMap = new HashMap<>();
		try {
			paramMap.put("companyId", form.getCompanyId());
			paramMap.put("deployId", form.getDeployId());
			paramMap.put("userId", form.getUserId());
			//从数据库查找需要的信息集合
			List<HolidayItemForm> formList = itemService.findPageByParam(paramMap);
			String currentTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
			response.setContentType("application/vnd.ms-excel");
		    //解决导出文件IE和其他浏览器中文名乱码问题	
		    String filename = null;
		    if(request.getHeader("User-Agent").indexOf("Mozilla") != -1){
		        filename = URLEncoder.encode("假期明细"+currentTime+".xls", "UTF-8");
		    }else{
		        filename = new String(("假期明细"+currentTime+".xls").getBytes(),"ISO8859-1");
		    }
		    response.setHeader("Content-Disposition", "attachment;filename=" + filename);
			ServletOutputStream outputStream = response.getOutputStream();
			//将上面查到的集合传给service层处理
			itemService.exportExcel(formList,outputStream);
			if(outputStream != null){
				outputStream.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}






http://www.niftyadmin.cn/n/817628.html

相关文章

《剑指offer》--- 整数中1出现的次数

本文算法使用python3实现 1. 问题 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数&#xff1f;为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任…

等我怎么怎了,就如何如何

最近忙着筹划一件对我个人来讲非常重大的事情&#xff0c;三番五次陷入“等我怎么怎么了&#xff0c;就如何如何”的悲催模式之中。 等我……就…… 等我怎么怎么了&#xff0c;就如何如何&#xff0c;这个模式实在是太有杀伤力了&#xff0c;往往顺理成章、不知不觉地把我们…

springmvc文件上传下载简单实现案例(ssm框架使用)

springmvc文件上传下载实现起来非常简单&#xff0c;此springmvc上传下载案例适合已经搭建好的ssm框架(springspringmvcmybatis)使用&#xff0c;ssm框架项目的搭建我相信你们已经搭建好了&#xff0c;这里不再赘述&#xff0c;下面就开始吧&#xff01; ssm框架整合详情请看&a…

python之路 Day10 CSS学习

CSS 一、css的四种引入方式 1、行内式&#xff1a; 行内式是在标记的style属性中设定CSS样式。这种方式没有体现出CSS的优势&#xff0c;不推荐使用 1 <p style"background-color: rebeccapurple">hello yuan</p> 2、嵌入式 嵌入式是将CSS样式集中写在网…

关于我在黑马程序员培训毕业后的亲身体验

首先申明&#xff1a;我本人已经于2016年5月份在广州传智播客java培训完毕业&#xff0c;和黑马程序员官网没有任何的利益往来&#xff0c;也没有人出钱给我帮他们做软文推广&#xff0c;这是我在黑马程序员的亲身体验&#xff0c;不存在虚构。 传智播客和黑马程序员是什么关系…

WebRTC编译系统之gn和ninja

WebRTC现在使用 gn 来生成构建脚本&#xff0c;使用 ninja 来构建。 gn 比 GYP 快多了&#xff0c;太多&#xff0c;你还没眨个眼&#xff0c;就结束了。 我们来大概介绍下编译 WebRTC 会用到的 gn 和 ninja 相关的知识。 想看编译指南的&#xff0c;看这里&#xff1a;Ubuntu …

swoole 安装

1、下载源码 &#xff1a;wget -c https://github.com/swoole/swoole-src/archive/v2.0.6.tar.gz  //url地址自己去找&#xff0c;不同的swoole版本和php版本可能有差异 2、解压 tar -zxvf *** , 3、使用phpize来生成php编译配置 4、./configure 来做编译配置检测 …

程序员该如何定位?看这四大方向

宽泛的意义上讲&#xff0c;程序员是这样一群人&#xff1a;他们用某种语言或技术&#xff0c;开发某种软件产品&#xff08;系统&#xff09;&#xff0c;解决特定现实领域的问题。 有了这个定义&#xff0c;我们就可以来讨论程序员的几种常见定位&#xff1a; 解决某类问题…