一、背景
微信小程序需要導出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();}
}
通過上述的操作,然后就可以實現下載了。
四、其他
如果是小程序,那么可以復制下載鏈接,然后在手機瀏覽器打開,即可實現下載功能