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

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

四、其他

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

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸3 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了4 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342736 小时前
Java实现离线身份证号码OCR识别
java·开发语言