目前操作Excel文件的框架都是基於POI進行封裝 這里列舉一個POI導出Excel的工具類 有導出單Sheet以及多Sheet的
maven依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> <type>jar</type> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency>
貼出工具類代碼
1 public class ExportExcelUtil { 2 3 /** 4 * * 5 * 6 * @param filename 保存到客戶端的文件名 例:用戶.xls 7 * @param title 標題行 例:String[]{"名稱","地址"} 8 * @param key 從查詢結果List取得的MAP的KEY順序, 9 * 需要和title順序匹配, 例:String[]{"name","address"} 10 * @param values 結果集 11 * @param httpServletResponse 12 * @throws IOException 13 */ 14 public static void createN(String filename, String[] title, String[] key, List<Map<String, Object>> values, HttpServletResponse httpServletResponse) throws IOException { 15 String filename2 = new String(filename.getBytes(), "iso-8859-1"); 16 ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream(); 17 XSSFWorkbook workbook = null; 18 httpServletResponse.setHeader("Content-disposition", "attachment; filename=" + filename2); 19 httpServletResponse.setContentType("application/x-download"); 20 workbook = new XSSFWorkbook(); 21 XSSFSheet sheet = workbook.createSheet(); 22 XSSFRow row = null; 23 XSSFCell cell = null; 24 row = sheet.createRow((short) 0); 25 for (int i = 0; title != null && i < title.length; i++) { 26 cell = row.createCell((short) i); 27 cell.setCellType(XSSFCell.CELL_TYPE_STRING); 28 cell.setCellValue(new XSSFRichTextString(title[i])); 29 } 30 31 38 Map map = null; 39 for (int i = 0; values != null && i < values.size(); i++) { 40 row = sheet.createRow((short) (i + 1)); 41 map = values.get(i); 42 for (int i2 = 0; i2 < key.length; i2++) { 43 cell = row.createCell((short) (i2)); 44 cell.setCellType(XSSFCell.CELL_TYPE_STRING); 45 if (map.get(key[i2]) == null) { 46 cell.setCellValue(new XSSFRichTextString("")); 47 } else { 48 cell.setCellValue(new XSSFRichTextString(map.get(key[i2]).toString())); 49 } 50 } 51 } 52 workbook.write(servletOutputStream); 53 servletOutputStream.flush(); 54 servletOutputStream.close(); 55 } 56 57 58 59 /** 60 * 創建多sheet頁 Excel表格 61 * @Author: Tan 62 * @Date: 2020/10/12 63 * @param fileName: 64 * @param response: 65 * @param list: 66 * @return: void 67 **/ 68 public static void multiSheetExport(String fileName,HttpServletResponse response,List<Map<String,Object>> list) throws Exception{ 69 String filename2 = new String(fileName.getBytes(), "iso-8859-1"); 70 ServletOutputStream servletOutputStream = response.getOutputStream(); 71 XSSFWorkbook workbook = null; 72 response.setHeader("Content-disposition", "attachment; filename=" + filename2); 73 response.setContentType("application/x-download"); 74 workbook = new XSSFWorkbook(); 75 for (Map<String, Object> map : list) { 76 XSSFSheet sheet = workbook.createSheet(); 77 workbook.setSheetName((int)map.get("sheetIndex"),(String)map.get("sheetName")); 78 createSheet(sheet,(String[])map.get("title"),(String[])map.get("key"),(List<Map<String,Object>>)map.get("values")); 79 } 80 workbook.write(servletOutputStream); 81 servletOutputStream.flush(); 82 servletOutputStream.close(); 83 } 84 85 /** 86 * 寫入指定sheet頁數據 87 * @Author: Tan 88 * @Date: 2020/10/12 89 * @param sheet: 90 * @param title: 91 * @param key: 92 * @param values: 93 * @return: void 94 **/ 95 public static void createSheet(XSSFSheet sheet,String[] title, String[] key, List<Map<String,Object>> values){ 96 97 XSSFRow row = null; 98 XSSFCell cell = null; 99 row = sheet.createRow((short) 0); 100 for (int i = 0; title != null && i < title.length; i++) { 101 cell = row.createCell((short) i); 102 cell.setCellType(XSSFCell.CELL_TYPE_STRING); 103 cell.setCellValue(new XSSFRichTextString(title[i])); 104 } 113 Map map = null; 114 for (int i = 0; values != null && i < values.size(); i++) { 115 row = sheet.createRow((short) (i + 1)); 116 map = values.get(i); 117 for (int i2 = 0; i2 < key.length; i2++) { 118 cell = row.createCell((short) (i2)); 119 cell.setCellType(XSSFCell.CELL_TYPE_STRING); 120 if (map.get(key[i2]) == null) { 121 cell.setCellValue(new XSSFRichTextString("")); 122 } else { 123 cell.setCellValue(new XSSFRichTextString(map.get(key[i2]).toString())); 124 } 125 } 126 } 127 } 128 129 130 131 132 133 }
導出單sheet的寫法 這些方法都是封裝了通過response下載文件,就是生成Excel並下載一步到位,如果需要生成文件而不下載 可以修改,傳入一個OutputStream即可,輸出到指定的流
1 public static void main(String[] args) { 2 //表頭 3 String[] title={"姓名","年齡","性別"}; 4 //和表頭順序對應 因為要導出的內容 都是從數據庫查詢出來的 都是k-v 5 String[] key={"name","age","sex"}; 6 //導出的集合 7 List<Map<String,Object>> list=new ArrayList<>(); 8 Map<String,Object> data1=new HashMap<>(); 9 data1.put("name","張三"); 10 data1.put("age","18"); 11 data1.put("sex","男"); 12 list.add(data1); 13 //導出 14 ExportExcelUtil.createN("文件名.xlsx",title,key,list,response); 15 }
如果你的數據是實體類對象,那么請轉成Map,百度方法很多,利用反射也可以轉
接下來貼出 多個sheet頁導出的demo,其實和導出單個差不多 只不過需要根據sheet頁的數量 創建多個sheet 寫入數據的步驟是一樣的,主要是演示怎么調用
public static void main(String[] args) { //存儲多個sheet頁 每一個元素代表一個sheet頁 List<Map<String,Object>> sheetList=new ArrayList<>(); //表頭 String[] title={"姓名","年齡","性別"}; //和表頭順序對應 因為要導出的內容 都是從數據庫查詢出來的 都是k-v String[] key={"name","age","sex"}; //導出的集合 List<Map<String,Object>> list=new ArrayList<>(); Map<String,Object> data1=new HashMap<>(); data1.put("name","張三"); data1.put("age","18"); data1.put("sex","男"); list.add(data1); //舉例一個sheet頁的配置 多個以此類推 Map<String,Object> sheet1=new HashMap<>(); //sheet頁的排序 從0開始 sheet1.put("sheetIndex",0); //sheet頁的名字 sheet1.put("sheetName","4G"); sheet1.put("title",title); sheet1.put("key",key); sheet1.put("values",list); list.add(sheet1); ExportExcelUtil.multiSheetExport("文件名.xlsx",response,sheetList); }