一、背景
微信小程序需要导出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();
- }
- }
通过上述的操作,然后就可以实现下载了。
四、其他
如果是小程序,那么可以复制下载链接,然后在手机浏览器打开,即可实现下载功能