Java 下载excel文件

一、背景

微信小程序需要导出excel文件,后端技术Java,前端使用uniapp框架,使用excel模板。

二、excel 报表模板

需要补充的内容是以下标记问号的,其中有个表格,内容是动态添加的

三、Java端代码实现

关键步骤,省略数据查询

java 复制代码
//......
//上面是操作数据库的内容,就不写了
String classPath = "xxx/xxxx.xls";//excel模板位置,我是放在与com同级的目录下了
ClassPathResource classPathResource = new ClassPathResource(classPath);
InputStream is = classPathResource.getInputStream();
//1. 创建一个 workbook 对象
HSSFWorkbook workbook = new HSSFWorkbook(is);
HSSFSheet sheetAt = workbook.getSheetAt(0);//获取第一个sheet
//因为是模板,且这几行内容固定,所以这个地方可以写死
sheetAt.getRow(2).getCell(1).setCellValue(sqmc);//给第三行第二个单元格添加内容
sheetAt.getRow(2).getCell(4).setCellValue(format_sbny);//给第三行第五个单元格添加内容
int initRow = 4;//动态行添加是从第五行开始的,所以设置为4,因为首行是0
if (ds_list.size() != 0) {//这是数据库查询到的表格内容,ds_list是一个对象数组
	//从第5行开始往下移动 ds_list.size()行,在第initRow + ds_list.size()结束,true:表示是否更新单元格的公式。false:表示是否复制行高。
	sheetAt.shiftRows(initRow, initRow + ds_list.size(), ds_list.size(), true, false);
	for (int i = 0; i < ds_list.rowCount(); i++) {
		JSONObject obj = ds_list.getRow(i);//这里的这个getRow()方法是我们项目自己封装的,不要使用,实质就是获取对象数组中的对象
		HSSFRow row = sheetAt.createRow(initRow);
		row.setHeightInPoints(30);//设置行高30磅 
		HSSFCellStyle cellStyle = workbook.createCellStyle();//创建单元格样式
		cellStyle.setAlignment(HorizontalAlignment.CENTER);// 设置水平居中显示
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置垂直居中显示
		// 设置边框样式
		cellStyle.setBorderTop(BorderStyle.THIN);
		cellStyle.setBorderBottom(BorderStyle.THIN);
		cellStyle.setBorderLeft(BorderStyle.THIN);
		cellStyle.setBorderRight(BorderStyle.THIN);
		HSSFFont cellFont = workbook.createFont();    // 创建字体
		cellFont.setFontHeightInPoints((short)12);    // 将字体大小
		cellFont.setFontName("宋体");             // 设置字体为 宋体 应用到当前单元格上
		cellStyle.setFont(cellFont); // 字体应用到 标题样式上
		for (int j = 0; j < 5; j++) {
			row.createCell(j);
			HSSFCell cell = row.getCell(j);
			cell.setCellStyle(cellStyle);
		}
		//接下来就是赋值
		row.getCell(0).setCellValue(i + 1);
		row.getCell(1).setCellValue(obj.getString("xm", ""));
		row.getCell(2).setCellValue(obj.getString("sfzhm", ""));
		row.getCell(3).setCellValue(obj.getString("swsj", ""));
		row.getCell(4).setCellValue(obj.getString("bz", ""));
		initRow++;
	}
}
//给其他位置赋值
sheetAt.getRow(initRow).getCell(1).setCellValue(qtsm);//其他说明
sheetAt.getRow(initRow + 1).getCell(1).setCellValue(tbr_xm);//
sheetAt.getRow(initRow + 1).getCell(4).setCellValue(tbrq);//填表日期
sheetAt.getRow(initRow + 2).getCell(1).setCellValue(jbr);//经办人
sheetAt.getRow(initRow + 2).getCell(4).setCellValue(sbrq);//收表日期

String fileName = "xxxxxx.xls";//设置文件名
// 设置响应内容类型为Excel文件
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
// 设置响应头,告诉浏览器以附件形式下载文件,并指定文件名
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName,"UTF-8"));
OutputStream output = response.getOutputStream();//HttpServletResponse response
try {
	workbook.write(output);
	output.flush();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	if (output != null) {
		output.close();
	}
}

通过上述的操作,然后就可以实现下载了。

四、其他

如果是小程序,那么可以复制下载链接,然后在手机浏览器打开,即可实现下载功能

相关推荐
huangdong_12 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天12 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录91713 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录91713 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥14 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码14 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|14 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy14 小时前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手14 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁14 小时前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse