From 148967a6e5585a786b8551fdb2619dcc3ee89a8b Mon Sep 17 00:00:00 2001 From: jueyue Date: Sat, 4 Apr 2015 23:45:52 +0800 Subject: [PATCH] =?UTF-8?q?Excel=E7=9A=84ForEach=20=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++- .../template/ExcelExportOfTemplateUtil.java | 122 +++++++++++++++++- .../poi/test/excel/doc/foreach.xlsx | Bin 0 -> 9144 bytes .../template/TemplateExcelExportTest.java | 2 +- .../excel/template/TemplateForEachTest.java | 64 +++++++++ 5 files changed, 194 insertions(+), 9 deletions(-) create mode 100644 easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/doc/foreach.xlsx create mode 100644 easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateForEachTest.java diff --git a/README.md b/README.md index 6a5b184..0280ba8 100644 --- a/README.md +++ b/README.md @@ -248,4 +248,17 @@ EasyPoi导出实例 for (int i = 0; i < result.getList().size(); i++) { System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i))); } -``` +``` + +9.Excel 导出的ForEach **Angelia**的需求 可以到处更加复杂的模板Excel了 + + foreach提供两个语法写法 + + 1.createRow的 + foreach||entitylist{{accountType projectName approvedAmount amountApplied}} + foreach开头,|| 后面是map的key,{{这个里面是各个属性值}} + 2.不createRow的,如果row不够了还是会create,但是首先会用现成的 + !foreach||entitylist{{accountType projectName approvedAmount amountApplied}} + !foreach开头,|| 后面是map的key,{{这个里面是各个属性值}} + + demo是TemplateForEachTest diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/template/ExcelExportOfTemplateUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/template/ExcelExportOfTemplateUtil.java index 2e0d90a..615d5d5 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/template/ExcelExportOfTemplateUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/template/ExcelExportOfTemplateUtil.java @@ -5,9 +5,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.Cell; @@ -38,7 +40,12 @@ import org.slf4j.LoggerFactory; */ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { - private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExportOfTemplateUtil.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(ExcelExportOfTemplateUtil.class); + /** + * 缓存temp 的for each创建的cell ,跳过这个cell的模板语法查找,提高效率 + */ + private Set tempCreateCellSet = new HashSet(); /** * 往Sheet 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射 @@ -242,12 +249,16 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { } private void parseTemplate(Sheet sheet, Map map) throws Exception { - Iterator rows = sheet.rowIterator(); - Row row; - while (rows.hasNext()) { - row = rows.next(); + Row row = null; + int index = 0; + while (index <= sheet.getLastRowNum()) { + row = sheet.getRow(index++); for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { - setValueForCellByMap(row.getCell(i), map); + if (!tempCreateCellSet.contains(row.getRowNum() + "_" + + row.getCell(i).getColumnIndex())) { + System.out.println(row.getCell(i).getStringCellValue()); + setValueForCellByMap(row.getCell(i), map); + } } } } @@ -265,7 +276,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { } catch (Exception e) { return; } - if (oldString != null && oldString.indexOf("{{") != -1) { + if (oldString != null && oldString.indexOf("{{") != -1 && !oldString.contains("foreach||")) { // setp 2. 判断是否含有解析函数 String params; while (oldString.indexOf("{{") != -1) { @@ -275,6 +286,103 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { } cell.setCellValue(oldString); } + //判断foreach 这种方法 + if (oldString != null + && (oldString.trim().startsWith("foreach||") || oldString.trim().startsWith( + "!foreach||"))) { + addListDataToExcel(cell, map, oldString.trim()); + } + } + + /** + * 利用foreach循环输出数据 + * @param cell + * @param map + * @param oldString + * @throws Exception + */ + private void addListDataToExcel(Cell cell, Map map, String name) + throws Exception { + boolean isCreate = !name.startsWith("!"); + Collection datas = (Collection) map.get(name.substring(name.indexOf("||") + 2, + name.indexOf("{{"))); + List columns = getAllDataColumns(cell, name); + if (datas == null) { + return; + } + Iterator its = datas.iterator(); + Row row; + int rowIndex = cell.getRow().getRowNum() + 1; + //处理当前行 + if (its.hasNext()) { + Object t = its.next(); + setForEeachCellValue(isCreate, cell.getRow(), cell.getColumnIndex(), t, columns); + } + while (its.hasNext()) { + Object t = its.next(); + if (isCreate) { + row = cell.getRow().getSheet().createRow(rowIndex++); + } else { + row = cell.getRow().getSheet().getRow(rowIndex++); + if (row == null) { + row = cell.getRow().getSheet().createRow(rowIndex - 1); + } + } + setForEeachCellValue(isCreate, row, cell.getColumnIndex(), t, columns); + } + } + + private void setForEeachCellValue(boolean isCreate, Row row, int columnIndex, Object t, + List columns) throws Exception { + for (int i = 0, max = columnIndex + columns.size(); i < max; i++) { + if (row.getCell(i) == null) + row.createCell(i); + } + for (int i = 0, max = columns.size(); i < max; i++) { + String val = getValueDoWhile(t, columns.get(i).split("\\."), 0); + row.getCell(i + columnIndex).setCellValue(val); + tempCreateCellSet.add(row.getRowNum() + "_" + (i + columnIndex)); + } + + } + + /** + * 获取迭代的数据的值 + * @param cell + * @param name + * @return + */ + private List getAllDataColumns(Cell cell, String name) { + List columns = new ArrayList(); + if (name.contains("}}")) { + columns.add(name.substring(name.indexOf("{{") + 2, name.indexOf("}}")).trim()); + cell.setCellValue(""); + return columns; + } + columns.add(name.substring(name.indexOf("{{") + 2).trim()); + int index = cell.getColumnIndex(); + Cell tempCell; + while (true) { + tempCell = cell.getRow().getCell(++index); + String cellStringString; + try {//不允许为空 + cellStringString = tempCell.getStringCellValue(); + if (StringUtils.isBlank(cellStringString)) { + throw new RuntimeException(); + } + } catch (Exception e) { + throw new ExcelExportException("for each 当中存在空字符串,请检查模板"); + } + cell.setCellValue(""); + if (cellStringString.contains("}}")) { + columns.add(cellStringString.trim().replace("}}", "")); + break; + } else { + columns.add(cellStringString.trim()); + } + + } + return columns; } /** diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/doc/foreach.xlsx b/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/doc/foreach.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..09a895e2b1055fe765d576971ebfdead87190e07 GIT binary patch literal 9144 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 literal 0 HcmV?d00001 diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateExcelExportTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateExcelExportTest.java index 98f613a..59a1488 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateExcelExportTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateExcelExportTest.java @@ -29,7 +29,7 @@ public class TemplateExcelExportTest { @Test public void test() throws Exception { TemplateExportParams params = new TemplateExportParams( - "org/jeecgframework/poi/excel/doc/专项支出用款申请书.xls"); + "org/jeecgframework/poi/test/excel/doc/专项支出用款申请书.xls"); params.setHeadingStartRow(3); params.setHeadingRows(2); params.setStyle(ExcelExportStylerColorImpl.class); diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateForEachTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateForEachTest.java new file mode 100644 index 0000000..8d765b8 --- /dev/null +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/test/excel/template/TemplateForEachTest.java @@ -0,0 +1,64 @@ +package org.jeecgframework.poi.test.excel.template; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.poi.ss.usermodel.Workbook; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.TemplateExportParams; +import org.jeecgframework.poi.excel.export.styler.ExcelExportStylerColorImpl; +import org.jeecgframework.poi.test.entity.temp.BudgetAccountsEntity; +import org.jeecgframework.poi.test.entity.temp.PayeeEntity; +import org.jeecgframework.poi.test.entity.temp.TemplateExcelExportEntity; +import org.junit.Test; + +import com.google.common.collect.Lists; + +public class TemplateForEachTest { + + @Test + public void test() throws Exception { + TemplateExportParams params = new TemplateExportParams( + "org/jeecgframework/poi/test/excel/doc/foreach.xlsx"); + Map map = new HashMap(); + List list = new ArrayList(); + + for (int i = 0; i < 4; i++) { + TemplateExcelExportEntity entity = new TemplateExcelExportEntity(); + entity.setIndex(i + 1 + ""); + entity.setAccountType("开源项目"); + entity.setProjectName("EasyPoi " + i + "期"); + entity.setAmountApplied(i * 10000 + ""); + entity.setApprovedAmount((i + 1) * 10000 - 100 + ""); + list.add(entity); + } + map.put("entitylist", list); + List> mapList = new ArrayList>(); + for (int i = 0; i < 4; i++) { + Map testMap = new HashMap(); + + testMap.put("id", i); + testMap.put("name", "小明" + i); + testMap.put("sex", "man"); + mapList.add(testMap); + } + map.put("maplist", mapList); + Workbook workbook = ExcelExportUtil.exportExcel(params, map); + File savefile = new File("d:/"); + if (!savefile.exists()) { + savefile.mkdirs(); + } + FileOutputStream fos = new FileOutputStream("d:/foreach.xlsx"); + workbook.write(fos); + fos.close(); + workbook = ExcelExportUtil.exportExcel(params, map); + fos = new FileOutputStream("d:/foreach2.xlsx"); + workbook.write(fos); + fos.close(); + } + +}