From caa7b9e4f11263c7729d74f6ebe5d85e8ee9c1f5 Mon Sep 17 00:00:00 2001 From: thinkgem Date: Wed, 17 Jan 2018 22:09:19 +0800 Subject: [PATCH] =?UTF-8?q?Excel=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9ASheet=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/text/DiffMatchPatchTest.java | 5 +- .../common/utils/excel/ExcelExport.java | 1173 +++++++++-------- .../common/utils/excel/ExcelImport.java | 898 ++++++------- .../com/jeesite/modules/db/InitCoreData.xlsx | Bin 175666 -> 175684 bytes .../views/modules/sys/sysIndex/topMenu.html | 51 +- .../java/com/jeesite/test/InitCoreData.java | 14 +- 6 files changed, 1100 insertions(+), 1041 deletions(-) diff --git a/common/src/main/java/com/jeesite/common/text/DiffMatchPatchTest.java b/common/src/main/java/com/jeesite/common/text/DiffMatchPatchTest.java index 57baafed..48655ac1 100644 --- a/common/src/main/java/com/jeesite/common/text/DiffMatchPatchTest.java +++ b/common/src/main/java/com/jeesite/common/text/DiffMatchPatchTest.java @@ -25,14 +25,13 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.junit.Assert; + import com.jeesite.common.io.FileUtils; import com.jeesite.common.text.DiffMatchPatch.Diff; import com.jeesite.common.text.DiffMatchPatch.LinesToCharsResult; import com.jeesite.common.text.DiffMatchPatch.Patch; -import junit.framework.Assert; - -@SuppressWarnings("deprecation") public class DiffMatchPatchTest { private DiffMatchPatch dmp; diff --git a/common/src/main/java/com/jeesite/common/utils/excel/ExcelExport.java b/common/src/main/java/com/jeesite/common/utils/excel/ExcelExport.java index 12cb0242..007f37fe 100644 --- a/common/src/main/java/com/jeesite/common/utils/excel/ExcelExport.java +++ b/common/src/main/java/com/jeesite/common/utils/excel/ExcelExport.java @@ -1,564 +1,609 @@ -/** - * Copyright (c) 2013-Now http://jeesite.com All rights reserved. - */ -package com.jeesite.common.utils.excel; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Comment; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.jeesite.common.codec.EncodeUtils; -import com.jeesite.common.collect.ListUtils; -import com.jeesite.common.reflect.ReflectUtils; -import com.jeesite.common.utils.excel.annotation.ExcelField; -import com.jeesite.common.utils.excel.annotation.ExcelField.Align; -import com.jeesite.common.utils.excel.annotation.ExcelFields; -import com.jeesite.common.utils.excel.annotation.ExcelField.Type; - -/** - * 导出Excel文件(导出“XLSX”格式,支持大数据量导出 @see org.apache.poi.ss.SpreadsheetVersion) - * @author ThinkGem - * @version 2013-04-21 - */ -public class ExcelExport { - - private static Logger log = LoggerFactory.getLogger(ExcelExport.class); - - /** - * 工作薄对象 - */ - private Workbook wb; - - /** - * 工作表对象 - */ - private Sheet sheet; - - /** - * 样式列表 - */ - private Map styles; - - /** - * 当前行号 - */ - private int rownum; - - /** - * 注解列表(Object[]{ ExcelField, Field/Method }) - */ - List annotationList = ListUtils.newArrayList(); - - /** - * 构造函数 - * @param title 表格标题,传“空值”,表示无标题 - * @param cls 实体对象,通过annotation.ExportField获取标题 - */ - public ExcelExport(String title, Class cls){ - this(title, cls, Type.EXPORT); - } - - /** - * 构造函数 - * @param title 表格标题,传“空值”,表示无标题 - * @param cls 实体对象,通过annotation.ExportField获取标题 - * @param type 导出类型(1:导出数据;2:导出模板) - * @param groups 导入分组 - */ - public ExcelExport(String title, Class cls, Type type, String... groups){ - this(null, null, title, cls, type, groups); - } - - /** - * 构造函数 - * @param wb 工作簿对象,支持多个Sheet,通过ExcelExport.createWorkbook()创建 - * @param sheetName,指定Sheet名称 - * @param title 表格标题,传“空值”,表示无标题 - * @param cls 实体对象,通过annotation.ExportField获取标题 - * @param type 导出类型(1:导出数据;2:导出模板) - * @param groups 导入分组 - */ - public ExcelExport(Workbook wb, String sheetName, String title, Class cls, Type type, String... groups){ - // Get annotation field - Field[] fs = cls.getDeclaredFields(); - for (Field f : fs){ - ExcelFields efs = f.getAnnotation(ExcelFields.class); - if (efs != null && efs.value() != null){ - for (ExcelField ef : efs.value()){ - addAnnotation(annotationList, ef, f, type, groups); - } - } - ExcelField ef = f.getAnnotation(ExcelField.class); - addAnnotation(annotationList, ef, f, type, groups); - } - // Get annotation method - Method[] ms = cls.getDeclaredMethods(); - for (Method m : ms){ - ExcelFields efs = m.getAnnotation(ExcelFields.class); - if (efs != null && efs.value() != null){ - for (ExcelField ef : efs.value()){ - addAnnotation(annotationList, ef, m, type, groups); - } - } - ExcelField ef = m.getAnnotation(ExcelField.class); - addAnnotation(annotationList, ef, m, type, groups); - } - // Field sorting - Collections.sort(annotationList, new Comparator() { - @Override - public int compare(Object[] o1, Object[] o2) { - return new Integer(((ExcelField)o1[0]).sort()).compareTo( - new Integer(((ExcelField)o2[0]).sort())); - }; - }); - // Initialize - List headerList = ListUtils.newArrayList(); - List headerWidthList = ListUtils.newArrayList(); - for (Object[] os : annotationList){ - ExcelField ef = (ExcelField)os[0]; - String headerTitle = ef.title(); - // 如果是导出,则去掉注释 - if (type == Type.EXPORT){ - String[] ss = StringUtils.split(headerTitle, "**", 2); - if (ss.length == 2){ - headerTitle = ss[0]; - } - } - headerList.add(headerTitle); - headerWidthList.add(ef.width()); - } - initialize(wb, sheetName, title, headerList, headerWidthList); - } - - /** - * 构造函数 - * @param title 表格标题,传“空值”,表示无标题 - * @param headers 表头数组 - */ - public ExcelExport(String title, List headerList) { - this(null, null, title, headerList); - } - - /** - * 构造函数 - * @param wb 工作簿对象,支持多个Sheet,通过ExcelExport.createWorkbook()创建 - * @param sheetName,指定Sheet名称 - * @param title 表格标题,传“空值”,表示无标题 - * @param headerList 表头列表 - */ - public ExcelExport(Workbook wb, String sheetName, String title, List headerList) { - initialize(wb, sheetName, title, headerList, null); - } - - /** - * 创建一个工作簿 - */ - public static Workbook createWorkbook(){ - return new SXSSFWorkbook(500); - } - - /** - * 添加到 annotationList - */ - private void addAnnotation(List annotationList, ExcelField ef, Object fOrM, Type type, String... groups){ -// if (ef != null && (ef.type()==0 || ef.type()==type)){ - if (ef != null && (ef.type() == Type.ALL || ef.type() == type)){ - if (groups != null && groups.length > 0){ - boolean inGroup = false; - for (String g : groups){ - if (inGroup){ - break; - } - for (String efg : ef.groups()){ - if (StringUtils.equals(g, efg)){ - inGroup = true; - annotationList.add(new Object[]{ef, fOrM}); - break; - } - } - } - }else{ - annotationList.add(new Object[]{ef, fOrM}); - } - } - } - - /** - * 初始化函数 - * @param title 表格标题,传“空值”,表示无标题 - * @param headerList 表头列表 - */ - private void initialize(Workbook wb, String sheetName, String title, List headerList, List headerWidth) { - if (wb == null){ - this.wb = createWorkbook(); - } - this.sheet = wb.createSheet(StringUtils.defaultString(sheetName, "Export")); - this.styles = createStyles(wb); - // Create title - if (StringUtils.isNotBlank(title)){ - Row titleRow = sheet.createRow(rownum++); - titleRow.setHeightInPoints(30); - Cell titleCell = titleRow.createCell(0); - titleCell.setCellStyle(styles.get("title")); - titleCell.setCellValue(title); - sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), - titleRow.getRowNum(), titleRow.getRowNum(), headerList.size()-1)); - } - // Create header - if (headerList == null){ - throw new ExcelException("headerList not null!"); - } - Row headerRow = sheet.createRow(rownum++); - headerRow.setHeightInPoints(16); - for (int i = 0; i < headerList.size(); i++) { - Cell cell = headerRow.createCell(i); - cell.setCellStyle(styles.get("header")); - String[] ss = StringUtils.split(headerList.get(i), "**", 2); - if (ss.length==2){ - cell.setCellValue(ss[0]); - Comment comment = this.sheet.createDrawingPatriarch().createCellComment( - new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6)); - comment.setString(new XSSFRichTextString(ss[1])); - cell.setCellComment(comment); - }else{ - cell.setCellValue(headerList.get(i)); - } -// sheet.autoSizeColumn(i); - } - boolean isDefWidth = (headerWidth != null && headerWidth.size() == headerList.size()); - for (int i = 0; i < headerList.size(); i++) { - int colWidth = -1; - if (isDefWidth){ - colWidth = headerWidth.get(i); - } - if (colWidth == -1){ - colWidth = sheet.getColumnWidth(i)*2; - colWidth = colWidth < 3000 ? 3000 : colWidth; - } - if (colWidth == 0){ - sheet.setColumnHidden(i, true); - }else{ - sheet.setColumnWidth(i, colWidth); - } - } - log.debug("Initialize success."); - } - - /** - * 创建表格样式 - * @param wb 工作薄对象 - * @return 样式列表 - */ - private Map createStyles(Workbook wb) { - Map styles = new HashMap(); - - CellStyle style = wb.createCellStyle(); - style.setAlignment(CellStyle.ALIGN_CENTER); - style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); - Font titleFont = wb.createFont(); - titleFont.setFontName("Arial"); - titleFont.setFontHeightInPoints((short) 16); - titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD); - style.setFont(titleFont); - styles.put("title", style); - - style = wb.createCellStyle(); - style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); - style.setBorderRight(CellStyle.BORDER_THIN); - style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderLeft(CellStyle.BORDER_THIN); - style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderTop(CellStyle.BORDER_THIN); - style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setBorderBottom(CellStyle.BORDER_THIN); - style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); - Font dataFont = wb.createFont(); - dataFont.setFontName("Arial"); - dataFont.setFontHeightInPoints((short) 10); - style.setFont(dataFont); - styles.put("data", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(CellStyle.ALIGN_LEFT); - styles.put("data1", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(CellStyle.ALIGN_CENTER); - styles.put("data2", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); - style.setAlignment(CellStyle.ALIGN_RIGHT); - styles.put("data3", style); - - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data")); -// style.setWrapText(true); - style.setAlignment(CellStyle.ALIGN_CENTER); - style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); - style.setFillPattern(CellStyle.SOLID_FOREGROUND); - Font headerFont = wb.createFont(); - headerFont.setFontName("Arial"); - headerFont.setFontHeightInPoints((short) 10); - headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD); - headerFont.setColor(IndexedColors.WHITE.getIndex()); - style.setFont(headerFont); - styles.put("header", style); - - return styles; - } - - /** - * 添加一行 - * @return 行对象 - */ - public Row addRow(){ - return sheet.createRow(rownum++); - } - - /** - * 添加一个单元格 - * @param row 添加的行 - * @param column 添加列号 - * @param val 添加值 - * @return 单元格对象 - */ - public Cell addCell(Row row, int column, Object val){ - return this.addCell(row, column, val, Align.AUTO, Class.class, null); - } - - /** - * 添加一个单元格 - * @param row 添加的行 - * @param column 添加列号 - * @param val 添加值 - * @param align 对齐方式(1:靠左;2:居中;3:靠右) - * @param dataFormat 数值格式(例如:0.00,yyyy-MM-dd) - * @return 单元格对象 - */ - public Cell addCell(Row row, int column, Object val, Align align, Class fieldType, String dataFormat){ - Cell cell = row.createCell(column); - String defaultDataFormat = "@"; - try { - if(val == null){ - cell.setCellValue(""); - }else if(fieldType != Class.class){ - cell.setCellValue((String)fieldType.getMethod("setValue", Object.class).invoke(null, val)); - try{ - defaultDataFormat = (String)fieldType.getMethod("getDataFormat").invoke(null); - } catch (Exception ex) { - defaultDataFormat = "@"; - } - }else{ - if(val instanceof String) { - cell.setCellValue((String) val); - }else if(val instanceof Integer) { - cell.setCellValue((Integer) val); - defaultDataFormat = "0"; - }else if(val instanceof Long) { - cell.setCellValue((Long) val); - defaultDataFormat = "0"; - }else if(val instanceof Double) { - cell.setCellValue((Double) val); - defaultDataFormat = "0.00"; - }else if(val instanceof Float) { - cell.setCellValue((Float) val); - defaultDataFormat = "0.00"; - }else if(val instanceof Date) { - cell.setCellValue((Date) val); - defaultDataFormat = "yyyy-MM-dd HH:mm"; - }else { - cell.setCellValue((String)Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), - "fieldtype."+val.getClass().getSimpleName()+"Type")).getMethod("setValue", Object.class).invoke(null, val)); - } - } -// if (val != null){ - CellStyle style = styles.get("data_column_"+column); - if (style == null){ - style = wb.createCellStyle(); - style.cloneStyleFrom(styles.get("data"+(align.value()>=1&&align.value()<=3?align.value():""))); - if (dataFormat != null){ - defaultDataFormat = dataFormat; - } - style.setDataFormat(wb.createDataFormat().getFormat(defaultDataFormat)); - styles.put("data_column_" + column, style); - } - cell.setCellStyle(style); -// } - } catch (Exception ex) { - log.info("Set cell value ["+row.getRowNum()+","+column+"] error: " + ex.toString()); - cell.setCellValue(val.toString()); - } - return cell; - } - - /** - * 添加数据(通过annotation.ExportField添加数据) - * @return list 数据列表 - */ - public ExcelExport setDataList(List list){ - for (E e : list){ - int colunm = 0; - Row row = this.addRow(); - StringBuilder sb = new StringBuilder(); - for (Object[] os : annotationList){ - ExcelField ef = (ExcelField)os[0]; - Object val = null; - // Get entity value - try{ - if (StringUtils.isNotBlank(ef.attrName())){ - val = ReflectUtils.invokeGetter(e, ef.attrName()); - }else{ - if (os[1] instanceof Field){ - val = ReflectUtils.invokeGetter(e, ((Field)os[1]).getName()); - }else if (os[1] instanceof Method){ - val = ReflectUtils.invokeMethod(e, ((Method)os[1]).getName(), new Class[] {}, new Object[] {}); - } - } - // If is dict, get dict label - if (StringUtils.isNotBlank(ef.dictType())){ - Class dictUtils = Class.forName("com.jeesite.modules.sys.utils.DictUtils"); - val = dictUtils.getMethod("getDictLabel", String.class, String.class, - String.class).invoke(null, val==null?"":val.toString(), ef.dictType(), ""); - //val = DictUtils.getDictLabel(val==null?"":val.toString(), ef.dictType(), ""); - } - }catch(Exception ex) { - // Failure to ignore - log.info(ex.toString()); - val = ""; - } - String dataFormat = ef.dataFormat(); - try { - // 获取Json格式化注解的格式化参数 - JsonFormat jf = e.getClass().getMethod("get"+StringUtils.capitalize(ef.attrName())).getAnnotation(JsonFormat.class); - if (jf != null && jf.pattern() != null){ - dataFormat = jf.pattern(); - } - } catch (Exception e1) { - // 如果获取失败,则使用默认。 - } - this.addCell(row, colunm++, val, ef.align(), ef.fieldType(), dataFormat); - sb.append(val + ", "); - } - log.debug("Write success: ["+row.getRowNum()+"] "+sb.toString()); - } - return this; - } - - /** - * 输出数据流 - * @param os 输出数据流 - */ - public ExcelExport write(OutputStream os){ - try{ - wb.write(os); - }catch(IOException ex){ - log.error(ex.getMessage(), ex); - } - return this; - } - - /** - * 输出到客户端 - * @param fileName 输出文件名 - */ - public ExcelExport write(HttpServletResponse response, String fileName){ - response.reset(); - response.setContentType("application/octet-stream; charset=utf-8"); - response.setHeader("Content-Disposition", "attachment; filename="+EncodeUtils.encodeUrl(fileName)); - try { - write(response.getOutputStream()); - } catch (IOException ex) { - log.error(ex.getMessage(), ex); - } - return this; - } - - /** - * 输出到文件 - * @param fileName 输出文件名 - */ - public ExcelExport writeFile(String name) throws FileNotFoundException, IOException{ - FileOutputStream os = new FileOutputStream(name); - this.write(os); - return this; - } - - /** - * 清理临时文件 - */ - public ExcelExport dispose(){ - if (wb instanceof SXSSFWorkbook){ - ((SXSSFWorkbook)wb).dispose(); - } - return this; - } - -// /** -// * 导出测试 -// */ -// public static void main(String[] args) throws Throwable { -// -// List headerList = ListUtils.newArrayList(); -// for (int i = 1; i <= 10; i++) { -// headerList.add("表头"+i); -// } -// -// List dataRowList = ListUtils.newArrayList(); -// for (int i = 1; i <= headerList.size(); i++) { -// dataRowList.add("数据"+i); -// } -// -// List> dataList = ListUtils.newArrayList(); -// for (int i = 1; i <=100; i++) { -// dataList.add(dataRowList); -// } -// -// ExcelExport ee = new ExcelExport("表格标题", headerList); -// -// for (int i = 0; i < dataList.size(); i++) { -// Row row = ee.addRow(); -// for (int j = 0; j < dataList.get(i).size(); j++) { -// ee.addCell(row, j, dataList.get(i).get(j)); -// } -// } -// -// ee.writeFile("target/export.xlsx"); -// -// ee.dispose(); -// -// log.debug("Export success."); -// -// } - -} +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.common.utils.excel; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.jeesite.common.codec.EncodeUtils; +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.reflect.ReflectUtils; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import com.jeesite.common.utils.excel.annotation.ExcelField.Type; + +/** + * 导出Excel文件(导出“XLSX”格式,支持大数据量导出 @see org.apache.poi.ss.SpreadsheetVersion) + * @author ThinkGem + * @version 2013-04-21 + */ +public class ExcelExport { + + private static Logger log = LoggerFactory.getLogger(ExcelExport.class); + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 注解列表(Object[]{ ExcelField, Field/Method }) + */ + List annotationList; + + /** + * 构造函数 + * @param title 表格标题,传“空值”,表示无标题 + * @param cls 实体对象,通过annotation.ExportField获取标题 + * @param type 导出类型(1:导出数据) + */ + public ExcelExport(String title, Class cls){ + this(title, cls, Type.EXPORT); + } + + /** + * 构造函数 + * @param title 表格标题,传“空值”,表示无标题 + * @param cls 实体对象,通过annotation.ExportField获取标题 + * @param type 导出类型(1:导出数据;2:导出模板) + * @param groups 导入分组 + */ + public ExcelExport(String title, Class cls, Type type, String... groups){ + this(null, title, cls, type, groups); + } + + /** + * 构造函数 + * @param wb 工作簿对象,支持多个Sheet,通过ExcelExport.createWorkbook()创建 + * @param sheetName,指定Sheet名称 + * @param title 表格标题,传“空值”,表示无标题 + * @param cls 实体对象,通过annotation.ExportField获取标题 + * @param type 导出类型(1:导出数据;2:导出模板) + * @param groups 导入分组 + */ + public ExcelExport(Workbook wb, String title, Class cls, Type type, String... groups){ + if (wb != null){ + this.wb = wb; + }else{ + this.wb = createWorkbook(); + } + this.createSheet(null, title, cls, type, groups); + } + + /** + * 构造函数 + * @param title 表格标题,传“空值”,表示无标题 + * @param headerList 表头数组 + */ + public ExcelExport(String title, List headerList) { + this(null, null, title, headerList); + } + + /** + * 构造函数 + * @param wb 工作簿对象,支持多个Sheet,通过ExcelExport.createWorkbook()创建 + * @param sheetName,指定Sheet名称 + * @param title 表格标题,传“空值”,表示无标题 + * @param headerList 表头列表 + */ + public ExcelExport(Workbook wb, String sheetName, String title, List headerList) { + if (wb != null){ + this.wb = wb; + }else{ + this.wb = createWorkbook(); + } + this.createSheet(sheetName, title, headerList, null); + } + + /** + * 创建一个工作簿 + */ + private Workbook createWorkbook(){ + return new SXSSFWorkbook(500); + } + + /** + * 创建工作表 + * @param sheetName,指定Sheet名称 + * @param title 表格标题,传“空值”,表示无标题 + * @param cls 实体对象,通过annotation.ExportField获取标题 + * @param type 导出类型(1:导出数据;2:导出模板) + * @param groups 导入分组 + */ + public void createSheet(String sheetName, String title, Class cls, Type type, String... groups){ + this.annotationList = ListUtils.newArrayList(); + // Get annotation field + Field[] fs = cls.getDeclaredFields(); + for (Field f : fs){ + ExcelFields efs = f.getAnnotation(ExcelFields.class); + if (efs != null && efs.value() != null){ + for (ExcelField ef : efs.value()){ + addAnnotation(annotationList, ef, f, type, groups); + } + } + ExcelField ef = f.getAnnotation(ExcelField.class); + addAnnotation(annotationList, ef, f, type, groups); + } + // Get annotation method + Method[] ms = cls.getDeclaredMethods(); + for (Method m : ms){ + ExcelFields efs = m.getAnnotation(ExcelFields.class); + if (efs != null && efs.value() != null){ + for (ExcelField ef : efs.value()){ + addAnnotation(annotationList, ef, m, type, groups); + } + } + ExcelField ef = m.getAnnotation(ExcelField.class); + addAnnotation(annotationList, ef, m, type, groups); + } + // Field sorting + Collections.sort(annotationList, new Comparator() { + @Override + public int compare(Object[] o1, Object[] o2) { + return new Integer(((ExcelField)o1[0]).sort()).compareTo( + new Integer(((ExcelField)o2[0]).sort())); + }; + }); + // Initialize + List headerList = ListUtils.newArrayList(); + List headerWidthList = ListUtils.newArrayList(); + for (Object[] os : annotationList){ + ExcelField ef = (ExcelField)os[0]; + String headerTitle = ef.title(); + // 如果是导出,则去掉注释 + if (type == Type.EXPORT){ + String[] ss = StringUtils.split(headerTitle, "**", 2); + if (ss.length == 2){ + headerTitle = ss[0]; + } + } + headerList.add(headerTitle); + headerWidthList.add(ef.width()); + } + // 创建工作表 + this.createSheet(sheetName, title, headerList, headerWidthList); + } + + /** + * 添加到 annotationList + */ + private void addAnnotation(List annotationList, ExcelField ef, Object fOrM, Type type, String... groups){ +// if (ef != null && (ef.type()==0 || ef.type()==type)){ + if (ef != null && (ef.type() == Type.ALL || ef.type() == type)){ + if (groups != null && groups.length > 0){ + boolean inGroup = false; + for (String g : groups){ + if (inGroup){ + break; + } + for (String efg : ef.groups()){ + if (StringUtils.equals(g, efg)){ + inGroup = true; + annotationList.add(new Object[]{ef, fOrM}); + break; + } + } + } + }else{ + annotationList.add(new Object[]{ef, fOrM}); + } + } + } + + /** + * 创建工作表 + * @param sheetName,指定Sheet名称 + * @param title 表格标题,传“空值”,表示无标题 + * @param cls 实体对象,通过annotation.ExportField获取标题 + * @param type 导出类型(1:导出数据;2:导出模板) + * @param groups 导入分组 + */ + public void createSheet(String sheetName, String title, List headerList, List headerWidthList) { + this.sheet = wb.createSheet(StringUtils.defaultString(sheetName, "Export")); + this.styles = createStyles(wb); + // Create title + if (StringUtils.isNotBlank(title)){ + Row titleRow = sheet.createRow(rownum++); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), + titleRow.getRowNum(), titleRow.getRowNum(), headerList.size()-1)); + } + // Create header + if (headerList == null){ + throw new ExcelException("headerList not null!"); + } + Row headerRow = sheet.createRow(rownum++); + headerRow.setHeightInPoints(16); + for (int i = 0; i < headerList.size(); i++) { + Cell cell = headerRow.createCell(i); + cell.setCellStyle(styles.get("header")); + String[] ss = StringUtils.split(headerList.get(i), "**", 2); + if (ss.length==2){ + cell.setCellValue(ss[0]); + Comment comment = this.sheet.createDrawingPatriarch().createCellComment( + new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6)); + comment.setString(new XSSFRichTextString(ss[1])); + cell.setCellComment(comment); + }else{ + cell.setCellValue(headerList.get(i)); + } +// sheet.autoSizeColumn(i); + } + boolean isDefWidth = (headerWidthList != null && headerWidthList.size() == headerList.size()); + for (int i = 0; i < headerList.size(); i++) { + int colWidth = -1; + if (isDefWidth){ + colWidth = headerWidthList.get(i); + } + if (colWidth == -1){ + colWidth = sheet.getColumnWidth(i)*2; + colWidth = colWidth < 3000 ? 3000 : colWidth; + } + if (colWidth == 0){ + sheet.setColumnHidden(i, true); + }else{ + sheet.setColumnWidth(i, colWidth); + } + } + log.debug("Create sheet {0} success.", sheetName); + } + +// /** +// * 构造函数 +// * @param title 表格标题,传“空值”,表示无标题 +// * @param headers 表头数组 +// */ +// public ExcelExport(String title, List headerList) { +// this(null, null, title, headerList); +// } +// +// /** +// * 构造函数 +// * @param wb 工作簿对象,支持多个Sheet,通过ExcelExport.createWorkbook()创建 +// * @param sheetName,指定Sheet名称 +// * @param title 表格标题,传“空值”,表示无标题 +// * @param headerList 表头列表 +// */ +// public ExcelExport(Workbook wb, String sheetName, String title, List headerList) { +// initialize(wb, sheetName, title, headerList, null); +// } + + /** + * 创建表格样式 + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) { + Map styles = new HashMap(); + + CellStyle style = wb.createCellStyle(); + style.setAlignment(CellStyle.ALIGN_CENTER); + style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); + style.setBorderRight(CellStyle.BORDER_THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(CellStyle.BORDER_THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(CellStyle.BORDER_THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(CellStyle.BORDER_THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(CellStyle.ALIGN_LEFT); + styles.put("data1", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(CellStyle.ALIGN_CENTER); + styles.put("data2", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(CellStyle.ALIGN_RIGHT); + styles.put("data3", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); +// style.setWrapText(true); + style.setAlignment(CellStyle.ALIGN_CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(CellStyle.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + return styles; + } + + /** + * 添加一行 + * @return 行对象 + */ + public Row addRow(){ + return sheet.createRow(rownum++); + } + + /** + * 添加一个单元格 + * @param row 添加的行 + * @param column 添加列号 + * @param val 添加值 + * @return 单元格对象 + */ + public Cell addCell(Row row, int column, Object val){ + return this.addCell(row, column, val, Align.AUTO, Class.class, null); + } + + /** + * 添加一个单元格 + * @param row 添加的行 + * @param column 添加列号 + * @param val 添加值 + * @param align 对齐方式(1:靠左;2:居中;3:靠右) + * @param dataFormat 数值格式(例如:0.00,yyyy-MM-dd) + * @return 单元格对象 + */ + public Cell addCell(Row row, int column, Object val, Align align, Class fieldType, String dataFormat){ + Cell cell = row.createCell(column); + String defaultDataFormat = "@"; + try { + if(val == null){ + cell.setCellValue(""); + }else if(fieldType != Class.class){ + cell.setCellValue((String)fieldType.getMethod("setValue", Object.class).invoke(null, val)); + try{ + defaultDataFormat = (String)fieldType.getMethod("getDataFormat").invoke(null); + } catch (Exception ex) { + defaultDataFormat = "@"; + } + }else{ + if(val instanceof String) { + cell.setCellValue((String) val); + }else if(val instanceof Integer) { + cell.setCellValue((Integer) val); + defaultDataFormat = "0"; + }else if(val instanceof Long) { + cell.setCellValue((Long) val); + defaultDataFormat = "0"; + }else if(val instanceof Double) { + cell.setCellValue((Double) val); + defaultDataFormat = "0.00"; + }else if(val instanceof Float) { + cell.setCellValue((Float) val); + defaultDataFormat = "0.00"; + }else if(val instanceof Date) { + cell.setCellValue((Date) val); + defaultDataFormat = "yyyy-MM-dd HH:mm"; + }else { + cell.setCellValue((String)Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), + "fieldtype."+val.getClass().getSimpleName()+"Type")).getMethod("setValue", Object.class).invoke(null, val)); + } + } +// if (val != null){ + CellStyle style = styles.get("data_column_"+column); + if (style == null){ + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data"+(align.value()>=1&&align.value()<=3?align.value():""))); + if (dataFormat != null){ + defaultDataFormat = dataFormat; + } + style.setDataFormat(wb.createDataFormat().getFormat(defaultDataFormat)); + styles.put("data_column_" + column, style); + } + cell.setCellStyle(style); +// } + } catch (Exception ex) { + log.info("Set cell value ["+row.getRowNum()+","+column+"] error: " + ex.toString()); + cell.setCellValue(val.toString()); + } + return cell; + } + + /** + * 添加数据(通过annotation.ExportField添加数据) + * @return list 数据列表 + */ + public ExcelExport setDataList(List list){ + for (E e : list){ + int colunm = 0; + Row row = this.addRow(); + StringBuilder sb = new StringBuilder(); + for (Object[] os : annotationList){ + ExcelField ef = (ExcelField)os[0]; + Object val = null; + // Get entity value + try{ + if (StringUtils.isNotBlank(ef.attrName())){ + val = ReflectUtils.invokeGetter(e, ef.attrName()); + }else{ + if (os[1] instanceof Field){ + val = ReflectUtils.invokeGetter(e, ((Field)os[1]).getName()); + }else if (os[1] instanceof Method){ + val = ReflectUtils.invokeMethod(e, ((Method)os[1]).getName(), new Class[] {}, new Object[] {}); + } + } + // If is dict, get dict label + if (StringUtils.isNotBlank(ef.dictType())){ + Class dictUtils = Class.forName("com.jeesite.modules.sys.utils.DictUtils"); + val = dictUtils.getMethod("getDictLabel", String.class, String.class, + String.class).invoke(null, val==null?"":val.toString(), ef.dictType(), ""); + //val = DictUtils.getDictLabel(val==null?"":val.toString(), ef.dictType(), ""); + } + }catch(Exception ex) { + // Failure to ignore + log.info(ex.toString()); + val = ""; + } + String dataFormat = ef.dataFormat(); + try { + // 获取Json格式化注解的格式化参数 + JsonFormat jf = e.getClass().getMethod("get"+StringUtils.capitalize(ef.attrName())).getAnnotation(JsonFormat.class); + if (jf != null && jf.pattern() != null){ + dataFormat = jf.pattern(); + } + } catch (Exception e1) { + // 如果获取失败,则使用默认。 + } + this.addCell(row, colunm++, val, ef.align(), ef.fieldType(), dataFormat); + sb.append(val + ", "); + } + log.debug("Write success: ["+row.getRowNum()+"] "+sb.toString()); + } + return this; + } + + /** + * 输出数据流 + * @param os 输出数据流 + */ + public ExcelExport write(OutputStream os){ + try{ + wb.write(os); + }catch(IOException ex){ + log.error(ex.getMessage(), ex); + } + return this; + } + + /** + * 输出到客户端 + * @param fileName 输出文件名 + */ + public ExcelExport write(HttpServletResponse response, String fileName){ + response.reset(); + response.setContentType("application/octet-stream; charset=utf-8"); + response.setHeader("Content-Disposition", "attachment; filename="+EncodeUtils.encodeUrl(fileName)); + try { + write(response.getOutputStream()); + } catch (IOException ex) { + log.error(ex.getMessage(), ex); + } + return this; + } + + /** + * 输出到文件 + * @param fileName 输出文件名 + */ + public ExcelExport writeFile(String name) throws FileNotFoundException, IOException{ + FileOutputStream os = new FileOutputStream(name); + this.write(os); + return this; + } + + /** + * 清理临时文件 + */ + public ExcelExport dispose(){ + if (wb instanceof SXSSFWorkbook){ + ((SXSSFWorkbook)wb).dispose(); + } + return this; + } + +// /** +// * 导出测试 +// */ +// public static void main(String[] args) throws Throwable { +// +// List headerList = ListUtils.newArrayList(); +// for (int i = 1; i <= 10; i++) { +// headerList.add("表头"+i); +// } +// +// List dataRowList = ListUtils.newArrayList(); +// for (int i = 1; i <= headerList.size(); i++) { +// dataRowList.add("数据"+i); +// } +// +// List> dataList = ListUtils.newArrayList(); +// for (int i = 1; i <=100; i++) { +// dataList.add(dataRowList); +// } +// +// ExcelExport ee = new ExcelExport("表格标题", headerList); +// +// for (int i = 0; i < dataList.size(); i++) { +// Row row = ee.addRow(); +// for (int j = 0; j < dataList.get(i).size(); j++) { +// ee.addCell(row, j, dataList.get(i).get(j)); +// } +// } +// +// ee.writeFile("target/export.xlsx"); +// +// ee.dispose(); +// +// log.debug("Export success."); +// +// } + +} diff --git a/common/src/main/java/com/jeesite/common/utils/excel/ExcelImport.java b/common/src/main/java/com/jeesite/common/utils/excel/ExcelImport.java index ab2e7b4f..3f3ff9ad 100644 --- a/common/src/main/java/com/jeesite/common/utils/excel/ExcelImport.java +++ b/common/src/main/java/com/jeesite/common/utils/excel/ExcelImport.java @@ -1,441 +1,457 @@ -/** - * Copyright (c) 2013-Now http://jeesite.com All rights reserved. - */ -package com.jeesite.common.utils.excel; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.text.DecimalFormat; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.ss.formula.eval.ErrorEval; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellValue; -import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.ss.usermodel.FormulaEvaluator; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.multipart.MultipartFile; - -import com.jeesite.common.callback.MethodCallback; -import com.jeesite.common.collect.ListUtils; -import com.jeesite.common.lang.DateUtils; -import com.jeesite.common.lang.ObjectUtils; -import com.jeesite.common.lang.StringUtils; -import com.jeesite.common.reflect.ReflectUtils; -import com.jeesite.common.utils.excel.annotation.ExcelField; -import com.jeesite.common.utils.excel.annotation.ExcelField.Type; -import com.jeesite.common.utils.excel.annotation.ExcelFields; - -/** - * 导入Excel文件(支持“XLS”和“XLSX”格式) - * @author ThinkGem - * @version 2014-8-19 - */ -public class ExcelImport { - - private static Logger log = LoggerFactory.getLogger(ExcelImport.class); - - /** - * 工作薄对象 - */ - private Workbook wb; - - /** - * 工作表对象 - */ - private Sheet sheet; - - /** - * 标题行数 - */ - private int headerNum; - - /** - * 构造函数 - * @param path 导入文件对象,读取第一个工作表 - * @throws InvalidFormatException - * @throws IOException - */ - public ExcelImport(File file) throws InvalidFormatException, IOException { - this(file, 0, 0); - } - - /** - * 构造函数 - * @param path 导入文件对象,读取第一个工作表 - * @param headerNum 标题行数,数据行号=标题行数+1 - * @throws InvalidFormatException - * @throws IOException - */ - public ExcelImport(File file, int headerNum) - throws InvalidFormatException, IOException { - this(file, headerNum, 0); - } - - /** - * 构造函数 - * @param path 导入文件对象 - * @param headerNum 标题行数,数据行号=标题行数+1 - * @param sheetIndexOrName 工作表编号或名称,从0开始 - * @throws InvalidFormatException - * @throws IOException - */ - public ExcelImport(File file, int headerNum, Object sheetIndexOrName) - throws InvalidFormatException, IOException { - this(file.getName(), new FileInputStream(file), headerNum, sheetIndexOrName); - } - - /** - * 构造函数 - * @param file 导入文件对象 - * @param headerNum 标题行数,数据行号=标题行数+1 - * @param sheetIndexOrName 工作表编号或名称,从0开始 - * @throws InvalidFormatException - * @throws IOException - */ - public ExcelImport(MultipartFile multipartFile, int headerNum, Object sheetIndexOrName) - throws InvalidFormatException, IOException { - this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndexOrName); - } - - /** - * 构造函数 - * @param path 导入文件对象 - * @param headerNum 标题行数,数据行号=标题行数+1 - * @param sheetIndexOrName 工作表编号或名称 - * @throws InvalidFormatException - * @throws IOException - */ - public ExcelImport(String fileName, InputStream is, int headerNum, Object sheetIndexOrName) - throws InvalidFormatException, IOException { - if (StringUtils.isBlank(fileName)){ - throw new ExcelException("导入文档为空!"); - }else if(fileName.toLowerCase().endsWith("xls")){ - this.wb = new HSSFWorkbook(is); - }else if(fileName.toLowerCase().endsWith("xlsx")){ - this.wb = new XSSFWorkbook(is); - }else{ - throw new ExcelException("文档格式不正确!"); - } - if (sheetIndexOrName instanceof Integer || sheetIndexOrName instanceof Long){ - this.sheet = this.wb.getSheetAt(ObjectUtils.toInteger(sheetIndexOrName)); - }else{ - this.sheet = this.wb.getSheet(ObjectUtils.toString(sheetIndexOrName)); - } - if (this.sheet == null){ - throw new ExcelException("没有找到工作表!"); - } - this.headerNum = headerNum; - log.debug("Initialize success."); - } - - /** - * 添加到 annotationList - */ - private void addAnnotation(List annotationList, ExcelField ef, Object fOrM, Type type, String... groups){ -// if (ef != null && (ef.type()==0 || ef.type()==type)){ - if (ef != null && (ef.type() == Type.ALL || ef.type() == type)){ - if (groups!=null && groups.length>0){ - boolean inGroup = false; - for (String g : groups){ - if (inGroup){ - break; - } - for (String efg : ef.groups()){ - if (StringUtils.equals(g, efg)){ - inGroup = true; - annotationList.add(new Object[]{ef, fOrM}); - break; - } - } - } - }else{ - annotationList.add(new Object[]{ef, fOrM}); - } - } - } - - /** - * 获取行对象 - * @param rownum - * @return - */ - public Row getRow(int rownum){ - return this.sheet.getRow(rownum); - } - - /** - * 获取数据行号 - * @return - */ - public int getDataRowNum(){ - return headerNum; - } - - /** - * 获取最后一个数据行号 - * @return - */ - public int getLastDataRowNum(){ - //return this.sheet.getLastRowNum()+headerNum; - return this.sheet.getLastRowNum() + 1; - } - - /** - * 获取最后一个列号 - * @return - */ - public int getLastCellNum(){ - Row row = this.getRow(headerNum); - return row == null ? 0 : row.getLastCellNum(); - } - - /** - * 获取单元格值 - * @param row 获取的行 - * @param column 获取单元格列号 - * @return 单元格值 - */ - public Object getCellValue(Row row, int column){ - Object val = ""; - try{ - Cell cell = row.getCell(column); - if (cell != null){ - if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ - val = new DecimalFormat("0").format(cell.getNumericCellValue()); - }else if (cell.getCellType() == Cell.CELL_TYPE_STRING){ - val = cell.getStringCellValue(); - }else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){ - try { - val = cell.getStringCellValue(); - } catch (Exception e) { - FormulaEvaluator evaluator = cell.getSheet().getWorkbook() - .getCreationHelper().createFormulaEvaluator(); - evaluator.evaluateFormulaCell(cell); - CellValue cellValue = evaluator.evaluate(cell); - switch (cellValue.getCellType()) { - case Cell.CELL_TYPE_NUMERIC: - val = cellValue.getNumberValue(); - break; - case Cell.CELL_TYPE_STRING: - val = cellValue.getStringValue(); - break; - case Cell.CELL_TYPE_BOOLEAN: - val = cellValue.getBooleanValue(); - break; - case Cell.CELL_TYPE_ERROR: - val = ErrorEval.getText(cellValue.getErrorValue()); - break; - default: - val = cell.getCellFormula(); - } - } - }else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){ - val = cell.getBooleanCellValue(); - }else if (cell.getCellType() == Cell.CELL_TYPE_ERROR){ - val = cell.getErrorCellValue(); - } - } - }catch (Exception e) { - return val; - } - return val; - } - - /** - * 获取导入数据列表 - * @param cls 导入对象类型 - * @param groups 导入分组 - */ - public List getDataList(Class cls, String... groups) throws InstantiationException, IllegalAccessException{ - return getDataList(cls, false, groups); - } - - /** - * 获取导入数据列表 - * @param cls 导入对象类型 - * @param isThrowException 遇见错误是否抛出异常 - * @param groups 导入分组 - */ - public List getDataList(Class cls, final boolean isThrowException, String... groups) throws InstantiationException, IllegalAccessException{ - return getDataList(cls, new MethodCallback() { - @Override - public Object execute(Object... params) { - if (isThrowException){ - Exception ex = (Exception)params[0]; - int rowNum = (int)params[1]; - int columnNum = (int)params[2]; - throw new ExcelException("Get cell value ["+rowNum+","+columnNum+"]", ex); - } - return null; - } - }, groups); - } - /** - * 获取导入数据列表 - * @param cls 导入对象类型 - * @param isThrowException 遇见错误是否抛出异常 - * @param groups 导入分组 - */ - public List getDataList(Class cls, MethodCallback exceptionCallback, String... groups) throws InstantiationException, IllegalAccessException{ - List annotationList = ListUtils.newArrayList(); - // Get annotation field - Field[] fs = cls.getDeclaredFields(); - for (Field f : fs){ - ExcelFields efs = f.getAnnotation(ExcelFields.class); - if (efs != null && efs.value() != null){ - for (ExcelField ef : efs.value()){ - addAnnotation(annotationList, ef, f, Type.IMPORT, groups); - } - } - ExcelField ef = f.getAnnotation(ExcelField.class); - addAnnotation(annotationList, ef, f, Type.IMPORT, groups); - } - // Get annotation method - Method[] ms = cls.getDeclaredMethods(); - for (Method m : ms){ - ExcelFields efs = m.getAnnotation(ExcelFields.class); - if (efs != null && efs.value() != null){ - for (ExcelField ef : efs.value()){ - addAnnotation(annotationList, ef, m, Type.IMPORT, groups); - } - } - ExcelField ef = m.getAnnotation(ExcelField.class); - addAnnotation(annotationList, ef, m, Type.IMPORT, groups); - } - // Field sorting - Collections.sort(annotationList, new Comparator() { - @Override - public int compare(Object[] o1, Object[] o2) { - return new Integer(((ExcelField)o1[0]).sort()).compareTo( - new Integer(((ExcelField)o2[0]).sort())); - }; - }); - //log.debug("Import column count:"+annotationList.size()); - // Get excel data - List dataList = ListUtils.newArrayList(); - for (int i = this.getDataRowNum(); i < this.getLastDataRowNum(); i++) { - E e = (E)cls.newInstance(); - Row row = this.getRow(i); - StringBuilder sb = new StringBuilder(); - for (int j = 0; j < annotationList.size(); j++){//Object[] os : annotationList){ - Object[] os = annotationList.get(j); - ExcelField ef = (ExcelField)os[0]; - int column = (ef.column() != -1) ? ef.column() : j; - Object val = this.getCellValue(row, column); - if (val != null){ - // If is dict type, get dict value - if (StringUtils.isNotBlank(ef.dictType())){ - try{ - Class dictUtils = Class.forName("com.jeesite.modules.sys.utils.DictUtils"); - val = dictUtils.getMethod("getDictValue", String.class, String.class, - String.class).invoke(null, val.toString(), ef.dictType(), ""); - } catch (Exception ex) { - log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); - val = null; - } - //val = DictUtils.getDictValue(val.toString(), ef.dictType(), ""); - //log.debug("Dictionary type value: ["+i+","+colunm+"] " + val); - } - // Get param type and type cast - Class valType = Class.class; - if (os[1] instanceof Field){ - valType = ((Field)os[1]).getType(); - }else if (os[1] instanceof Method){ - Method method = ((Method)os[1]); - if ("get".equals(method.getName().substring(0, 3))){ - valType = method.getReturnType(); - }else if("set".equals(method.getName().substring(0, 3))){ - valType = ((Method)os[1]).getParameterTypes()[0]; - } - } - //log.debug("Import value type: ["+i+","+column+"] " + valType); - try { - if (valType == String.class){ - String s = String.valueOf(val.toString()); - if(StringUtils.endsWith(s, ".0")){ - val = StringUtils.substringBefore(s, ".0"); - }else{ - val = String.valueOf(val.toString()); - } - }else if (valType == Integer.class){ - val = Double.valueOf(val.toString()).intValue(); - }else if (valType == Long.class){ - val = Double.valueOf(val.toString()).longValue(); - }else if (valType == Double.class){ - val = Double.valueOf(val.toString()); - }else if (valType == Float.class){ - val = Float.valueOf(val.toString()); - }else if (valType == Date.class){ - if (val instanceof String){ - val = DateUtils.parseDate(val); - }else{ - // POI Excel 日期格式转换 - val = DateUtil.getJavaDate((Double)val); - } - }else{ - if (ef.fieldType() != Class.class){ - val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString()); - }else{ - val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), - "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString()); - } - } - } catch (Exception ex) { - log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); - val = null; - // 参数:Exception ex, int rowNum, int columnNum - exceptionCallback.execute(ex, i, column); - } - // set entity value - if (os[1] instanceof Field){ - ReflectUtils.invokeSetter(e, ((Field)os[1]).getName(), val); - }else if (os[1] instanceof Method){ - String mthodName = ((Method)os[1]).getName(); - if ("get".equals(mthodName.substring(0, 3))){ - mthodName = "set"+StringUtils.substringAfter(mthodName, "get"); - } - ReflectUtils.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val}); - } - } - sb.append(val+", "); - } - dataList.add(e); - log.debug("Read success: ["+i+"] "+sb.toString()); - } - return dataList; - } - -// /** -// * 导入测试 -// */ -// public static void main(String[] args) throws Throwable { -// -// ImportExcel ei = new ImportExcel("target/export.xlsx", 1); -// -// for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) { -// Row row = ei.getRow(i); -// for (int j = 0; j < ei.getLastCellNum(); j++) { -// Object val = ei.getCellValue(row, j); -// System.out.print(val+", "); -// } -// System.out.print("\n"); -// } -// -// } - -} +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + */ +package com.jeesite.common.utils.excel; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.text.DecimalFormat; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.formula.eval.ErrorEval; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellValue; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.multipart.MultipartFile; + +import com.jeesite.common.callback.MethodCallback; +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.lang.DateUtils; +import com.jeesite.common.lang.ObjectUtils; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.reflect.ReflectUtils; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Type; +import com.jeesite.common.utils.excel.annotation.ExcelFields; + +/** + * 导入Excel文件(支持“XLS”和“XLSX”格式) + * @author ThinkGem + * @version 2014-8-19 + */ +public class ExcelImport { + + private static Logger log = LoggerFactory.getLogger(ExcelImport.class); + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 标题行数 + */ + private int headerNum; + + /** + * 构造函数 + * @param path 导入文件对象,读取第一个工作表 + * @throws InvalidFormatException + * @throws IOException + */ + public ExcelImport(File file) throws InvalidFormatException, IOException { + this(file, 0, 0); + } + + /** + * 构造函数 + * @param path 导入文件对象,读取第一个工作表 + * @param headerNum 标题行数,数据行号=标题行数+1 + * @throws InvalidFormatException + * @throws IOException + */ + public ExcelImport(File file, int headerNum) + throws InvalidFormatException, IOException { + this(file, headerNum, 0); + } + + /** + * 构造函数 + * @param path 导入文件对象 + * @param headerNum 标题行数,数据行号=标题行数+1 + * @param sheetIndexOrName 工作表编号或名称,从0开始 + * @throws InvalidFormatException + * @throws IOException + */ + public ExcelImport(File file, int headerNum, Object sheetIndexOrName) + throws InvalidFormatException, IOException { + this(file.getName(), new FileInputStream(file), headerNum, sheetIndexOrName); + } + + /** + * 构造函数 + * @param file 导入文件对象 + * @param headerNum 标题行数,数据行号=标题行数+1 + * @param sheetIndexOrName 工作表编号或名称,从0开始 + * @throws InvalidFormatException + * @throws IOException + */ + public ExcelImport(MultipartFile multipartFile, int headerNum, Object sheetIndexOrName) + throws InvalidFormatException, IOException { + this(multipartFile.getOriginalFilename(), multipartFile.getInputStream(), headerNum, sheetIndexOrName); + } + + /** + * 构造函数 + * @param path 导入文件对象 + * @param headerNum 标题行数,数据行号=标题行数+1 + * @param sheetIndexOrName 工作表编号或名称 + * @throws InvalidFormatException + * @throws IOException + */ + public ExcelImport(String fileName, InputStream is, int headerNum, Object sheetIndexOrName) + throws InvalidFormatException, IOException { + if (StringUtils.isBlank(fileName)){ + throw new ExcelException("导入文档为空!"); + }else if(fileName.toLowerCase().endsWith("xls")){ + this.wb = new HSSFWorkbook(is); + }else if(fileName.toLowerCase().endsWith("xlsx")){ + this.wb = new XSSFWorkbook(is); + }else{ + throw new ExcelException("文档格式不正确!"); + } + this.setSheet(sheetIndexOrName, headerNum); + log.debug("Initialize success."); + } + + /** + * 添加到 annotationList + */ + private void addAnnotation(List annotationList, ExcelField ef, Object fOrM, Type type, String... groups){ +// if (ef != null && (ef.type()==0 || ef.type()==type)){ + if (ef != null && (ef.type() == Type.ALL || ef.type() == type)){ + if (groups!=null && groups.length>0){ + boolean inGroup = false; + for (String g : groups){ + if (inGroup){ + break; + } + for (String efg : ef.groups()){ + if (StringUtils.equals(g, efg)){ + inGroup = true; + annotationList.add(new Object[]{ef, fOrM}); + break; + } + } + } + }else{ + annotationList.add(new Object[]{ef, fOrM}); + } + } + } + + /** + * 获取当前工作薄 + * @author ThinkGem + */ + public Workbook getWorkbook() { + return wb; + } + + /** + * 设置当前工作表和标题行数 + * @author ThinkGem + */ + public void setSheet(Object sheetIndexOrName, int headerNum) { + if (sheetIndexOrName instanceof Integer || sheetIndexOrName instanceof Long){ + this.sheet = this.wb.getSheetAt(ObjectUtils.toInteger(sheetIndexOrName)); + }else{ + this.sheet = this.wb.getSheet(ObjectUtils.toString(sheetIndexOrName)); + } + if (this.sheet == null){ + throw new ExcelException("没有找到‘"+sheetIndexOrName+"’工作表!"); + } + this.headerNum = headerNum; + } + + /** + * 获取行对象 + * @param rownum + * @return + */ + public Row getRow(int rownum){ + return this.sheet.getRow(rownum); + } + + /** + * 获取数据行号 + * @return + */ + public int getDataRowNum(){ + return headerNum; + } + + /** + * 获取最后一个数据行号 + * @return + */ + public int getLastDataRowNum(){ + //return this.sheet.getLastRowNum() + headerNum; + return this.sheet.getLastRowNum() + 1; + } + + /** + * 获取最后一个列号 + * @return + */ + public int getLastCellNum(){ + Row row = this.getRow(headerNum); + return row == null ? 0 : row.getLastCellNum(); + } + + /** + * 获取单元格值 + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column){ + Object val = ""; + try{ + Cell cell = row.getCell(column); + if (cell != null){ + if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ + val = new DecimalFormat("0").format(cell.getNumericCellValue()); + }else if (cell.getCellType() == Cell.CELL_TYPE_STRING){ + val = cell.getStringCellValue(); + }else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){ + try { + val = cell.getStringCellValue(); + } catch (Exception e) { + FormulaEvaluator evaluator = cell.getSheet().getWorkbook() + .getCreationHelper().createFormulaEvaluator(); + evaluator.evaluateFormulaCell(cell); + CellValue cellValue = evaluator.evaluate(cell); + switch (cellValue.getCellType()) { + case Cell.CELL_TYPE_NUMERIC: + val = cellValue.getNumberValue(); + break; + case Cell.CELL_TYPE_STRING: + val = cellValue.getStringValue(); + break; + case Cell.CELL_TYPE_BOOLEAN: + val = cellValue.getBooleanValue(); + break; + case Cell.CELL_TYPE_ERROR: + val = ErrorEval.getText(cellValue.getErrorValue()); + break; + default: + val = cell.getCellFormula(); + } + } + }else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){ + val = cell.getBooleanCellValue(); + }else if (cell.getCellType() == Cell.CELL_TYPE_ERROR){ + val = cell.getErrorCellValue(); + } + } + }catch (Exception e) { + return val; + } + return val; + } + + /** + * 获取导入数据列表 + * @param cls 导入对象类型 + * @param groups 导入分组 + */ + public List getDataList(Class cls, String... groups) throws InstantiationException, IllegalAccessException{ + return getDataList(cls, false, groups); + } + + /** + * 获取导入数据列表 + * @param cls 导入对象类型 + * @param isThrowException 遇见错误是否抛出异常 + * @param groups 导入分组 + */ + public List getDataList(Class cls, final boolean isThrowException, String... groups) throws InstantiationException, IllegalAccessException{ + return getDataList(cls, new MethodCallback() { + @Override + public Object execute(Object... params) { + if (isThrowException){ + Exception ex = (Exception)params[0]; + int rowNum = (int)params[1]; + int columnNum = (int)params[2]; + throw new ExcelException("Get cell value ["+rowNum+","+columnNum+"]", ex); + } + return null; + } + }, groups); + } + /** + * 获取导入数据列表 + * @param cls 导入对象类型 + * @param isThrowException 遇见错误是否抛出异常 + * @param groups 导入分组 + */ + public List getDataList(Class cls, MethodCallback exceptionCallback, String... groups) throws InstantiationException, IllegalAccessException{ + List annotationList = ListUtils.newArrayList(); + // Get annotation field + Field[] fs = cls.getDeclaredFields(); + for (Field f : fs){ + ExcelFields efs = f.getAnnotation(ExcelFields.class); + if (efs != null && efs.value() != null){ + for (ExcelField ef : efs.value()){ + addAnnotation(annotationList, ef, f, Type.IMPORT, groups); + } + } + ExcelField ef = f.getAnnotation(ExcelField.class); + addAnnotation(annotationList, ef, f, Type.IMPORT, groups); + } + // Get annotation method + Method[] ms = cls.getDeclaredMethods(); + for (Method m : ms){ + ExcelFields efs = m.getAnnotation(ExcelFields.class); + if (efs != null && efs.value() != null){ + for (ExcelField ef : efs.value()){ + addAnnotation(annotationList, ef, m, Type.IMPORT, groups); + } + } + ExcelField ef = m.getAnnotation(ExcelField.class); + addAnnotation(annotationList, ef, m, Type.IMPORT, groups); + } + // Field sorting + Collections.sort(annotationList, new Comparator() { + @Override + public int compare(Object[] o1, Object[] o2) { + return new Integer(((ExcelField)o1[0]).sort()).compareTo( + new Integer(((ExcelField)o2[0]).sort())); + }; + }); + //log.debug("Import column count:"+annotationList.size()); + // Get excel data + List dataList = ListUtils.newArrayList(); + for (int i = this.getDataRowNum(); i < this.getLastDataRowNum(); i++) { + E e = (E)cls.newInstance(); + Row row = this.getRow(i); + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < annotationList.size(); j++){//Object[] os : annotationList){ + Object[] os = annotationList.get(j); + ExcelField ef = (ExcelField)os[0]; + int column = (ef.column() != -1) ? ef.column() : j; + Object val = this.getCellValue(row, column); + if (val != null){ + // If is dict type, get dict value + if (StringUtils.isNotBlank(ef.dictType())){ + try{ + Class dictUtils = Class.forName("com.jeesite.modules.sys.utils.DictUtils"); + val = dictUtils.getMethod("getDictValue", String.class, String.class, + String.class).invoke(null, val.toString(), ef.dictType(), ""); + } catch (Exception ex) { + log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); + val = null; + } + //val = DictUtils.getDictValue(val.toString(), ef.dictType(), ""); + //log.debug("Dictionary type value: ["+i+","+colunm+"] " + val); + } + // Get param type and type cast + Class valType = Class.class; + if (os[1] instanceof Field){ + valType = ((Field)os[1]).getType(); + }else if (os[1] instanceof Method){ + Method method = ((Method)os[1]); + if ("get".equals(method.getName().substring(0, 3))){ + valType = method.getReturnType(); + }else if("set".equals(method.getName().substring(0, 3))){ + valType = ((Method)os[1]).getParameterTypes()[0]; + } + } + //log.debug("Import value type: ["+i+","+column+"] " + valType); + try { + if (valType == String.class){ + String s = String.valueOf(val.toString()); + if(StringUtils.endsWith(s, ".0")){ + val = StringUtils.substringBefore(s, ".0"); + }else{ + val = String.valueOf(val.toString()); + } + }else if (valType == Integer.class){ + val = Double.valueOf(val.toString()).intValue(); + }else if (valType == Long.class){ + val = Double.valueOf(val.toString()).longValue(); + }else if (valType == Double.class){ + val = Double.valueOf(val.toString()); + }else if (valType == Float.class){ + val = Float.valueOf(val.toString()); + }else if (valType == Date.class){ + if (val instanceof String){ + val = DateUtils.parseDate(val); + }else{ + // POI Excel 日期格式转换 + val = DateUtil.getJavaDate((Double)val); + } + }else{ + if (ef.fieldType() != Class.class){ + val = ef.fieldType().getMethod("getValue", String.class).invoke(null, val.toString()); + }else{ + val = Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(), + "fieldtype."+valType.getSimpleName()+"Type")).getMethod("getValue", String.class).invoke(null, val.toString()); + } + } + } catch (Exception ex) { + log.info("Get cell value ["+i+","+column+"] error: " + ex.toString()); + val = null; + // 参数:Exception ex, int rowNum, int columnNum + exceptionCallback.execute(ex, i, column); + } + // set entity value + if (os[1] instanceof Field){ + ReflectUtils.invokeSetter(e, ((Field)os[1]).getName(), val); + }else if (os[1] instanceof Method){ + String mthodName = ((Method)os[1]).getName(); + if ("get".equals(mthodName.substring(0, 3))){ + mthodName = "set"+StringUtils.substringAfter(mthodName, "get"); + } + ReflectUtils.invokeMethod(e, mthodName, new Class[] {valType}, new Object[] {val}); + } + } + sb.append(val+", "); + } + dataList.add(e); + log.debug("Read success: ["+i+"] "+sb.toString()); + } + return dataList; + } + +// /** +// * 导入测试 +// */ +// public static void main(String[] args) throws Throwable { +// +// ImportExcel ei = new ImportExcel("target/export.xlsx", 1); +// +// for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) { +// Row row = ei.getRow(i); +// for (int j = 0; j < ei.getLastCellNum(); j++) { +// Object val = ei.getCellValue(row, j); +// System.out.print(val+", "); +// } +// System.out.print("\n"); +// } +// +// } + +} diff --git a/modules/core/src/main/java/com/jeesite/modules/db/InitCoreData.xlsx b/modules/core/src/main/java/com/jeesite/modules/db/InitCoreData.xlsx index 8993227931a51a3003934e8189dd30d704b0eeff..a2cc279e8c9be00d20720589239bf5df743eebf5 100644 GIT binary patch delta 47459 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 delta 47341 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∋8X=wR(4xKUVmE{ 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 diff --git a/modules/core/src/main/resources/views/modules/sys/sysIndex/topMenu.html b/modules/core/src/main/resources/views/modules/sys/sysIndex/topMenu.html index e6cb3f55..ec13a9fb 100644 --- a/modules/core/src/main/resources/views/modules/sys/sysIndex/topMenu.html +++ b/modules/core/src/main/resources/views/modules/sys/sysIndex/topMenu.html @@ -1,27 +1,26 @@ -<% var productName = @Global.getConfig('productName'); %> -