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();
	}
}

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

四、其他

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

相关推荐
YuTaoShao27 分钟前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张330 分钟前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx3 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野4 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person5 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜6 小时前
java异常学习
java
FrankYoou7 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*7 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了7 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来7 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea