diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/annotation/Excel.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/annotation/Excel.java index 76a92f6..cdbea62 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/annotation/Excel.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/annotation/Excel.java @@ -47,6 +47,7 @@ public @interface Excel { * 导入的时间格式,以这个是否为空来判断是否需要格式化日期 */ public String importFormat() default ""; + /** * 文字后缀,如% 90 变成90% */ @@ -104,4 +105,11 @@ public @interface Excel { * 性别列4【男女占1,但是列标题两个汉字】 限制1-255 */ public int width() default 10; + + /** + * 是否自动统计数据,如果是统计,true的话在最后追加一行统计,把所有数据都和 + * 这个处理会吞没异常,请注意这一点 + * @return + */ + public boolean isStatistics() default false; } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExcelBaseParams.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExcelBaseParams.java index 5e1bf11..83aef57 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExcelBaseParams.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExcelBaseParams.java @@ -8,6 +8,15 @@ import org.jeecgframework.poi.handler.inter.IExcelDataHandler; * @date 2014年6月20日 下午1:56:52 */ public class ExcelBaseParams { + + /** + * 03版本Excel + */ + public static final String HSSF = "HSSF"; + /** + * 07版本Excel + */ + public static final String XSSF = "XSSF"; /** * 数据处理接口,以此为主,replace,format都在这后面 */ diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/params/ExcelExportEntity.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/params/ExcelExportEntity.java index 6fbf954..acd31e5 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/params/ExcelExportEntity.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/params/ExcelExportEntity.java @@ -54,6 +54,10 @@ public class ExcelExportEntity extends ExcelBaseEntity { * 后缀 */ private String suffix; + /** + * 统计 + */ + private boolean isStatistics; private List list; @@ -172,4 +176,12 @@ public class ExcelExportEntity extends ExcelBaseEntity { this.suffix = suffix; } + public boolean isStatistics() { + return isStatistics; + } + + public void setStatistics(boolean isStatistics) { + this.isStatistics = isStatistics; + } + } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java index 5218e1e..0541774 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java @@ -139,12 +139,16 @@ public class ExcelExportServer extends ExcelExportBase { its.next(); its.remove(); } + // 创建合计信息 + addStatisticsRow(styles.get("one"),sheet); + // 发现还有剩余list 继续循环创建Sheet if (dataSet.size() > 0) { createSheet(workbook, entity, pojoClass, dataSet, type); } } catch (Exception e) { + e.printStackTrace(); logger.error(e.getMessage(), e.fillInStackTrace()); throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause()); } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java index af7b08e..e7fa65b 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java @@ -4,6 +4,7 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -40,9 +41,13 @@ import org.jeecgframework.poi.util.POIPublicUtil; */ public abstract class ExcelExportBase extends ExportBase { - private int currentIndex = 0; + private int currentIndex = 0; - protected String type = PoiBaseConstants.HSSF; + protected String type = PoiBaseConstants.HSSF; + + private Map statistics = new HashMap(); + + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); private boolean checkIsEqualByCellContents(MergeEntity mergeEntity, String text, Cell cell, int[] delys, int rowNum) { @@ -259,6 +264,43 @@ public abstract class ExcelExportBase extends ExportBase { if (style != null) { cell.setCellStyle(style); } + addStatisticsData(index, text, entity); + } + + /** + * 创建统计行 + * @param styles + * @param sheet + */ + public void addStatisticsRow(CellStyle styles, Sheet sheet) { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + createStringCell(row, 0, "合计", styles, null); + for (Integer key : keys) { + createStringCell(row, key, DOUBLE_FORMAT.format(statistics.get(key)), styles, null); + } + statistics.clear(); + + } + + /** + * 合计统计信息 + * @param index + * @param text + * @param entity + */ + private void addStatisticsData(Integer index, String text, ExcelExportEntity entity) { + if (entity != null && entity.isStatistics()) { + Double temp = 0D; + if (!statistics.containsKey(index)) { + statistics.put(index, temp); + } + try { + temp = Double.valueOf(text); + } catch (NumberFormatException e) { + } + statistics.put(index, statistics.get(index) + temp); + } } /** diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java index 05e4680..c23f87c 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java @@ -203,6 +203,7 @@ public class ExportBase { excelEntity.setDatabaseFormat(excel.databaseFormat()); excelEntity.setFormat(StringUtils.isNotEmpty(excel.exportFormat()) ? excel.exportFormat() : excel.format()); + excelEntity.setStatistics(excel.isStatistics()); String fieldname = field.getName(); excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass)); } diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/CourseEntity.java b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/CourseEntity.java index ee5209e..cd7b678 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/CourseEntity.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/CourseEntity.java @@ -22,17 +22,17 @@ public class CourseEntity implements java.io.Serializable { /** 主键 */ private String id; /** 课程名称 */ - @Excel(name = "课程名称", orderNum = "1", needMerge = true) + @Excel(name = "课程名称", orderNum = "1", width = 15, needMerge = true) private String name; /** 老师主键 */ @ExcelEntity(id = "yuwen") @ExcelVerify() private TeacherEntity teacher; /** 老师主键 */ - @ExcelEntity(id = "shuxue") + //@ExcelEntity(id = "shuxue") private TeacherEntity shuxueteacher; - @ExcelCollection(name = "选课学生", orderNum = "4") + //@ExcelCollection(name = "选课学生", orderNum = "4") private List students; /** diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/StudentEntity.java b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/StudentEntity.java index d470d3a..13464ff 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/StudentEntity.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/StudentEntity.java @@ -25,20 +25,16 @@ public class StudentEntity implements java.io.Serializable { /** * 学生性别 */ - @Excel(name = "学生性别", replace = { "男_1", "女_2" },suffix = "生") + @Excel(name = "学生性别", replace = { "男_1", "女_2" }, suffix = "生", mergeVertical = true) private int sex; - @Excel(name = "出生日期", format = "yyyy-MM-dd HH:mm:ss", mergeVertical = true) + @Excel(name = "出生日期", databaseFormat = "yyyyMMddHHmmss", exportFormat = "yyyy-MM-dd", mergeVertical = true) private Date birthday; /** * 课程主键 */ private CourseEntity course; - public Date getBirthday() { - return birthday; - } - public CourseEntity getCourse() { return course; } @@ -70,10 +66,6 @@ public class StudentEntity implements java.io.Serializable { return this.sex; } - public void setBirthday(Date birthday) { - this.birthday = birthday; - } - public void setCourse(CourseEntity course) { this.course = course; } @@ -104,4 +96,13 @@ public class StudentEntity implements java.io.Serializable { public void setSex(int sex) { this.sex = sex; } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + } diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/TeacherEntity.java b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/TeacherEntity.java index 7f0a6d8..1398f94 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/TeacherEntity.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/TeacherEntity.java @@ -18,7 +18,7 @@ public class TeacherEntity implements java.io.Serializable { @Excel(name = "老师ID_teacherEntity,老师属性_courseEntity", orderNum = "2", needMerge = false) private String id; /** name */ - @Excel(name = "语文老师_yuwen,数学老师_shuxue", orderNum = "2", needMerge = true) + @Excel(name = "语文老师_yuwen,数学老师_shuxue", orderNum = "2", mergeVertical = true) private String name; /* diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/entity/statistics/StatisticEntity.java b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/statistics/StatisticEntity.java new file mode 100644 index 0000000..af9e171 --- /dev/null +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/entity/statistics/StatisticEntity.java @@ -0,0 +1,80 @@ +package org.jeecgframework.poi.entity.statistics; + +import java.math.BigDecimal; + +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * 统计测试类 + * @author JueYue + * @date 2014年12月17日 上午11:51:10 + */ +public class StatisticEntity { + + @Excel(name = "名称") + private String name; + + @Excel(name = "int 测试", width = 15, isStatistics = true) + private int intTest; + + @Excel(name = "long 测试", width = 15, isStatistics = true) + private long longTest; + + @Excel(name = "double 测试", width = 15, isStatistics = true) + private double doubleTest; + + @Excel(name = "string 测试", width = 15, isStatistics = true) + private String stringTest; + + @Excel(name = "BigDecimal 测试", width = 15, isStatistics = true) + private BigDecimal bigDecimalTest; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIntTest() { + return intTest; + } + + public void setIntTest(int intTest) { + this.intTest = intTest; + } + + public long getLongTest() { + return longTest; + } + + public void setLongTest(long longTest) { + this.longTest = longTest; + } + + public double getDoubleTest() { + return doubleTest; + } + + public void setDoubleTest(double doubleTest) { + this.doubleTest = doubleTest; + } + + public String getStringTest() { + return stringTest; + } + + public void setStringTest(String stringTest) { + this.stringTest = stringTest; + } + + public BigDecimal getBigDecimalTest() { + return bigDecimalTest; + } + + public void setBigDecimalTest(BigDecimal bigDecimalTest) { + this.bigDecimalTest = bigDecimalTest; + } + +} diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java new file mode 100644 index 0000000..a714c6f --- /dev/null +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportStatisticTest.java @@ -0,0 +1,45 @@ +package org.jeecgframework.poi.excel.test; + +import java.io.File; +import java.io.FileOutputStream; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.apache.poi.ss.usermodel.Workbook; +import org.jeecgframework.poi.entity.statistics.StatisticEntity; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; +import org.junit.Test; + +public class ExcelExportStatisticTest { + @Test + public void test() throws Exception { + + List list = new ArrayList(); + for (int i = 0; i < 250000; i++) { + StatisticEntity client = new StatisticEntity(); + client.setName("index" + i); + client.setIntTest(1 + i); + client.setLongTest(1 + i); + client.setDoubleTest(1.2D + i); + client.setBigDecimalTest(new BigDecimal(1.2 + i)); + client.setStringTest("12" + i); + list.add(client); + } + Date start = new Date(); + ExportParams params = new ExportParams("2412312", "测试"); + params.setType(ExportParams.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(params, StatisticEntity.class, list); + System.out.println(new Date().getTime() - start.getTime()); + File savefile = new File("d:/"); + if (!savefile.exists()) { + savefile.mkdirs(); + } + FileOutputStream fos = new FileOutputStream("d:/tt.xlsx"); + workbook.write(fos); + fos.close(); + } +} diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportUtilTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportUtilTest.java index 08a2cf4..cca07ca 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportUtilTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportUtilTest.java @@ -33,12 +33,9 @@ public class ExcelExportUtilTest { @Test public void oneHundredThousandRowTest() throws Exception { - for (int i = 0; i < 250; i++) { - list.add(courseEntity); - } Date start = new Date(); - Workbook workbook = ExcelExportUtil.exportExcel( - new ExportParams("2412312", "测试", "测试"), CourseEntity.class, list); + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("2412312", "测试"), + CourseEntity.class, list); System.out.println(new Date().getTime() - start.getTime()); File savefile = new File("d:/"); if (!savefile.exists()) { @@ -59,31 +56,31 @@ public class ExcelExportUtilTest { @Before public void testBefore() { - courseEntity = new CourseEntity(); - courseEntity.setId("1131"); - courseEntity.setName("小白"); - TeacherEntity teacherEntity = new TeacherEntity(); - teacherEntity.setId("12131231"); - teacherEntity.setName("你们"); - courseEntity.setTeacher(teacherEntity); + for (int i = 0; i < 2; i++) { + courseEntity = new CourseEntity(); + courseEntity.setId("1131"); + courseEntity.setName("海贼王必修(" + (i + 1) + ")"); - teacherEntity = new TeacherEntity(); - teacherEntity.setId("121312314312421131"); - teacherEntity.setName("老王"); - courseEntity.setShuxueteacher(teacherEntity); + TeacherEntity teacherEntity = new TeacherEntity(); + teacherEntity.setId("12131231"); + teacherEntity.setName("路飞"); + courseEntity.setTeacher(teacherEntity); - StudentEntity studentEntity = new StudentEntity(); - studentEntity.setId("11231"); - studentEntity.setName("撒旦法司法局"); - studentEntity.setBirthday(new Date()); - studentEntity.setSex(1); - List studentList = new ArrayList(); - studentList.add(studentEntity); - studentList.add(studentEntity); - courseEntity.setStudents(studentList); + teacherEntity = new TeacherEntity(); + teacherEntity.setId("121312314312421131"); + teacherEntity.setName("老王"); + courseEntity.setShuxueteacher(teacherEntity); - for (int i = 0; i < 3; i++) { + StudentEntity studentEntity = new StudentEntity(); + studentEntity.setId("11231"); + studentEntity.setName("撒旦法司法局"); + studentEntity.setBirthday(new Date()); + studentEntity.setSex(1); + List studentList = new ArrayList(); + studentList.add(studentEntity); + studentList.add(studentEntity); + courseEntity.setStudents(studentList); list.add(courseEntity); } } @@ -96,8 +93,8 @@ public class ExcelExportUtilTest { //@Test public void testExportExcel() throws Exception { Date start = new Date(); - Workbook workbook = ExcelExportUtil.exportExcel( - new ExportParams("2412312", "测试", "测试"), CourseEntity.class, list); + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("2412312", "测试", "测试"), + CourseEntity.class, list); System.out.println(new Date().getTime() - start.getTime()); File savefile = new File("d:/"); if (!savefile.exists()) {