From 9da06b5cd4e1ad7b59b397e4f2c378bbc645a8de Mon Sep 17 00:00:00 2001 From: jueyue Date: Tue, 5 May 2015 01:05:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=87=A0=E4=B8=AAbu?= =?UTF-8?q?g,=E5=AF=BC=E5=85=A5=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=BF=BD=E7=95=A5=E6=9C=80=E5=90=8E=E5=87=A0=E8=A1=8C?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0,=E5=8A=A0=E5=85=A5=E4=BA=86$fe?= =?UTF-8?q?=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../poi/excel/entity/ImportParams.java | 12 +++++++++++ .../template/ExcelExportOfTemplateUtil.java | 20 ++++++++++++------ .../poi/excel/imports/ExcelImportServer.java | 3 ++- .../jeecgframework/poi/util/PoiElUtil.java | 1 + .../poi/util/PoiFunctionUtil.java | 8 +++---- .../poi/test/excel/doc/foreach.xlsx | Bin 9801 -> 10534 bytes .../excel/template/TemplateForEachTest.java | 2 +- 8 files changed, 34 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ec0901d..203a1d9 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ EasyPoi 模板 表达式支持 - fn: 格式化数字 {{fn:(obj;###.00)}} - fe: 遍历数据,创建row - !fe: 遍历数据不创建row +- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入 - !if: 删除当前列 {{!if:(test)}} - 单引号表示常量值 '' 比如'1' 那么输出的就是 1 diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ImportParams.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ImportParams.java index 3ea76d0..bba0fc0 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ImportParams.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ImportParams.java @@ -58,6 +58,10 @@ public class ImportParams extends ExcelBaseParams { * 校验处理接口 */ private IExcelVerifyHandler verifyHanlder; + /** + * 最后的无效行数 + */ + private int lastOfInvalidRow; public int getHeadRows() { return headRows; @@ -123,4 +127,12 @@ public class ImportParams extends ExcelBaseParams { this.verifyHanlder = verifyHanlder; } + public int getLastOfInvalidRow() { + return lastOfInvalidRow; + } + + public void setLastOfInvalidRow(int lastOfInvalidRow) { + this.lastOfInvalidRow = lastOfInvalidRow; + } + } 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 7d6397d..874acfb 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 @@ -350,8 +350,9 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { private void addListDataToExcel(Cell cell, Map map, String name) throws Exception { boolean isCreate = !name.contains(FOREACH_NOT_CREATE); - name = name.replace(FOREACH_NOT_CREATE, EMPTY).replace(FOREACH, EMPTY) - .replace(START_STR, EMPTY); + boolean isShift = name.contains(FOREACH_AND_SHIFT); + name = name.replace(FOREACH_NOT_CREATE, EMPTY).replace(FOREACH_AND_SHIFT, EMPTY) + .replace(FOREACH, EMPTY).replace(START_STR, EMPTY); String[] keys = name.replaceAll("\\s{1,}", " ").trim().split(" "); Collection datas = (Collection) PoiPublicUtil.getParamsValue(keys[0], map); List columns = getAllDataColumns(cell, name.replace(keys[0], EMPTY)); @@ -367,6 +368,12 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { cell.getRow().setHeight(columns.get(0).getHeight()); setForEeachCellValue(isCreate, cell.getRow(), cell.getColumnIndex(), t, columns, map); } + if (isShift) { + cell.getRow() + .getSheet() + .shiftRows(cell.getRowIndex() + 1, cell.getRow().getSheet().getLastRowNum(), + datas.size() - 1, true, true); + } while (its.hasNext()) { Object t = its.next(); if (isCreate) { @@ -398,14 +405,13 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { } map.put(teplateParams.getTempParams(), t); String val = eval(tempStr, map).toString(); - if (isNumber) { + if (isNumber && StringUtils.isNoneEmpty(val)) { row.getCell(i + columnIndex).setCellValue(Double.parseDouble(val)); row.getCell(i + columnIndex).setCellType(Cell.CELL_TYPE_NUMERIC); - row.getCell(i + columnIndex).setCellStyle(columns.get(i).getCellStyle()); } else { row.getCell(i + columnIndex).setCellValue(val); - row.getCell(i + columnIndex).setCellStyle(columns.get(i).getCellStyle()); } + row.getCell(i + columnIndex).setCellStyle(columns.get(i).getCellStyle()); tempCreateCellSet.add(row.getRowNum() + "_" + (i + columnIndex)); } @@ -419,10 +425,10 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { */ private List getAllDataColumns(Cell cell, String name) { List columns = new ArrayList(); + cell.setCellValue(""); if (name.contains(END_STR)) { columns.add(new ExcelTemplateParams(name.replace(END_STR, EMPTY).trim(), cell .getCellStyle(), cell.getRow().getHeight())); - cell.setCellValue(""); return columns; } columns.add(new ExcelTemplateParams(name.trim(), cell.getCellStyle(), cell.getRow() @@ -444,7 +450,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { throw new ExcelExportException("for each 当中存在空字符串,请检查模板"); } //把读取过的cell 置为空 - cell.setCellValue(""); + tempCell.setCellValue(""); if (cellStringString.contains(END_STR)) { columns.add(new ExcelTemplateParams(cellStringString.trim().replace(END_STR, ""), tempCell.getCellStyle(), tempCell.getRow().getHeight())); diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java index a98bcbb..1849a36 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java @@ -191,7 +191,8 @@ public class ExcelImportServer extends ImportBaseService { Row row = null; Object object = null; String picId; - while (rows.hasNext()) { + while (rows.hasNext() + && sheet.getLastRowNum() - row.getRowNum() > params.getLastOfInvalidRow()) { row = rows.next(); // 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 if ((row.getCell(params.getKeyIndex()) == null || StringUtils.isEmpty(getKeyValue(row diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiElUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiElUtil.java index 2a860ed..76287e8 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiElUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiElUtil.java @@ -29,6 +29,7 @@ public final class PoiElUtil { public static final String LENGTH = "le:"; public static final String FOREACH = "fe:"; public static final String FOREACH_NOT_CREATE = "!fe:"; + public static final String FOREACH_AND_SHIFT = "$fe:"; public static final String START_STR = "{{"; public static final String END_STR = "}}"; public static final String NUMBER_SYMBOL = "n:"; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiFunctionUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiFunctionUtil.java index d60a042..b60b3d0 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiFunctionUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/util/PoiFunctionUtil.java @@ -98,7 +98,7 @@ public final class PoiFunctionUtil { * @return */ public static String formatDate(Object obj, String format) { - if (obj == null) { + if (obj == null || obj.toString() == "") { return ""; } SimpleDateFormat dateFormat = null; @@ -148,11 +148,11 @@ public final class PoiFunctionUtil { * @return */ private static boolean isGt(Object first, Object second) { - if (first == null) { + if (first == null || first.toString() == "") { return false; } - if (second == null) { - return false; + if (second == null || second.toString() == "") { + return true; } double one = Double.valueOf(first.toString()); double two = Double.valueOf(second.toString()); 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 index be6702f020e308cde6286759447cb5bf1867cc82..523a44e5f17fa179e3253f9685af5c20369963e5 100644 GIT binary patch delta 3961 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 F`xiTCR#pH2 delta 3202 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 mapList = new ArrayList>(); for (int i = 0; i < 4; i++) { Map testMap = new HashMap();