【java】通过配置导出excel 您所在的位置:网站首页 et排料输出的文件名怎么设置 【java】通过配置导出excel

【java】通过配置导出excel

2023-07-31 06:25| 来源: 网络整理| 查看: 265

【java】通过配置导出excel

不定时更新一些自己写的代码

文章目录 【java】通过配置导出excel前言一、配置表二、Util类关键代码三、值表达式的配置总结

前言

写了挺多excel导出的代码了,这个算是自己比较满意的,记录下

一、配置表

T_EXPORT_EXCEL

ID导出excel模板IDEXCEL_NAME导出excel的文件名

T_EXPORT_SHEET

IDsheet页的IDSHEET_NAMEsheet页的名称EXCEL_IDEXCEL表IDSORTSHEET页在模板中的顺序

T_EXPORT_TAB

ID唯一主键HEAD表头VALUE_EXPRESS取值表达式VALUE_PARSER对取到的值进行封装SHEET_ID关联的SHEETSORT单元格在表格中的顺序 二、Util类关键代码

导出接口:

/** * excel导出 * * @return */ public static HSSFWorkbook exportExcel(List tabsCfg, List data, HSSFWorkbook wb, String sheetName) { List result = new ArrayList(); String[] heads = tabsCfg.stream().map(AntigenExportTab::getHead).collect(Collectors.toList()).toArray(new String[tabsCfg.size()]); List valueConfigs = tabsCfg.stream().map(AntigenExportTab::getValueExpress).collect(Collectors.toList()); List valueParsers = tabsCfg.stream().map(AntigenExportTab::getValueParser).collect(Collectors.toList()); JSONArray array = JSONArray.parseArray(JSONArray.toJSONString(data)); for (int i = 0; i if (valueCfg.startsWith("$")) { Object val = getVal(array.getJSONObject(i), valueCfg.substring(1)); valueMap.put(valueCfg, val); if (val instanceof List) { int size = ((List) val).size(); rowSpan = rowSpan if ("ROWNUM".equals(valueConfigs.get(0))) { rowData[0] = String.valueOf(result.size() + 1); } result.add(rowData); } } } // 此处封装了调用POI将生成的sheet页插入到wb中,别人写的现成的,我就没贴上来 return ExportExcelUtil.getHSSFWorkbook(sheetName, heads, result.toArray(new String[result.size()][]), wb); }

单行数据生成:

/** * 生成一行数据 * * @param valueConfigs * @param row * @param valueMap * @param valueParsers * @return */ private static String[] generateRowData(List valueConfigs, int row, Map valueMap, List valueParsers) { String[] rowData = new String[valueConfigs.size()]; for (int cell = 0; cell List vals = (List) value; if (vals.size() == 0) { // 子集合为空时保证有一条信息 rowData[cell] = ""; } else if (vals.size() - 1 >= row) { // 正常赋值 rowData[cell] = parsedExcelValue(vals.get(row), valueParser); } else { // 越界 return null; } } else { rowData[cell] = parsedExcelValue((String) value, valueParser); } } return rowData; }

对取到的值进行封装:

private static String parsedExcelValue(String value, String parser) { if (StringUtils.isEmpty(value) || StringUtils.isEmpty(parser)) { return value; } try { if (parser.startsWith("ArrayJSON_")) { return arrayJsonParser(value, parser); } if (parser.startsWith("ArrayJSON0_")) { return arrayJsonParser0(value, parser); } if (parser.startsWith("ArrayJSONS_")) { return arrayJsonParserS(value, parser); } switch (parser) { // 此处有一些一些业务上的特殊字段的处理,我删掉了 default: return value; } } catch (Exception e) { return value; } }

取数组的第N个字符串:

private static String arrayJsonParser(String value, String parser) { Integer index = Integer.valueOf(parser.replace("ArrayJSON_", "")) - 1; JSONArray array = JSONArray.parseArray(value); return index >= 0 && array.size() > index ? array.getString(index) : ""; }

取数组的第1个元素中的对应value:

private static String arrayJsonParser0(String value, String parser) { JSONArray array = JSONArray.parseArray(value); return array.size() > 0 ? array.getJSONObject(0).getString(parser.replace("ArrayJSON0_", "")) : ""; }

取数组的中元素的parser对应value:

JSONArray array = JSONArray.parseArray(value); if (array.isEmpty()) { return ""; } String format = parser.replace("ArrayJSONS_", ""); List placeHolders = parses(format); StringBuilder sb = new StringBuilder(); for (int i = 0; i String placeHolder = placeHolders.get(j); str = str.replace(placeHolder, o.getString(placeHolder.substring(1, placeHolder.length() - 1))); } if (sb.length() > 0) { sb.append("\n"); } sb.append(str); } return sb.toString();

上面调用到的子方法,做了个小缓存:

private static List parses(String str) { if (parsesMap.containsKey(str)) { return parsesMap.get(str); } String pattern = "(\\{[\\s\\S]+?\\})"; Pattern r = Pattern.compile(pattern); // 现在创建 matcher 对象 Matcher m = r.matcher(str); List placeHolder = new ArrayList(); while (m.find()) { placeHolder.add(m.group(0)); } parsesMap.put(str, placeHolder); return placeHolder; } private static Map parsesMap = new ConcurrentHashMap();

按表达式读取值:

private static Object getVal(JSONObject obj, String keyExpression) { if (obj == null) { return ""; } int mapInd = keyExpression.indexOf('.'); int listInd = keyExpression.indexOf('-'); String temp = keyExpression.substring(1); int mSub = temp.indexOf('.'); int lSub = temp.indexOf('-'); if (mSub == -1 && lSub == -1) { if (obj.containsKey(temp)) { return keyExpression.startsWith("-") ? obj.getJSONArray(temp).toJSONString() : StringUtils.defaultIfBlank(obj.getString(temp), ""); } else { return ""; } } int ind = getNextSplitInd(mSub, lSub); String key = temp.substring(0, ind); String expression = temp.substring(ind); if (mapInd == 0) { // map JSONObject o = obj.getJSONObject(key); return getVal(o, expression); } if (listInd == 0) { // list JSONArray array = obj.getJSONArray(key); List result = new ArrayList(); if (array == null) { return result; } for (int i = 0; i result.add((String) val); } } return result; } return ""; }

下一个分隔符的位置:

private static int getNextSplitInd(int a, int b) { if (a return a > b ? b : a; } else { return a > 0 ? a : b; } } 三、值表达式的配置

JSON如下(示例):

[ { "className":"三年一班", "chargeTeacher":{ "name":"孙老师", "age":55, "sampling":[ { "site":"校门口", "time":"202204014 12:00:00" }, { "site":"校门口", "time":"202204013 12:00:00" } ] }, "students":[ { "name":"张三", "strongPoint":"[{\"point\":\"篮球\",\"awards\":\"市一等奖\"},{\"point\":\"乒乓球\",\"awards\":null}\"]", "voluntary":"[\"清华\",\"北大\"]", "sampling":[ { "site":"校门口", "time":"202204014 12:00:00" }, { "site":"校门口", "time":"202204013 12:00:00" } ] }, { "name":"李四" } ] }, { "className":"三年二班", "chargeTeacher":{ "name":"李老师", "age":50 }, "students":[ { "name":"王五" } ] } ]

配置如下(示例):

T_EXPORT_EXCEL

IDEXCEL_NAME1班级信息导出

T_EXPORT_SHEET

IDSHEET_NAMEEXCEL_IDSORT1班主任信息112学生信息12

T_EXPORT_TAB

IDHEADVALUE_EXPRESSVALUE_PARSERSHEET_IDSORT11班级$.className1112班主任$.chargeTeacher.name1213最新核酸采样时间$.chargeTeacher.samplingArrayJSON0_time1321班级$.className2122姓名$-students.name2223最新核酸采样时间$-students.samplingArrayJSON0_time2324第一志愿$-students.voluntaryArrayJSON_12425第二志愿$-students.voluntaryArrayJSON_22526特长$-students.strongPointArrayJSONS_{point}:奖项{awards}26 总结

差不多了,记录下来万一哪天用得上过来ctrl+cv一下。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有