1,獲取服務器現有excel文件
public List<Object[]> getObject(String filePath){ log.info("**文件路徑為:**"+filePath); List<Object[]> mediacelList = new ArrayList<Object[]>(); // 構造 Workbook 對象,execelFile 是傳入文件路徑(獲得Excel工作區) Workbook book = null; try { book = new HSSFWorkbook(new FileInputStream(filePath)); } catch (Exception e) { e.printStackTrace(); log.error("***獲取服務器文件***",e); } // 讀取表格的第一個sheet頁 Sheet sheet = book.getSheetAt(0); // 定義 row、cell Row row; // 總共有多少行,從0開始 int totalRows = sheet.getLastRowNum() ; // 循環輸出表格中的內容,首先循環取出行,再根據行循環取出列 for (int i = 0; i <= totalRows; i++) { Object[] ob = new Object[23]; row = sheet.getRow(i); // 處理空行 if(row == null){ continue ; } // 總共有多少列,從0開始 int totalCells = row.getLastCellNum() ; for (int j = 0; j < totalCells; j++) { Object cell = row.getCell(j); ob[j] = cell; } mediacelList.add(ob); } return mediacelList; }
2,將步驟1返回的數據轉換成excel所需要的字符串格式
private String dataToString(List data) { StringBuffer temp = new StringBuffer(); if (data != null && data.size() > 0) { for (int i = 0; i < data.size(); i++) { Object[] obj = (Object[]) data.get(i); if (obj == null) break; for (int j = 0; j <= obj.length - 2; j++) { if (obj[j] == null) { log.info("obj[j]為空===============" + obj[j]); temp.append(" \t"); } else { log.info("obj[" + j + "]===========================" + obj[j]); temp.append(obj[j].toString() + " \t"); } } if (obj[obj.length - 1] == null) { temp.append(" \n"); } else { temp.append(obj[obj.length - 1].toString() + "\n"); } } } return temp.toString(); }
3,執行下載功能
@RequestMapping("/downLoadFailRecord") public ModelAndView downLoadFailRecord( HttpServletRequest request,HttpServletResponse response, @ModelAttribute("filePath")String filePath) throws Exception{ log.info("=========下載啦啦啦啦=======進入downLoadFailRecord===========filePath:"+filePath); String excelData = ""; String str = "醫路通保存失敗統計記錄"; excelData = medicalService.getFailMedical(filePath); log.info("*******解析的字符串為:"+excelData); response.setContentType("application/ms-txt;charset=UTF-8"); response.addHeader("Content-Disposition","attachment; filename=" + new String(str.getBytes("GBK"),"ISO8859_1") + ".xls"); response.getWriter().write(excelData); return null; }
ps:excel文件的xls格式默認純數字的數據將不能正常顯示,所以根據實際經驗下載excel文件時設置成csv體驗會更好一點
步驟如下:
2,2,將步驟1返回的數據轉換成excel所需要的字符串格式,各個字段用逗號(,)隔開
private String dataToString(List data) { StringBuffer temp = new StringBuffer(); if (data == null || data.size() <= 0) { return null; } for (int i = 0; i < data.size(); i++) { Object[] obj = (Object[]) data.get(i); if (obj == null){ break; } for (int j = 0; j <= obj.length - 2; j++) { if (obj[j] == null) { temp.append(" ,"); } else { temp.append(obj[j].toString() + " \t,"); } } if (obj[obj.length - 1] == null) { temp.append(" \n"); } else { temp.append(obj[obj.length - 1].toString() + "\n"); } } return temp.toString(); }
3,2執行下載功能
@RequestMapping("/downLoadFailRecord") public ModelAndView downLoadFailRecord( HttpServletRequest request,HttpServletResponse response, @ModelAttribute("filePath")String filePath) throws Exception{ log.debug("====進入downLoadFailRecord===========filePath:"+filePath); String excelData = ""; String str = "醫路通失敗統計記錄"; excelData = medicalService.getFailMedical(filePath); response.setContentType("application/ms-txt;charset=UTF-8"); response.addHeader("Content-Disposition","attachment; filename=" + new String(str.getBytes("GBK"),"ISO8859_1") + ".csv"); response.getWriter().write(excelData); return null; }
拓展:有時候下載的csv存在亂碼,則把csv文件另存為...一下就好了,就好了,盡然就好了!!!