<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了Java從伺服器端下載Excel模板檔案的具體實現程式碼,供大家參考,具體內容如下
方法一 (2021年01月更新)
生成excel模板
@RequestMapping("/downloadExcel") public void downloadExcel(HttpServletResponse response, HttpServletRequest request) { String [] excelHeader = {"姓名","手機號(必填)","渠道名","產品名","手機作業系統(IOS/安卓)","是否是XX資料"}; List<Object> list = new ArrayList<>(); Object[] obj1 = {"張三","173*****311","a1","A","IOS","是"}; Object[] obj2 = {"李四","138*****742","a2","B","安卓","否"}; list.add(obj1); list.add(obj2); FileExport.exportExcel(excelHeader, list, "XXX模板", response, request); }
FileExport工具類:
package com.abc.common.utils.file; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; /** * 檔案匯出工具 * @author abc * @date 2019/01/08 */ public class FileExport { private static final Logger logger = LoggerFactory.getLogger(FileExport.class); /** CSV檔案列分隔符 */ private static final String CSV_COLUMN_SEPARATOR = ","; private static final String CSV_COLUM_TABLE = "t"; /** CSV檔案列分隔符 */ private static final String CSV_RN = "rn"; /** * 匯出Excel檔案 * * @param excelHeader * 匯出檔案中表格頭 * @param list * 匯出的內容 * @param response * HttpServletResponse物件,用來獲得輸出流向使用者端寫匯出的檔案 * @param sheetName * Excel的sheet名稱,加上時間戳作為匯出檔案的名稱 */ public static void exportExcel(String [] excelHeader, List<Object> list, String sheetName, HttpServletResponse response, HttpServletRequest request) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(sheetName); HSSFRow row = sheet.createRow((int) 0); /******設定單元格是否顯示格線******/ sheet.setDisplayGridlines(false); /******設定頭單元格樣式******/ HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); Font fontHeader = wb.createFont(); fontHeader.setBold(true); fontHeader.setFontHeight((short) 240); style.setFont(fontHeader); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setBorderTop(BorderStyle.THIN); /******設定頭內容******/ for (int i = 0; i < excelHeader.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(" " +excelHeader[i] + " "); cell.setCellStyle(style); } /******設定內容單元格樣式******/ HSSFCellStyle styleCell = wb.createCellStyle(); Font fontCell = wb.createFont(); fontCell.setColor(HSSFColor.BLACK.index); styleCell.setAlignment(HorizontalAlignment.CENTER); styleCell.setFont(fontCell); styleCell.setBorderBottom(BorderStyle.THIN); styleCell.setBorderLeft(BorderStyle.THIN); styleCell.setBorderRight(BorderStyle.THIN); styleCell.setBorderTop(BorderStyle.THIN); /******設定單元格內容******/ for (int i = 0; i < list.size(); i++) { row = sheet.createRow(i + 1); /******設定行高******/ row.setHeightInPoints(20); Object[] obj = (Object[]) list.get(i); for (int j = 0; j < excelHeader.length; j++) { styleCell.setWrapText(false); HSSFCell cell = row.createCell(j); if (obj[j] != null){ cell.setCellValue(obj[j].toString()); }else{ cell.setCellValue(""); } //if(obj[j].toString().length()>20) // styleCell.setWrapText(true); cell.setCellStyle(styleCell); sheet.autoSizeColumn(j); } } OutputStream ouputStream = null; try { String encoding = "UTF-8"; /** 獲取瀏覽器相關的資訊 */ String userAgent = request.getHeader("user-agent"); /** 判斷是否為msie瀏覽器 */ if (userAgent.toLowerCase().indexOf("msie") != -1){ encoding = "gbk"; } response.setCharacterEncoding(encoding); response.setContentType("application/vnd.ms-excel"); String fileName = sheetName; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHMMSS"); fileName += (dateFormat.format(new Date())).toString()+".xls"; response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, encoding)); ouputStream = response.getOutputStream(); wb.write(ouputStream); ouputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(ouputStream!=null) { ouputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 匯出CSV檔案 * @param dataList 集合資料 * @param colNames 表頭部資料 * @param mapKey 查詢的對應資料 */ public static boolean doExport(List<Map<String, Object>> dataList, String colNames, String mapKey, OutputStream os) { try { StringBuffer buf = new StringBuffer(); String[] colNamesArr = null; String[] mapKeyArr = null; colNamesArr = colNames.split(","); mapKeyArr = mapKey.split(","); /******完成資料csv檔案的封裝******/ /******輸出列頭******/ for (int i = 0; i < colNamesArr.length; i++) { buf.append(colNamesArr[i]).append(CSV_COLUMN_SEPARATOR); } buf.append(CSV_RN); if (null != dataList) { /******輸出資料******/ for (int i = 0; i < dataList.size(); i++) { for (int j = 0; j < mapKeyArr.length; j++) { buf.append(dataList.get(i).get(mapKeyArr[j])).append(CSV_COLUM_TABLE).append(CSV_COLUMN_SEPARATOR); } buf.append(CSV_RN); } } /******寫出響應******/ os.write(buf.toString().getBytes("GBK")); os.flush(); return true; } catch (Exception e) { logger.error("doExport錯誤...", e); } return false; } /** * 設定響應格式 * @param fileName * @param response * @throws UnsupportedEncodingException */ public static void responseSetProperties(String fileName, HttpServletResponse response) throws UnsupportedEncodingException { /******設定檔案字尾******/ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String fn = fileName + sdf.format(new Date()).toString() + ".csv"; /******讀取字元編碼******/ String utf = "UTF-8"; /******設定響應******/ response.setContentType("application/ms-txt.numberformat:@"); response.setCharacterEncoding(utf); response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "max-age=30"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf)); } }
匯出CSV檔案
@GetMapping("/exportFailureRecord") public void exportFailureRecord(String batchNumber, HttpServletResponse response) { if (StringUtils.isBlank(batchNumber)) { log.warn("失敗記錄匯出失敗,批次號為空..."); return; } //這裡根據你的業務查詢出資料 List<ImportFailureRecord> list = importFailureRecordService.selectList(new EntityWrapper<ImportFailureRecord>() .eq("is_delete", 0) .eq("batch_number", batchNumber)); if (CollectionUtil.isEmpty(list)) { log.warn("未查詢到可匯出的資料..."); return; } log.info("===========查詢到{}條可匯出資料==============", list.size()); String sTitle = "使用者姓名,手機號,失敗原因"; String fName = "xxx失敗記錄資料_"; String mapKey = "userName,userPhone,failureReason"; List<Map<String, Object>> dataList = new ArrayList<>(); for (ImportFailureRecord data : list) { Map<String, Object> map = new HashMap<>(); map.put("userName", data.getUserName() == null ? "" : data.getUserName()); map.put("userPhone", data.getUserPhone() == null ? "" : data.getUserPhone()); map.put("failureReason", data.getFailureReason() == null ? "" : data.getFailureReason()); dataList.add(map); } try (final OutputStream os = response.getOutputStream()) { log.info("=============失敗記錄匯出開始============"); FileExport.responseSetProperties(fName, response); FileExport.doExport(dataList, sTitle, mapKey, os); log.info("=============失敗記錄匯出結束============"); } catch (Exception e) { log.error("匯出失敗記錄資料失敗", e); } }
方法二
/** * 描述:下載外部案件匯入模板 * @param response * @param request * @author songfayuan * 2018年6月7日下午5:03:59 */ @RequestMapping("/downloadExcel") @ResponseBody public void downloadExcel(HttpServletResponse response,HttpServletRequest request) { //方法一:直接下載路徑下的檔案模板(這種方式貌似在SpringCloud和Springboot中,打包成JAR包時,無法讀取到指定路徑下面的檔案,不知道記錯沒,你們可以自己嘗試下!!!) try { //獲取要下載的模板名稱 String fileName = "ApplicationImportTemplate.xlsx"; //設定要下載的檔案的名稱 response.setHeader("Content-disposition", "attachment;fileName=" + fileName); //通知客服檔案的MIME型別 response.setContentType("application/vnd.ms-excel;charset=UTF-8"); //獲取檔案的路徑 String filePath = getClass().getResource("/template/" + fileName).getPath(); FileInputStream input = new FileInputStream(filePath); OutputStream out = response.getOutputStream(); byte[] b = new byte[2048]; int len; while ((len = input.read(b)) != -1) { out.write(b, 0, len); } //修正 Excel在「xxx.xlsx」中發現不可讀取的內容。是否恢復此工作薄的內容?如果信任此工作簿的來源,請點選"是" response.setHeader("Content-Length", String.valueOf(input.getChannel().size())); input.close(); //return Response.ok("應用匯入模板下載完成"); } catch (Exception ex) { logger.error("getApplicationTemplate :", ex); //return Response.ok("應用匯入模板下載失敗!"); } //方法二:可以採用POI匯出excel,但是比較麻煩(這裡類似方法一) /*try { Workbook workbook = new HSSFWorkbook(); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/x-download"); String filedisplay = "匯入模板.xls"; filedisplay = URLEncoder.encode(filedisplay, "UTF-8"); response.addHeader("Content-Disposition", "attachment;filename="+ filedisplay); // 第二步,在webbook中新增一個sheet,對應Excel檔案中的sheet Sheet sheet = workbook.createSheet("匯入模板"); // 第三步,在sheet中新增表頭第0行 Row row = sheet.createRow(0); // 第四步,建立單元格,並設定值表頭 設定表頭居中 CellStyle style = workbook.createCellStyle(); style.setAlignment(CellStyle.ALIGN_CENTER); // 建立一個居中格式 Cell cell = row.createCell(0); cell.setCellValue("商品名稱"); cell.setCellStyle(style); sheet.setColumnWidth(0, (25 * 256)); //設定列寬,50個字元寬 cell = row.createCell(1); cell.setCellValue("商品編碼"); cell.setCellStyle(style); sheet.setColumnWidth(1, (20 * 256)); //設定列寬,50個字元寬 cell = row.createCell(2); cell.setCellValue("商品價格"); cell.setCellStyle(style); sheet.setColumnWidth(2, (15 * 256)); //設定列寬,50個字元寬 cell = row.createCell(3); cell.setCellValue("商品規格"); cell.setCellStyle(style); sheet.setColumnWidth(3, (15 * 256)); //設定列寬,50個字元寬 // 第五步,寫入實體資料 實際應用中這些資料從資料庫得到 row = sheet.createRow(1); row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(1); row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(2); row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(3); //商品價格 row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(4); //規格 // 第六步,將檔案存到指定位置 try { OutputStream out = response.getOutputStream(); workbook.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); }*/ }
模板位置:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45