Spring boot实操演练3 ——导出表格数据为Excel文件

目录

1、业务场景

2、开发环境和工具

3、代码思路

4、参考代码

controller层

service层


1、业务场景

(1)、前置条件:查询接口已经做好,可直接调用;

(2)、需要实现:

前端:点击查询结果数据列表右上方的导出按钮后,导出一个对应数据列表的excel文件,文件名由前端定义;

后端:接收到导出请求后,首先进行身份验证(这里以companyId为例),然后执行创建excel文件的一系列操作,sheet(工作薄)名称和表头都需要按照需求定义设计;

2、开发环境和工具

因为该业务功能是在我实习公司已有项目下的拓展,所以环境依赖较多,我将重点阐述我所负责的后端代码逻辑,开发环境和工具只会简单带过;

(1)、IDE:IntelliJ IDEA 2022.1

(2)、测试:Postman

(3)、JDK:jdk-11.0.15

(4)、Spring Boot Version:2.2.5.RELEASE

(5)、modelVersion:4.0.0

(6)、pomVersion:0.0.1-SNAPSHOT

3、代码思路

4、参考代码

实体类(代码中体现为:EntityClassVo+数字)请根据实际的业务需求自行构建,我的理解就是把数据库对应属性放进去,然后添加属性方法(get和set)即可。

controller层

/**
	 * 导出设备信息数据列表
	 * @param vo
	 * @param request
	 * @param response
	 * @return: xxx.utils.util.CommonResponse
	 * @author Mike-GY
	 * @since: 2022/8/2
	 */
	@RequestMapping(value ="/exportDeviceInfoList" ,method = RequestMethod.POST)
	public void exportDeviceInfoList(@RequestBody EntityClass1Vo vo, HttpServletRequest request, HttpServletResponse response) throws IOException{
        
        //通过前端获取公司ID,即保证只能查询和导出自己公司的数据
		int companyId = Integer.parseInt(HttpUtil.getCompanyId(request));
		vo.setCompanyId(companyId);
        //创建一个新的.xls文件
		ServletOutputStream outputStream = ExportUtil.getServletOutputStream(request, response, "设备信息数据列表.xls");
        //调用service层的代码完成具体实现
		workerHomePageV2Service.exportDeviceInfoList(vo,outputStream);
        //关闭并释放输出流资源
		outputStream.close();
	}
}

service层

    /**
	 * 导出人员设备信息数据列表
	 * @param vo
	 * @param outputStream
	 * @return: "人员设备信息数据列表.xls"
	 * @author Mike—GY
	 * @since: 2022/8/2
	 */

	public void exportDeviceInfoList(EntityClass1Vo vo,ServletOutputStream outputStream) throws IOException {
		HSSFWorkbook wb = new HSSFWorkbook();
		//创建一个新的table工作薄
		HSSFSheet sheet = wb.createSheet("设备信息");
		// 行
		HSSFRow row;
		// 单元格
		HSSFCell cell;
		// 表头
		String[] ths = {"序号","组织","日期","设备总数","在线设备","离线设备","在线率"};
		// 构建表头
		row = sheet.createRow(0);
		for(int i = 0; i< ths.length;i++) {
			cell = row.createCell(i);
			cell.setCellValue(ths[i]);
		}
		//查询要导出的数据并将结果赋给data,目的是使代码简洁直观(有数据类型转换)
		List<EntityClass2Vo>  data = (List<EntityClass2Vo>)this.queryInterface(vo).getResultData();
		if(CollectionUtils.isNotEmpty(data)) {
			for (int i = 0;i< data.size(); i++) {
				EntityClass2Vo entityClass2Vo = data.get(i);
				HSSFRow createRow = sheet.createRow(i + 1);
				//序号
				int number = i + 1;
				HSSFCell numberCell = createRow.createCell(0);
				numberCell.setCellValue(number);
				//组织名称
				String deptName = entityClass2Vo.getDeptName();
				HSSFCell deptNameCell = createRow.createCell(1);
				if (StringUtils.isNotEmpty(deptName)) {
					deptNameCell.setCellValue(deptName);
				}
				//记录日期
				String recordDate = entityClass2Vo.getRecordDate();
				HSSFCell recordDateCell = createRow.createCell(2);
				if (StringUtils.isNotEmpty(recordDate)) {
					recordDateCell.setCellValue(recordDate);
				}
				//设备总数
				Integer deviceTotalNum = entityClass2Vo.getDeviceTotalNum();
				HSSFCell deviceTotalNumCell = createRow.createCell(3);
				if (deviceTotalNum != null) {
					deviceTotalNumCell.setCellValue(deviceTotalNum);
				}
				//在线设备
				Integer onlineNum = entityClass2Vo.getOnlineNum();
				HSSFCell onlineNumCell = createRow.createCell(4);
				if (onlineNum != null) {
					onlineNumCell.setCellValue(onlineNum);
				}
				//离线设备
				Integer offlineNum = entityClass2Vo.getOfflineNum();
				HSSFCell offlineNumCell = createRow.createCell(5);
				if (offlineNum != null) {
					offlineNumCell.setCellValue(offlineNum);
				}
				//在线率
				BigDecimal onlineRate = entityClass2Vo.getOnlineRate();
				HSSFCell onlineRateCell = createRow.createCell(6);
				if (onlineRate != null) {
					onlineRateCell.setCellValue(onlineRate.toString());
				}
			}
		}
        //将数据写入之前创建的.xls文件
		wb.write(outputStream);
        //关闭HSSFWorkbook
		wb.close();
	}

我遇到的问题

(1)、我后端创建.xls文件时明明在controller层定义了文件名称,可使用postman自测时创建得到的文件名仍然是乱码,最后由前端完成了文件名称命名这个操作;

(2)、在进行数据插入excel文件的操作过程中(for循环里),不同数据类型的判空操作和赋值操作有所出入(可能涉及到数据类型转换),请依靠开发工具提示和其他参考资料自行选择适用的方法。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot导出Excel文件,可以使用Apache POI库。以下是一个简单的示例: 1. 添加POI依赖到pom.xml文件: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency> ``` 2. 创建一个Controller方法来生成Excel文件: ```java @GetMapping("/export") public void exportToExcel(HttpServletResponse response) throws IOException { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet 1"); // 创建表头行 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("Name"); headerRow.createCell(1).setCellValue("Age"); // 填充数据 List<Person> people = personService.getAllPeople(); int rowNum = 1; for (Person person : people) { Row row = sheet.createRow(rowNum++); row.createCell(0).setCellValue(person.getName()); row.createCell(1).setCellValue(person.getAge()); } // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment; filename=\"people.xlsx\""); // 输出Excel文件 OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.close(); } ``` 3. 在上面的代码中,我们首先创建了一个工作簿和一个工作表。然后创建表头行和填充数据行。最后,将响应设置为Excel文件,并将工作簿写入响应输出流中。 4. 在上面的代码中,我们使用了一个名为Person的类来存储人员信息。您需要根据您的数据模型调整代码。 这就是在Spring Boot导出Excel文件的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值