excel导出优化
Posted zhengyuanyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel导出优化相关的知识,希望对你有一定的参考价值。
先贴出导出方法:
@SuppressWarnings("unused") public static <T> SXSSFWorkbook export1(HttpServletResponse response, String fileName, String[] excelHeader, List<T> dataList) throws Exception { response.setContentType("application/x-download"); response.setCharacterEncoding("utf-8");// 处理编码问题 response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");// 表头编码问题 XSSFWorkbook wb = new XSSFWorkbook(); SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(wb, 100); SXSSFSheet sheet = sxssfWorkbook.createSheet(); // Sheet sheet = sxssfWorkbook.getSheetAt(0); // 标题数组 String[] titleArray = new String[excelHeader.length]; // 字段名数组 String[] fieldArray = new String[excelHeader.length]; for (int i = 0; i < excelHeader.length; i++) { String[] tempArray = excelHeader[i].split("#"); titleArray[i] = tempArray[0]; fieldArray[i] = tempArray[1]; } // 在sheet中添加标题行 sheet.trackAllColumnsForAutoSizing(); Row row = sheet.createRow(0);// 行数从0开始 // 自动设置宽度 sheet.autoSizeColumn(0); // 设置表格默认列宽度 sheet.setDefaultColumnWidth(20); // 为标题行赋值 for (int i = 0; i < titleArray.length; i++) { // 需要序号就需要+1 因为0号位被序号占用 Cell titleCell = row.createCell(i); titleCell.setCellValue(titleArray[i]); sheet.autoSizeColumn(i + 1); // 0 号被序号占用 } Map<String, Method> map = new HashMap<String, Method>(); for (int index = 1; index < dataList.size(); index++) { row = sheet.createRow(index); // 利用反射 根据传过来的字段名数组,动态调用对应的getxxx()方法得到属性值 long start = System.currentTimeMillis(); for (int i = 0; i < fieldArray.length; i++) { // 需要序号 就需要 i+1 Cell dataCell = row.createCell(i); String fieldName = fieldArray[i]; // 取得对应的getxxx()方法 实体类命名一定要用驼峰才能分割成功 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Method getMethod = map.get(getMethodName); if(getMethod == null){ // Class<? extends Object> tCls = t.getClass();// 泛型为Object以及所有Object的子类 getMethod = dataList.get(index).getClass().getMethod(getMethodName);// 通过方法名得到对应的方法 getMethod.setAccessible(true); map.put(getMethodName, getMethod); } Object value = getMethod.invoke(dataList.get(index));// 动态调用方法,得到属性值 if (value != null) { dataCell.setCellValue(value.toString());// 为当前列赋值 } } long end = System.currentTimeMillis(); System.out.println("循环花费的时间:"+(end-start)+" milliseconds"); } OutputStream outputStream = response.getOutputStream();// 打开流 sxssfWorkbook.write(outputStream);// HSSFWorkbook写入流 sxssfWorkbook.close();// HSSFWorkbook关闭 outputStream.flush();// 刷新流 outputStream.close();// 关闭流 return sxssfWorkbook; }
这里的是自定义字段导出的,其中excelHeader是通过#分割的,例如“用户名#username”的数组。
以上是关于excel导出优化的主要内容,如果未能解决你的问题,请参考以下文章