IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring boot实操演练3 ——导出表格数据为Excel文件 -> 正文阅读

[Java知识库]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循环里),不同数据类型的判空操作和赋值操作有所出入(可能涉及到数据类型转换),请依靠开发工具提示和其他参考资料自行选择适用的方法。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:29:56  更:2022-08-06 10:31:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:33:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码