java按照xls模板,实现导出


/**
 * jxl2导出工具类
 * 
 * @Description 

* *

*

* Company:/ *

* @author * @version 1.0 * @Date 2018年7月9日 * @Rewrite 修改记录 */
public class JxlsUtils { /** jxls模版文件目录 */ private final static String TEMPLATE_PATH = "excel"; /** * 导出excel * * @param is * - excel文件流 * @param os * - 生成模版输出流 * @param beans * - 模版中填充的数据 * @throws IOException */ public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> beans) throws IOException { Context context = new Context(); if (beans != null) { for (String key : beans.keySet()) { context.putVar(key, beans.get(key)); } } JxlsHelper jxlsHelper = JxlsHelper.getInstance(); Transformer transformer = jxlsHelper.createTransformer(is, os); JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer .getTransformationConfig().getExpressionEvaluator(); Map<String, Object> funcs = new HashMap<String, Object>(); funcs.put("jx", new JxlsUtils()); // 添加自定义功能 evaluator.getJexlEngine().setFunctions(funcs); jxlsHelper.processTemplate(context, transformer); os.close(); is.close(); } /** * 导出excel * * @param xlsPath * excel文件 * @param outPath * 输出文件 * @param beans * 模版中填充的数据 * @throws IOException * @throws FileNotFoundException */ public static void exportExcel(String xlsPath, String outPath, Map<String, Object> beans) throws FileNotFoundException, IOException { exportExcel(new FileInputStream(xlsPath), new FileOutputStream(outPath), beans); } /** * 导出excel(直接导出到固定目录) * * @param xls * excel文件 * @param out * 输出文件 * @param beans * 模版中填充的数据 * @throws IOException * @throws FileNotFoundException */ public static void exportExcel(File xls, File out, Map<String, Object> beans) throws FileNotFoundException, IOException { exportExcel(new FileInputStream(xls), new FileOutputStream(out), beans); } /** * 导出excel(带下载) * * @param templatePath * excel模板在resources/excel下的相对路径,例如:jbxx/JBXXML_EXPORT.xlsx * @param fileName * 下载文件默认文件名 * @param beans * 模版中填充的数据,将要导出的额数据放到bean里面 * @throws IOException * @throws FileNotFoundException */ public static void exportExcel(String templatePath, String fileName, Map<String, Object> beans, HttpServletResponse response) throws FileNotFoundException, IOException { // 初始化导出模板 File templateFile = JxlsUtils.getTemplate(templatePath); String[] temps = templatePath.split("\\."); String suffix = temps[temps.length - 1]; // 初始化导出临时文件 String excelPath = JxlsUtils.class.getClassLoader() .getResource(TEMPLATE_PATH).getPath(); UserContext userContext = ContextHolder.getUserContext();// 获取用户信息 String tmpName = "tmp_" + userContext.getUserId() + "." + suffix; File outFile = new File(excelPath.replaceAll("%20", " "), tmpName); // 导出到临时文件 exportExcel(new FileInputStream(templateFile), new FileOutputStream( outFile), beans); // 根据临时文件下载 downFile(outFile, fileName, response); } public static void downFile(File file, String fileName, HttpServletResponse response) throws IOException { String[] temps = file.getName().split("\\."); String suffix = temps[temps.length - 1]; // 设置文件名 fileName = fileName.split("\\.")[0] + "." + suffix; // 1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8"); // 设置文件名编码 response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); InputStream inputStream = new FileInputStream(file); // 3.通过response获取ServletOutputStream对象(out) ServletOutputStream out = response.getOutputStream(); int b = 0; byte[] buffer = new byte[512]; while (b != -1) { b = inputStream.read(buffer); // 4.写到输出流(out)中 out.write(buffer); } inputStream.close(); out.close(); out.flush(); } /** * 获取jxls模版文件 */ public static File getTemplate(String name) { String templatePath = JxlsUtils.class.getClassLoader() .getResource(TEMPLATE_PATH).getPath(); File template = new File(templatePath.replaceAll("%20", " "), name); if (template.exists()) { return template; } return null; } // 日期格式化 public String dateFmt(Date date, String fmt) { if (date == null) { return null; } try { SimpleDateFormat dateFmt = new SimpleDateFormat(fmt); return dateFmt.format(date); } catch (Exception e) { e.printStackTrace(); } return null; } // 返回第一个不为空的对象 public Object defaultIfNull(Object... objs) { for (Object o : objs) { if (o != null) return o; } return null; } // if判断 public Object ifelse(boolean b, Object o1, Object o2) { return b ? o1 : o2; } // 超链接 public WritableCellValue myHyperlink(String address, String title) { return new WritableHyperlink(address, title); } /** * 导出设置背景颜色、生成下拉菜单 * @Description 描述 * @author * @version 版本 * @param map:当前行的数据 * @param columns:单元格对应的字段 * @param splitItem:下拉看选项,如果为null或者空字符串,认为不设置下拉选项 * @return * @return WritableCellValue * @lastAuthor * @lastDate 2018年7月27日 * @Rewrite 修改记录 */ public WritableCellValue showColorAndDownlist(Map<String,Object> map,String columns,String splitItem){ return new ColorAndDroupCellValue(map, columns, splitItem); } // 按值显示背景色 public WritableCellValue showColor(Map<String,Object> map,String columns) { return new ColorCellValue(map, columns); } // 生成下拉菜单 public WritableCellValue downlist(String splitItem, String value) { return new DropdownCellValue(splitItem, value); } } Controler层 @RequestMapping("/excelJb") @ResponseBody public void excelJb(HttpServletResponse response, @RequestParam(value = "arrStr") String arrStr, Ke40Dto ke40Dto) { try { //用来存查询出的数据 HashMap<String, Object> beans = new HashMap<>(); arrStr = arrStr.substring(0, arrStr.length() - 1); //调用service层查询要导出的数据 List<Map<String, Object>> downList = bfshService.nTRExcelJb("410000", arrStr); beans.put("rows", downList); //模板路径 String templatePath = "sb/JBXX.xls"; //导出模板命名 String fileName = "经办信息"; //执行导出 JxlsUtils.exportExcel(templatePath, fileName, beans, response); } catch (Exception ex) { RecordLog.errorlog(this.getClass().getName(), ex.toString().replaceAll("\"", "'").replaceAll("\n", ""), "错误编码", arrStr); } } serivce层 @Override public List<Map<String, Object>> nTRExcelJb(String aaa027,String bke168) { //查询出的数据返回 List<Map<String, Object>> list = new ArrayList<>(); //调用Dao层查询导出的数据 List<Ke40Dto> ke40Dtos = bfshDao.Jbcxexcel(bke168); //遍历查询出的对象,并将所需要展示再exl中的数据存储到map中 for (Ke40Dto ke40Dto1 : ke40Dtos){ Map<String, Object> map = new HashMap<>(); //解析json字符串 Ke40Dto ke40Dto = JsonUtils.toBean(ke40Dto1.getBaa008(), Ke40Dto.class); String baf002 = ""; if (StringUtils.isNotEmpty(ke40Dto.getBae119())){ baf002 = DBUtils.getString("select distinct baf002 from af12 where bae119 =? ", new Object[]{ ke40Dto.getBae119()}); //付款人开户行 } map.put("aaa027",ke40Dto1.getAaa027());//经办机构编码 map.put("aae008",ke40Dto1.getAae008());//大行编码 map.put("aae009",ke40Dto.getAae009());//开户人名称 map.put("aae010",ke40Dto.getAae010());//银行账号 map.put("bae119",ke40Dto.getBae119());//大额联行号 map.put("baf002",baf002);//开户行名称 map.put("aae030",ke40Dto1.getAae030());//开始日期 map.put("aae031",ke40Dto1.getAae031());//结束日期 list.add(map); } return list; } Dao层 查询所需要导出的数据 public List<Ke40Dto> Jbcxexcel(String bke168 ){ StringBuffer sql = new StringBuffer(); List<Object> params = new ArrayList<>(); sql.append(" select b.bke168, b.aab034, b.aaa027,b.aae140,b.baa004,b.baa009, b.aae030,b.aae031, b.aae100,b.baa008"); sql.append(" from ke40 b where b.aae100 = '1' and b.baa004 in ( '300001','300002','300003') and b.aae100 = '1'"); sql.append(" and to_char(sysdate, 'yyyyMMdd') between b.aae030 AND nvl(b.aae031, '30000101')"); sql.append(" and b.bke168 in (").append(bke168).append(")"); return DBUtils.query(sql.toString(), Ke40Dto.class, params.toArray()); }

java按照xls模板,实现导出_第1张图片

java按照xls模板,实现导出_第2张图片

注:模板中的备注必须要加,模板导出按照备注中设置的,遍历放进xls中;模板中的字段必须与Service中设置的相对应。否则取不到值

你可能感兴趣的:(java)