前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot处理Exce表格Demo

SpringBoot处理Exce表格Demo

作者头像
CBeann
发布2023-12-25 16:52:00
1240
发布2023-12-25 16:52:00
举报
文章被收录于专栏:CBeann的博客CBeann的博客

项目构建

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 "上传成功";
	}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目构建
    • pom.xml
    • Excel下载(导出数据)
      • 注意事项:复制全即可
        • 前端
          • 后端代码
          • Excel上传(导入数据)
            • 注意事项:
              • 前端
                • 后端
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档