diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java index 61d91ac..036d7a0 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java @@ -10,6 +10,7 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.TemplateExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.jeecgframework.poi.excel.export.ExcelExportServer; @@ -35,14 +36,14 @@ public final class ExcelExportUtil { public static Workbook exportExcel(ExportParams entity, Class pojoClass, Collection dataSet) { Workbook workbook; - if (entity.getType().equals(PoiBaseConstants.HSSF)) { + if (entity.getType().equals(ExcelType.HSSF)) { workbook = new HSSFWorkbook(); } else if (dataSet.size() < 1000) { workbook = new XSSFWorkbook(); } else { workbook = new SXSSFWorkbook(); } - new ExcelExportServer().createSheet(workbook, entity, pojoClass, dataSet, entity.getType()); + new ExcelExportServer().createSheet(workbook, entity, pojoClass, dataSet); return workbook; } @@ -58,15 +59,14 @@ public final class ExcelExportUtil { public static Workbook exportExcel(ExportParams entity, List entityList, Collection> dataSet) { Workbook workbook; - if (entity.getType().equals(PoiBaseConstants.HSSF)) { + if (entity.getType().equals(ExcelType.HSSF)) { workbook = new HSSFWorkbook(); } else if (dataSet.size() < 1000) { workbook = new XSSFWorkbook(); } else { workbook = new SXSSFWorkbook(); } - new ExcelExportServer().createSheetForMap(workbook, entity, entityList, dataSet, - entity.getType()); + new ExcelExportServer().createSheetForMap(workbook, entity, entityList, dataSet); return workbook; } @@ -80,7 +80,7 @@ public final class ExcelExportUtil { */ public static Workbook exportExcel(List> list, String type) { Workbook workbook; - if (type.equals(PoiBaseConstants.HSSF)) { + if (type.equals(ExcelType.HSSF)) { workbook = new HSSFWorkbook(); } else { workbook = new XSSFWorkbook(); @@ -88,7 +88,7 @@ public final class ExcelExportUtil { ExcelExportServer server = new ExcelExportServer(); for (Map map : list) { server.createSheet(workbook, (ExportParams) map.get("title"), - (Class) map.get("entity"), (Collection) map.get("data"), type); + (Class) map.get("entity"), (Collection) map.get("data")); } return workbook; } 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 83aef57..7cbf4ec 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 @@ -9,14 +9,6 @@ import org.jeecgframework.poi.handler.inter.IExcelDataHandler; */ 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/ExportParams.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExportParams.java index 3fe6bbd..5479f75 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExportParams.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/ExportParams.java @@ -1,7 +1,7 @@ package org.jeecgframework.poi.excel.entity; import org.apache.poi.hssf.util.HSSFColor; -import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; /** * Excel 导出参数 @@ -14,46 +14,50 @@ public class ExportParams extends ExcelBaseParams { /** * 表格名称 */ - private String title; + private String title; /** * 表格名称 */ - private short titleHeight = 20; + private short titleHeight = 20; /** * 第二行名称 */ - private String secondTitle; + private String secondTitle; /** * 表格名称 */ - private short secondTitleHeight = 8; + private short secondTitleHeight = 8; /** * sheetName */ - private String sheetName; + private String sheetName; /** * 过滤的属性 */ - private String[] exclusions; + private String[] exclusions; /** * 是否添加需要需要 */ - private boolean addIndex; + private boolean addIndex; + /** + * 是否添加需要需要 + */ + private String indexName = "序号"; /** * 表头颜色 */ - private short color = HSSFColor.WHITE.index; + private short color = HSSFColor.WHITE.index; /** * 属性说明行的颜色 例如:HSSFColor.SKY_BLUE.index 默认 */ - private short headerColor = HSSFColor.SKY_BLUE.index; + private short headerColor = HSSFColor.SKY_BLUE.index; /** * Excel 导出版本 */ - private String type = PoiBaseConstants.HSSF; + private ExcelType type = ExcelType.HSSF; public ExportParams() { @@ -64,6 +68,12 @@ public class ExportParams extends ExcelBaseParams { this.sheetName = sheetName; } + public ExportParams(String title, String sheetName, ExcelType type) { + this.title = title; + this.sheetName = sheetName; + this.type = type; + } + public ExportParams(String title, String secondTitle, String sheetName) { this.title = title; this.secondTitle = secondTitle; @@ -142,11 +152,20 @@ public class ExportParams extends ExcelBaseParams { this.titleHeight = titleHeight; } - public String getType() { + public ExcelType getType() { return type; } - public void setType(String type) { + public void setType(ExcelType type) { this.type = type; } + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/CellValueType.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/CellValueType.java new file mode 100644 index 0000000..8bd6df6 --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/CellValueType.java @@ -0,0 +1,12 @@ +package org.jeecgframework.poi.excel.entity.enmus; + +/** + * Cell 值得类型 + * @author JueYue + * @date 2014年12月29日 下午10:20:49 + */ +public enum CellValueType { + + String, Number, Boolean, Date, TElement, Null, None; + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/ExcelType.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/ExcelType.java new file mode 100644 index 0000000..d25b9b9 --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/enmus/ExcelType.java @@ -0,0 +1,12 @@ +package org.jeecgframework.poi.excel.entity.enmus; + +/** + * Excel Type + * @author JueYue + * @date 2014年12月29日 下午9:08:21 + */ +public enum ExcelType { + + HSSF, XSSF; + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java new file mode 100644 index 0000000..139d1fe --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/sax/SaxReadCellEntity.java @@ -0,0 +1,41 @@ +package org.jeecgframework.poi.excel.entity.sax; + +import org.jeecgframework.poi.excel.entity.enmus.CellValueType; + +/** + * Cell 对象 + * @author JueYue + * @date 2014年12月29日 下午10:12:57 + */ +public class SaxReadCellEntity { + /** + * 值类型 + */ + private CellValueType cellType; + /** + * 值 + */ + private Object value; + + public SaxReadCellEntity(CellValueType cellType, Object value) { + this.cellType = cellType; + this.value = value; + } + + public CellValueType getCellType() { + return cellType; + } + + public void setCellType(CellValueType cellType) { + this.cellType = cellType; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/vo/PoiBaseConstants.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/vo/PoiBaseConstants.java index c2d83dc..4f8900b 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/vo/PoiBaseConstants.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/entity/vo/PoiBaseConstants.java @@ -21,13 +21,5 @@ public interface PoiBaseConstants { * 是否增加属性列 */ public static String IS_ADD_INDEX = "isAddIndex"; - /** - * 03版本Excel - */ - public static String HSSF = "HSSF"; - /** - * 07版本Excel - */ - public static String XSSF = "XSSF"; } 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 0541774..d59ec69 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 @@ -19,6 +19,7 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.jeecgframework.poi.excel.annotation.ExcelTarget; import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.jeecgframework.poi.excel.export.base.ExcelExportBase; @@ -80,18 +81,19 @@ public class ExcelExportServer extends ExcelExportBase { } public void createSheet(Workbook workbook, ExportParams entity, Class pojoClass, - Collection dataSet, String type) { + Collection dataSet) { if (logger.isDebugEnabled()) { logger.debug("Excel export start ,class is {}", pojoClass); - logger.debug("Excel version is {}", type.equals(PoiBaseConstants.HSSF) ? "03" : "07"); + logger.debug("Excel version is {}", entity.getType().equals(ExcelType.HSSF) ? "03" + : "07"); } if (workbook == null || entity == null || pojoClass == null || dataSet == null) { throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); } - if (type.equals(PoiBaseConstants.XSSF)) { + super.type = entity.getType(); + if (type.equals(ExcelType.XSSF)) { MAX_NUM = 1000000; } - super.type = type; Sheet sheet = null; try { sheet = workbook.createSheet(entity.getSheetName()); @@ -109,7 +111,7 @@ public class ExcelExportServer extends ExcelExportBase { Drawing patriarch = sheet.createDrawingPatriarch(); List excelParams = new ArrayList(); if (entity.isAddIndex()) { - excelParams.add(indexExcelEntity()); + excelParams.add(indexExcelEntity(entity)); } // 得到所有字段 Field fileds[] = POIPublicUtil.getClassFields(pojoClass); @@ -140,11 +142,11 @@ public class ExcelExportServer extends ExcelExportBase { its.remove(); } // 创建合计信息 - addStatisticsRow(styles.get("one"),sheet); - + addStatisticsRow(styles.get("one"), sheet); + // 发现还有剩余list 继续循环创建Sheet if (dataSet.size() > 0) { - createSheet(workbook, entity, pojoClass, dataSet, type); + createSheet(workbook, entity, pojoClass, dataSet); } } catch (Exception e) { @@ -156,17 +158,18 @@ public class ExcelExportServer extends ExcelExportBase { public void createSheetForMap(Workbook workbook, ExportParams entity, List entityList, - Collection> dataSet, String type) { + Collection> dataSet) { if (logger.isDebugEnabled()) { - logger.debug("Excel version is {}", type.equals(PoiBaseConstants.HSSF) ? "03" : "07"); + logger.debug("Excel version is {}", entity.getType().equals(ExcelType.HSSF) ? "03" + : "07"); } if (workbook == null || entity == null || entityList == null || dataSet == null) { throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); } - if (type.equals(PoiBaseConstants.XSSF)) { + super.type = entity.getType(); + if (type.equals(ExcelType.XSSF)) { MAX_NUM = 1000000; } - super.type = type; Sheet sheet = null; try { sheet = workbook.createSheet(entity.getSheetName()); @@ -184,7 +187,7 @@ public class ExcelExportServer extends ExcelExportBase { Drawing patriarch = sheet.createDrawingPatriarch(); List excelParams = new ArrayList(); if (entity.isAddIndex()) { - excelParams.add(indexExcelEntity()); + excelParams.add(indexExcelEntity(entity)); } excelParams.addAll(entityList); sortAllParams(excelParams); @@ -212,7 +215,7 @@ public class ExcelExportServer extends ExcelExportBase { } // 发现还有剩余list 继续循环创建Sheet if (dataSet.size() > 0) { - createSheetForMap(workbook, entity, entityList, dataSet, type); + createSheetForMap(workbook, entity, entityList, dataSet); } } catch (Exception e) { @@ -364,13 +367,13 @@ public class ExcelExportServer extends ExcelExportBase { return style; } - private ExcelExportEntity indexExcelEntity() { - ExcelExportEntity entity = new ExcelExportEntity(); - entity.setOrderNum(0); - entity.setName("序号"); - entity.setWidth(10); - entity.setFormat(PoiBaseConstants.IS_ADD_INDEX); - return entity; + private ExcelExportEntity indexExcelEntity(ExportParams entity) { + ExcelExportEntity exportEntity = new ExcelExportEntity(); + exportEntity.setOrderNum(0); + exportEntity.setName(entity.getIndexName()); + exportEntity.setWidth(10); + exportEntity.setFormat(PoiBaseConstants.IS_ADD_INDEX); + return exportEntity; } } 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 f981f04..99b7039 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 @@ -28,6 +28,7 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.entity.params.MergeEntity; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; @@ -43,7 +44,7 @@ public abstract class ExcelExportBase extends ExportBase { private int currentIndex = 0; - protected String type = PoiBaseConstants.HSSF; + protected ExcelType type = ExcelType.HSSF; private Map statistics = new HashMap(); @@ -150,7 +151,7 @@ public abstract class ExcelExportBase extends ExportBase { row.setHeight((short) (50 * entity.getHeight())); row.createCell(i); ClientAnchor anchor; - if (type.equals(PoiBaseConstants.HSSF)) { + if (type.equals(ExcelType.HSSF)) { anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) i, row.getRowNum(), (short) (i + 1), row.getRowNum() + 1); } else { @@ -255,7 +256,7 @@ public abstract class ExcelExportBase extends ExportBase { ExcelExportEntity entity) { Cell cell = row.createCell(index); RichTextString Rtext; - if (type.equals(PoiBaseConstants.HSSF)) { + if (type.equals(ExcelType.HSSF)) { Rtext = new HSSFRichTextString(text); } else { Rtext = new XSSFRichTextString(text); 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 0a9dfb2..9b0578f 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 @@ -18,8 +18,8 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jeecgframework.poi.cache.ExcelCache; import org.jeecgframework.poi.excel.annotation.ExcelTarget; -import org.jeecgframework.poi.excel.entity.ExcelBaseParams; import org.jeecgframework.poi.excel.entity.TemplateExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.export.base.ExcelExportBase; import org.jeecgframework.poi.exception.excel.ExcelExportException; @@ -52,7 +52,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { throws Exception { if (workbook instanceof XSSFWorkbook) { - super.type = ExcelBaseParams.XSSF; + super.type = ExcelType.XSSF; } // 获取表头数据 Map titlemap = getTitleMap(params, sheet); diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java new file mode 100644 index 0000000..1d2c8cf --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SaxReadExcel.java @@ -0,0 +1,61 @@ +package org.jeecgframework.poi.excel.imports.sax; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import java.util.List; + +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.exceptions.OpenXML4JException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.xssf.eventusermodel.XSSFReader; +import org.apache.poi.xssf.model.SharedStringsTable; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.imports.sax.parse.ISaxRowRead; +import org.jeecgframework.poi.excel.imports.sax.parse.SaxRowRead; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +/** + * 基于SAX Excel大数据读取,读取Excel 07版本,不支持图片读取 + * @author JueYue + * @date 2014年12月29日 下午9:41:38 + * @version 1.0 + */ +public class SaxReadExcel { + + public List readExcel(InputStream inputstream, Class pojoClass, ImportParams params) { + try { + OPCPackage opcPackage = OPCPackage.open(inputstream); + XSSFReader xssfReader = new XSSFReader(opcPackage); + SharedStringsTable sst = xssfReader.getSharedStringsTable(); + ISaxRowRead rowRead = new SaxRowRead(); + XMLReader parser = fetchSheetParser(sst, rowRead); + Iterator sheets = xssfReader.getSheetsData(); + int sheetIndex = 0; + while (sheets.hasNext() && sheetIndex < params.getSheetNum()) { + sheetIndex++; + InputStream sheet = sheets.next(); + InputSource sheetSource = new InputSource(sheet); + parser.parse(sheetSource); + sheet.close(); + } + return rowRead.getList(); + } catch (Exception e) { + } + + return null; + } + + public XMLReader fetchSheetParser(SharedStringsTable sst, ISaxRowRead rowRead) + throws SAXException { + XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); + ContentHandler handler = new SheetHandler(sst, rowRead); + parser.setContentHandler(handler); + return parser; + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java new file mode 100644 index 0000000..d955e8c --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/SheetHandler.java @@ -0,0 +1,122 @@ +package org.jeecgframework.poi.excel.imports.sax; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.xssf.model.SharedStringsTable; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; +import org.jeecgframework.poi.excel.entity.enmus.CellValueType; +import org.jeecgframework.poi.excel.entity.sax.SaxReadCellEntity; +import org.jeecgframework.poi.excel.imports.sax.parse.ISaxRowRead; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.google.common.collect.Lists; + +/** + * 回调接口 + * @author JueYue + * @date 2014年12月29日 下午9:50:09 + */ +public class SheetHandler extends DefaultHandler { + + private SharedStringsTable sst; + private String lastContents; + + //当前行 + private int curRow = 0; + //当前列 + private int curCol = 0; + + private CellValueType type; + + private ISaxRowRead read; + + //存储行记录的容器 + private List rowlist = Lists.newArrayList(); + + public SheetHandler(SharedStringsTable sst, ISaxRowRead rowRead) { + this.sst = sst; + this.read = rowRead; + } + + @Override + public void startElement(String uri, String localName, String name, Attributes attributes) + throws SAXException { + // 置空 + lastContents = ""; + // c => 单元格 + if ("c".equals(name)) { + // 如果下一个元素是 SST 的索引,则将nextIsString标记为true + String cellType = attributes.getValue("t"); + if ("s".equals(cellType)) { + type = CellValueType.String; + return; + } + //日期格式 + cellType = attributes.getValue("s"); + if ("1".equals(cellType)) { + type = CellValueType.Date; + } else if ("2".equals(cellType)) { + type = CellValueType.Number; + } + } else if ("t".equals(name)) {//当元素为t时 + type = CellValueType.TElement; + } + + } + + @Override + public void endElement(String uri, String localName, String name) throws SAXException { + + // 根据SST的索引值的到单元格的真正要存储的字符串 + // 这时characters()方法可能会被调用多次 + if (CellValueType.String.equals(type)) { + try { + int idx = Integer.parseInt(lastContents); + lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); + } catch (Exception e) { + + } + } + //t元素也包含字符串 + if (CellValueType.TElement.equals(type)) { + String value = lastContents.trim(); + rowlist.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); + curCol++; + type = CellValueType.None; + // v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引 + // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符 + } else if ("v".equals(name)) { + String value = lastContents.trim(); + value = value.equals("") ? " " : value; + if (CellValueType.Date.equals(type)) { + Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value)); + rowlist.add(curCol, new SaxReadCellEntity(CellValueType.Date, date)); + } else if (CellValueType.Number.equals(type)) { + BigDecimal bd = new BigDecimal(value); + rowlist.add(curCol, new SaxReadCellEntity(CellValueType.Number, bd)); + } + curCol++; + } else { + //如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 + if (name.equals("row")) { + read.parse(curRow, rowlist); + rowlist.clear(); + curRow++; + curCol = 0; + } + } + + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + //得到单元格内容的值 + lastContents += new String(ch, start, length); + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/ISaxRowRead.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/ISaxRowRead.java new file mode 100644 index 0000000..0359f74 --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/ISaxRowRead.java @@ -0,0 +1,22 @@ +package org.jeecgframework.poi.excel.imports.sax.parse; + +import java.util.List; + +import org.jeecgframework.poi.excel.entity.sax.SaxReadCellEntity; + +public interface ISaxRowRead { + /** + * 获取返回数据 + * @param + * @return + */ + public List getList(); + /** + * 解析数据 + * @param index + * @param datas + */ + public void parse(int index, List datas); + + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java new file mode 100644 index 0000000..1486bc1 --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/sax/parse/SaxRowRead.java @@ -0,0 +1,34 @@ +package org.jeecgframework.poi.excel.imports.sax.parse; + +import java.util.List; + +import org.jeecgframework.poi.excel.entity.sax.SaxReadCellEntity; + +import com.google.common.collect.Lists; + +/** + * 当行读取数据 + * @author JueYue + * @param + * @date 2015年1月1日 下午7:59:39 + */ +@SuppressWarnings("rawtypes") +public class SaxRowRead implements ISaxRowRead { + + private List list; + + public SaxRowRead() { + list = Lists.newArrayList(); + } + + @Override + public List getList() { + return list; + } + + @Override + public void parse(int index, List datas) { + + } + +} diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportForMap.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportForMap.java index 8e4f39c..af8b591 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportForMap.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportForMap.java @@ -12,6 +12,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workbook; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.junit.Test; @@ -65,8 +66,7 @@ public class ExcelExportForMap { } list.add(map); } - ExportParams params = new ExportParams("测试", "测试"); - params.setType(PoiBaseConstants.XSSF); + ExportParams params = new ExportParams("测试", "测试", ExcelType.HSSF); Workbook workbook = ExcelExportUtil.exportExcel(params, entity, list); FileOutputStream fos = new FileOutputStream("d:/tt.xlsx"); workbook.write(fos); diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportMsgClient.java b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportMsgClient.java index 1054563..b2aba92 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportMsgClient.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/excel/test/ExcelExportMsgClient.java @@ -15,6 +15,7 @@ import org.jeecgframework.poi.entity.MsgClient; import org.jeecgframework.poi.entity.MsgClientGroup; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.junit.Test; /** @@ -42,8 +43,7 @@ public class ExcelExportMsgClient { list.add(client); } Date start = new Date(); - ExportParams params = new ExportParams("2412312", "测试"); - params.setType(PoiBaseConstants.XSSF); + ExportParams params = new ExportParams("2412312", "测试", ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(params, MsgClient.class, list); System.out.println(new Date().getTime() - start.getTime()); File savefile = new File("d:/"); 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 index a714c6f..c611d5b 100644 --- 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 @@ -11,6 +11,7 @@ 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.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.junit.Test; @@ -19,7 +20,7 @@ public class ExcelExportStatisticTest { public void test() throws Exception { List list = new ArrayList(); - for (int i = 0; i < 250000; i++) { + for (int i = 0; i < 25000; i++) { StatisticEntity client = new StatisticEntity(); client.setName("index" + i); client.setIntTest(1 + i); @@ -30,8 +31,7 @@ public class ExcelExportStatisticTest { list.add(client); } Date start = new Date(); - ExportParams params = new ExportParams("2412312", "测试"); - params.setType(ExportParams.XSSF); + ExportParams params = new ExportParams("2412312", "测试", ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(params, StatisticEntity.class, list); System.out.println(new Date().getTime() - start.getTime()); File savefile = new File("d:/"); 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 cca07ca..9ff00d2 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 @@ -14,6 +14,7 @@ import org.jeecgframework.poi.entity.TeacherEntity; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.TemplateExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.junit.Before; import org.junit.Test; @@ -33,15 +34,15 @@ public class ExcelExportUtilTest { @Test public void oneHundredThousandRowTest() throws Exception { + ExportParams params = new ExportParams("2412312", "测试", ExcelType.XSSF); Date start = new Date(); - Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("2412312", "测试"), - CourseEntity.class, list); + Workbook workbook = ExcelExportUtil.exportExcel(params, CourseEntity.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.xls"); + FileOutputStream fos = new FileOutputStream("d:/tt.xlsx"); workbook.write(fos); fos.close(); savefile = new File("d:/1"); @@ -49,7 +50,7 @@ public class ExcelExportUtilTest { savefile.setWritable(true, false); savefile.mkdirs(); } - fos = new FileOutputStream("d:/1/tt3.xls"); + fos = new FileOutputStream("d:/1/tt3.xlsx"); workbook.write(fos); fos.close(); } @@ -57,7 +58,7 @@ public class ExcelExportUtilTest { @Before public void testBefore() { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 2000000; i++) { courseEntity = new CourseEntity(); courseEntity.setId("1131"); courseEntity.setName("海贼王必修(" + (i + 1) + ")"); diff --git a/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgMapExcelView.java b/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgMapExcelView.java index 4cfa354..5013b8f 100644 --- a/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgMapExcelView.java +++ b/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgMapExcelView.java @@ -41,8 +41,7 @@ public class JeecgMapExcelView extends AbstractExcelView { new ExcelExportServer().createSheetForMap(hssfWorkbook, (ExportParams) model.get(MapExcelConstants.PARAMS), (List) model.get(MapExcelConstants.ENTITY_LIST), - (Collection>) model.get(MapExcelConstants.MAP_LIST), - ((ExportParams) model.get(MapExcelConstants.PARAMS)).getType()); + (Collection>) model.get(MapExcelConstants.MAP_LIST)); } public boolean isIE(HttpServletRequest request) { diff --git a/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgSingleExcelView.java b/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgSingleExcelView.java index 831ec2f..bb241be 100644 --- a/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgSingleExcelView.java +++ b/easypoi-web/src/main/java/org/jeecgframework/poi/excel/view/JeecgSingleExcelView.java @@ -9,7 +9,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.jeecgframework.poi.excel.entity.ExportParams; -import org.jeecgframework.poi.excel.entity.vo.MapExcelConstants; import org.jeecgframework.poi.excel.entity.vo.NormalExcelConstants; import org.jeecgframework.poi.excel.export.ExcelExportServer; import org.springframework.web.servlet.view.document.AbstractExcelView; @@ -42,15 +41,13 @@ public class JeecgSingleExcelView extends AbstractExcelView { new ExcelExportServer().createSheet(hssfWorkbook, (ExportParams) map.get(NormalExcelConstants.PARAMS), (Class) map.get(NormalExcelConstants.CLASS), - (Collection) map.get(NormalExcelConstants.DATA_LIST), - ((ExportParams) model.get(MapExcelConstants.PARAMS)).getType()); + (Collection) map.get(NormalExcelConstants.DATA_LIST)); } } else { new ExcelExportServer().createSheet(hssfWorkbook, (ExportParams) model.get(NormalExcelConstants.PARAMS), (Class) model.get(NormalExcelConstants.CLASS), - (Collection) model.get(NormalExcelConstants.DATA_LIST), - ((ExportParams) model.get(MapExcelConstants.PARAMS)).getType()); + (Collection) model.get(NormalExcelConstants.DATA_LIST)); } } diff --git a/pom.xml b/pom.xml index 9f63eee..ab5d12b 100644 --- a/pom.xml +++ b/pom.xml @@ -24,10 +24,7 @@ 2.0.7-SNAPSHOT - 3.9 - 3.9 - 3.9 - 3.9 + 3.11 16.0.1 1.09 2.6 @@ -46,17 +43,17 @@ org.apache.poi poi-ooxml - ${poi-ooxml.version} + ${poi.version} org.apache.poi poi-ooxml-schemas - ${poi-ooxml-schemas.version} + ${poi.version} org.apache.poi poi-scratchpad - ${poi-scratchpad.version} + ${poi.version}