SpringBoot处理Exce表格Demo

2023-12-25 16:52:00 浏览数 (2)

项目构建

pom.xml
代码语言:javascript复制
<!-- EXCEL下载 poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.17</version>
		</dependency>


		<!-- Excel读取 /poi-ooxml -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.17</version>
		</dependency>
		
		
		<!-- commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

Excel下载(导出数据)

注意事项:复制全即可
前端
代码语言:javascript复制
<a href="downExcel">下载链接</a>
后端代码
代码语言:javascript复制
@RequestMapping("/downExcel")
	public String downExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String path = ResourceUtils.getURL("classpath:").getPath();
		System.out.println(path);

		// 创建HSSFWorkbook对象(excel的文档对象)
		HSSFWorkbook wb = new HSSFWorkbook();
		// 建立新的sheet对象(excel的表单)
		HSSFSheet sheet = wb.createSheet("成绩表");
		// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
		HSSFRow row1 = sheet.createRow(0);
		// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
		HSSFCell cell = row1.createCell(0);
		// 设置单元格内容
		cell.setCellValue("学员考试成绩一览表");
		// 合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
		// 在sheet里创建第二行
		HSSFRow row2 = sheet.createRow(1);
		// 创建单元格并设置单元格内容
		row2.createCell(0).setCellValue("姓名");
		row2.createCell(1).setCellValue("班级");
		row2.createCell(2).setCellValue("笔试成绩");
		row2.createCell(3).setCellValue("机试成绩");
		// 在sheet里创建第三行
		HSSFRow row3 = sheet.createRow(2);
		row3.createCell(0).setCellValue("李明");
		row3.createCell(1).setCellValue("As178");
		row3.createCell(2).setCellValue(87);
		row3.createCell(3).setCellValue(78);
		// .....省略部分代码

		// 输出Excel文件
		OutputStream output = response.getOutputStream();
		response.reset();
		response.setHeader("Content-disposition", "attachment; filename=details.xls");
		response.setContentType("application/msexcel");
		wb.write(output);
		output.close();

		return null;
	}

Excel上传(导入数据)

注意事项:

代码:controller层里应该放service层,可以把excel的逻辑代码根据实际情况处理一下,本文没有处理

前端:post请求

enctype属性必须写,否则出现出现空指针异常

name="file" 必须和controller里面的方法的参数命名一致

后端: 方法参数必须和前端的 文件域里的name属性一致,

前端
代码语言:javascript复制
<form action="upExcel" method="post"  enctype="multipart/form-data">
Excel上传:<input  type="file"  name="file"/><input type="submit" value="submit">
</form>
后端
代码语言:javascript复制
@RequestMapping("/upExcel")
	@ResponseBody
	public String upExcel(MultipartFile file) throws Exception {
		if (file == null || file.isEmpty()) {
			return "文件不能为空";
		}
		// 获取Excel的输出流
		InputStream inputStream = file.getInputStream();
		// 获取文件名称
		String fileName = file.getOriginalFilename();
		// init工作簿
		Workbook workbook = null;
		// 获取文件后缀
		String fileType = fileName.substring(fileName.lastIndexOf("."));
		// 根据不同后缀init不同的类,是xls还是xlsx
		if (".xls".equals(fileType)) {
			workbook = new HSSFWorkbook(inputStream);
		} else if (".xlsx".equals(fileType)) {
			workbook = new XSSFWorkbook(inputStream);
		} else {
			workbook = null;
			return "请上传正确的表格文件";
		}

		// 如果上传为费excel文件,返回
		if (null == workbook) {
			return "请上传文件";
		}

		// init
		Sheet sheet = null;
		Row row = null;
		Cell cell = null;

		// 定义读取的容器
		List list = new ArrayList<>();

		for (int i = 0; i < workbook.getNumberOfSheets(); i  ) {
			sheet = workbook.getSheetAt(i);
			if (sheet == null) {
				continue;
			}

			for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j  ) {
				row = sheet.getRow(j);
				if (row == null || row.getFirstCellNum() == j) {
					continue;
				}

				List<Object> li = new ArrayList<>();
				for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y  ) {
					cell = row.getCell(y);
					li.add(cell);
				}
				list.add(li);
			}
		}

		// 关闭流
		workbook.close();
		inputStream.close();

		for (int i = 0; i < list.size(); i  ) {
			List<Object> lo = (List<Object>) list.get(i);
			// TODO 随意发挥
			System.out.println(lo);

		}
		return "上传成功";
	}

0 人点赞