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

摘要:
再进行判空处赋值处理,以及去重处理。这篇博客,主要介绍读取excel表和导出excel表的方法。在这里介绍的是POI的方式,为什么选取POI?在最开始的时候,是直接调用底层封装的方法,但是由于响应值response冲突,总是报已经调用getOutStream的错误,所以选取了POI的形式。

需求描述:在课表导入的时候,首先给用户提供模板(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表的方法,然后就懒了,没有继续封装,直接写实现了)

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

免责声明:文章转载自《【ITOO 1】将List数据导出Excel表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Apache HttpClient 读取响应乱码问题总结前端下载文件的几种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# params 用法简介

params 是C#的关键字, params主要是在声明方法时参数类型或者个数不确定时使用,关于params 参数数组,需掌握以下几点:   一.参数数组必须是一维数组  二.不允许将params修饰符与ref和out修饰符组合起来使用   三.与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量  四.若实参是数组...

Data Profiling Task

Data Profiling Task 是用于收集数据的Metadata的Task,在使用ETL处理数据之前,应该首先检查数据质量,对数据进行分析,这将对Table Schema的设计结构和生成ETL的方式产生不可估量的影响。 Data Profiling Task 输出XML格式的数据文件,并能通过Open Profile Viewer 查看输出结果。...

NPOI导出Excel和基于office导出Excel比较

首先介绍一下NPOI吧。 NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Ex...

C#学习笔记(3)——操作sqlserver数据库增删改查

说明(2017-5-25 16:29:35): 1. VS2010,视图->服务器资源管理器->数据连接->右键添加连接->服务器名(本机可以用点)->选择数据库->高级里面可以看其他选项,及连接字符串 2. 连接字符串 (1)string str = "Data Source=.; Initial Catalog=j...

Java 使用POI操作EXCEL及测试框架搭建、测试开发的一些想法

无论是UI自动化测试还是接口自动化测试都需要进行数据驱动,一般很常见的一种方式就是用excel来管理数据,那么就涉及到一些代码对EXCEL的操作,之前我们介绍过用CSV来处理EXCEL,但是它的功能还不够强大。比如接口自动化测试框架搭建的时候我们用excel来进行数据驱动,用excel来进行用例的管理和测试结果的统计,那么我们就需要对excel进行读取,写...

Python 列表、元组、字典及集合操作详解

一、列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1、创建列表 >>> list1 = ['python', 2018, 'python3', 1994] >>> list1 [...