一、背景
微信小程序需要导出excel文件,后端技术Java,前端使用uniapp框架,使用excel模板。
二、excel 报表模板
需要补充的内容是以下标记问号的,其中有个表格,内容是动态添加的
三、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();
}
}
通过上述的操作,然后就可以实现下载了。
四、其他
如果是小程序,那么可以复制下载链接,然后在手机浏览器打开,即可实现下载功能