• 【ITOO 1】将List数据导出Excel表


    需求描述:在课表导入的时候,首先给用户提供模板(excel),然后将用户填写好的数据读取到list集合中。再进行判空处赋值处理,以及去重处理。这篇博客,主要介绍读取excel表和导出excel表的方法。


    一、读取Excel数据到list

    <span style="font-family:KaiTi_GB2312;font-size:18px;">	/**
    	 * 把输入流文件转变成list集合
    	 * 
    	 * @param inExcelFile
    	 * @return
    	 */
    	public List<CurriclumScheduleEntityModel> getExcelData(
    			InputStream inExcelFile) {
    		// 创建一个list 用来存储读取的内容
    		List<CurriclumScheduleEntityModel> list = new ArrayList();
    		Workbook rwb = null;
    		Cell cell = null;
    
    		// 获取Excel文件对象
    		try {
    			rwb = Workbook.getWorkbook(inExcelFile);
    		} catch (BiffException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		// 获取文件的指定工作表 默认的第一个
    		Sheet sheet = rwb.getSheet(0);
    
    		// 行数(表头的目录不需要,从1开始)
    		for (int i = 1; i < sheet.getRows(); i++) {
    
    			CurriclumScheduleEntityModel model = new CurriclumScheduleEntityModel();
    
    			model.setSemesterName(sheet.getCell(0, i).getContents()); // 第一列:学年学期
    			model.setClassName(sheet.getCell(1, i).getContents()); // 第二列:班级
    			model.setCourseName(sheet.getCell(2, i).getContents()); // 第三列:课程名称
    			model.setCourseCode(sheet.getCell(3, i).getContents()); // 第四列:课程代码
    			model.setTeacherName(sheet.getCell(4, i).getContents()); // 第五列:教师名称
    			model.setTeacherCode(sheet.getCell(5, i).getContents()); // 第六列:教工号
    			model.setRoomName(sheet.getCell(6, i).getContents()); // 第七列:教室名称
    			model.setStartWeek(sheet.getCell(7, i).getContents()); // 第八列:开始周
    			model.setEndWeek(sheet.getCell(8, i).getContents()); // 第九列:结束周
    			model.setEndWeek(sheet.getCell(9, i).getContents()); // 第十列:是否奇数周
    			model.setWeekName(sheet.getCell(10, i).getContents()); // 第十一列:星期
    			model.setCellTimeName(sheet.getCell(11, i).getContents()); // 第十二列:节次
    
    			// 把刚获取的列存入list
    			list.add(model);
    		}
    
    		return list;
    	}</span>


    二、将list数据导出到excel表

    将list数据导出到excel表一般情况有两种方式:POI和JXL。在这里介绍的是POI的方式,为什么选取POI?

    在最开始的时候,是直接调用底层封装的方法(JXL),但是由于响应值response冲突,总是报已经调用getOutStream 的错误,所以选取了POI的形式。

    首先,更改maven的pom.xml文件

    在maven的pom文件中,添加POI需要的jar包依赖(如果没有使用maven仓库管理,则需要下载响应的jar包进行引入):

    <span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">		</span><dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi</artifactId>
    			<version>3.11</version>
    		</dependency></span>

    其次,编写导出代码

    <span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">	</span>public void ExportExcel(List<CurriclumScheduleEntityModel> list) {
    		// 第一步,创建一个webbook,对应一个Excel文件
    		HSSFWorkbook wb = new HSSFWorkbook();
    		// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
    		HSSFSheet sheet = wb.createSheet("导入失败的课表");
    		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    		HSSFRow row = sheet.createRow((int) 0);
    		// 第四步,创建单元格,并设置值表头 设置表头居中
    		HSSFCellStyle style = wb.createCellStyle();
    		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
    
    		HSSFCell cell = row.createCell((short) 0);
    		cell.setCellValue("学年学期");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 1);
    		cell.setCellValue("班级");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 2);
    		cell.setCellValue("课程名称");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 3);
    		cell.setCellValue("课程代码");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 4);
    		cell.setCellValue("教师姓名");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 5);
    		cell.setCellValue("教工号");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 6);
    		cell.setCellValue("教室名称");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 7);
    		cell.setCellValue("开始周");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 8);
    		cell.setCellValue("结束周");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 9);
    		cell.setCellValue("是否为奇数周");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 10);
    		cell.setCellValue("星期");
    		cell.setCellStyle(style);
    
    		cell = row.createCell((short) 11);
    		cell.setCellValue("节次");
    		cell.setCellStyle(style);
    		// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
    
    		for (int i = 0; i < list.size(); i++) {
    			row = sheet.createRow((int) i + 1);
    			CurriclumScheduleEntityModel CS = (CurriclumScheduleEntityModel) list
    					.get(i);
    			// 第四步,创建单元格,并设置值
    			row.createCell((short) 0).setCellValue(CS.getSemesterName());
    			row.createCell((short) 1).setCellValue(CS.getClassName());
    			row.createCell((short) 2).setCellValue(CS.getCourseName());
    			row.createCell((short) 3).setCellValue(CS.getCourseCode());
    
    			row.createCell((short) 4).setCellValue(CS.getTeacherName());
    			row.createCell((short) 5).setCellValue(CS.getTeacherCode());
    			row.createCell((short) 6).setCellValue(CS.getRoomName());
    			row.createCell((short) 7).setCellValue(CS.getStartWeek());
    
    			row.createCell((short) 8).setCellValue(CS.getEndWeek());
    			row.createCell((short) 9).setCellValue(CS.getOddWeekOrNot());
    			row.createCell((short) 10).setCellValue(CS.getWeekName());
    			row.createCell((short) 11).setCellValue(CS.getCellTimeName());
    		}
    		// 第六步,将文件存到指定位置
    		try {
    			FileSystemView fsv = FileSystemView.getFileSystemView();
    
    			Date currentTime = new Date();
    			SimpleDateFormat formatter = new SimpleDateFormat(
    					"yyyy-MM-dd HH:mm:ss");
    			String dateString = formatter.format(currentTime);
    
    			String deskPath = fsv.getHomeDirectory().toString() + "/导入失败的课表数据"
    					+ dateString + ".xls";
    			FileOutputStream fout = new FileOutputStream(deskPath);
    			wb.write(fout);
    			fout.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}</span>


    三、总结

    在导出到excel表的方法中,可以使用Map将表头设置和赋值设置进一步进行封装,可以方便以后重复调用。(PS:在做项目的过程中,底层已经有封装好的导出excel表的方法,然后就懒了,没有继续封装,直接写实现了)

    然后,在做这个导出的过程中,再一次遇到了如果用户需要更改保存路径怎么办的问题,在底层封装的方法中,也是默认保存到用户下载路径,但是我想还是有这个需求的,找个时间,一定要把这个问题解决了。在今日开讲中遇到了一次,在这里又遇到了一次,这是不解决睡不安稳的节奏。

  • 相关阅读:
    挑战练习13.8 用于RecyclerView 的空视图
    挑战练习13.7 复数字符串资源
    挑战练习13.6 删除crime 记录
    挑战练习12.3 更多对话框
    20. Valid Parentheses
    挑战练习11.6 添加Jump to First按钮和Jump to Last按钮
    内存 分析
    HOOK64 32转换
    MD5
    HOOk快捷键
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010320.html
Copyright © 2020-2023  润新知