| @@ -58,17 +58,17 @@ https://oss.sonatype.org/content/repositories/snapshots/ | |||||
| <dependency> | <dependency> | ||||
| <groupId>org.jeecg</groupId> | <groupId>org.jeecg</groupId> | ||||
| <artifactId>easypoi-base</artifactId> | <artifactId>easypoi-base</artifactId> | ||||
| <version>2.1.6</version> | |||||
| <version>2.3.0</version> | |||||
| </dependency> | </dependency> | ||||
| <dependency> | <dependency> | ||||
| <groupId>org.jeecg</groupId> | <groupId>org.jeecg</groupId> | ||||
| <artifactId>easypoi-web</artifactId> | <artifactId>easypoi-web</artifactId> | ||||
| <version>2.1.6</version> | |||||
| <version>2.3.0</version> | |||||
| </dependency> | </dependency> | ||||
| <dependency> | <dependency> | ||||
| <groupId>org.jeecg</groupId> | <groupId>org.jeecg</groupId> | ||||
| <artifactId>easypoi-annotation</artifactId> | <artifactId>easypoi-annotation</artifactId> | ||||
| <version>2.1.6</version> | |||||
| <version>2.3.0</version> | |||||
| </dependency> | </dependency> | ||||
| ``` | ``` | ||||
| @@ -173,7 +173,17 @@ word和sax读取的时候才使用,就不是必须的了,请手动引用,JSR303 | |||||
| -------------------------- | -------------------------- | ||||
| 版本修改 | 版本修改 | ||||
| -------------------------- | -------------------------- | ||||
| - 2.3.0 修复bug,推荐更新 | |||||
| - 提供的PDF基础的Excel导出支持 | |||||
| - 提供了Excel Charts的导出支持 | |||||
| - 升级了POI | |||||
| - 提供了Word换行支持 | |||||
| - 图片提供统一缓存 | |||||
| - 增加Cell取值工具,自动分辨合并单元格和独立单元格 | |||||
| - 修复合并单元格,获取cell改为递归,之前判断有问题 | |||||
| - 修改了下,el表达式的==判断,给fe加上了样式自定义方法 | |||||
| - 修复if(),单字段的判断 | |||||
| - 修复其他一些bug | |||||
| - 2.1.6 校验规则不向下兼容,升级请自行考虑 | - 2.1.6 校验规则不向下兼容,升级请自行考虑 | ||||
| - 其实不想升的,不过有必要的bug要修复,所以就先生上来吧 | - 其实不想升的,不过有必要的bug要修复,所以就先生上来吧 | ||||
| - 升级交易为hibernate校验,hibernate的maven自己配置可选 | - 升级交易为hibernate校验,hibernate的maven自己配置可选 | ||||
| @@ -364,17 +374,14 @@ EasyPoi导出实例 | |||||
| 8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口 | 8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口 | ||||
| ```Java | ```Java | ||||
| /** | |||||
| * Email校验 | |||||
| */ | |||||
| @Excel(name = "Email", width = 25) | @Excel(name = "Email", width = 25) | ||||
| @ExcelVerify(isEmail = true, notNull = true) | |||||
| private String email; | |||||
| @Max(value = 15,message = "max 最大值不能超过15") | |||||
| private int email; | |||||
| /** | /** | ||||
| * 手机号校验 | |||||
| * 手机号 | |||||
| */ | */ | ||||
| @Excel(name = "Mobile", width = 20) | @Excel(name = "Mobile", width = 20) | ||||
| @ExcelVerify(isMobile = true, notNull = true) | |||||
| @NotNull | |||||
| private String mobile; | private String mobile; | ||||
| ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File( | ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File( | ||||
| @@ -25,6 +25,7 @@ import java.util.Iterator; | |||||
| import java.util.List; | import java.util.List; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.apache.poi.util.IOUtils; | |||||
| import org.jeecgframework.poi.cache.ImageCache; | import org.jeecgframework.poi.cache.ImageCache; | ||||
| import org.jeecgframework.poi.excel.annotation.ExcelTarget; | import org.jeecgframework.poi.excel.annotation.ExcelTarget; | ||||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | ||||
| @@ -95,7 +96,11 @@ public class PdfExportServer extends ExportBase { | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| LOGGER.error(e.getMessage(), e); | LOGGER.error(e.getMessage(), e); | ||||
| } finally { | } finally { | ||||
| document.close(); | |||||
| try { | |||||
| document.close(); | |||||
| } catch (Exception e) { | |||||
| //可能之前已经关闭过了 | |||||
| } | |||||
| } | } | ||||
| return document; | return document; | ||||
| } | } | ||||
| @@ -129,6 +134,8 @@ public class PdfExportServer extends ExportBase { | |||||
| LOGGER.error(e.getMessage(), e); | LOGGER.error(e.getMessage(), e); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| LOGGER.error(e.getMessage(), e); | LOGGER.error(e.getMessage(), e); | ||||
| } finally { | |||||
| document.close(); | |||||
| } | } | ||||
| return document; | return document; | ||||
| } | } | ||||
| @@ -4,6 +4,8 @@ dependencies { | |||||
| compile group: 'org.springframework', name: 'spring-web', version:'3.1.1.RELEASE' | compile group: 'org.springframework', name: 'spring-web', version:'3.1.1.RELEASE' | ||||
| compile group: 'org.springframework', name: 'spring-webmvc', version:'3.1.1.RELEASE' | compile group: 'org.springframework', name: 'spring-webmvc', version:'3.1.1.RELEASE' | ||||
| compile group: 'org.springframework', name: 'spring-core', version:'3.1.1.RELEASE' | compile group: 'org.springframework', name: 'spring-core', version:'3.1.1.RELEASE' | ||||
| compile group: 'org.springframework', name: 'spring-core', version:'3.1.1.RELEASE' | |||||
| compile group: 'com.itextpdf', name: 'itextpdf', version:'5.5.6' | |||||
| compile project(':easypoi-base') | compile project(':easypoi-base') | ||||
| compile(group: 'javax.servlet', name: 'servlet-api', version:'2.5') { | compile(group: 'javax.servlet', name: 'servlet-api', version:'2.5') { | ||||
| /* This dependency was originally in the Maven provided scope, but the project was not of type war. | /* This dependency was originally in the Maven provided scope, but the project was not of type war. | ||||
| @@ -28,6 +28,13 @@ | |||||
| <scope>provided</scope> | <scope>provided</scope> | ||||
| </dependency> | </dependency> | ||||
| <!-- PDF --> | |||||
| <dependency> | |||||
| <groupId>com.itextpdf</groupId> | |||||
| <artifactId>itextpdf</artifactId> | |||||
| <optional>true</optional> | |||||
| </dependency> | |||||
| <dependency> | <dependency> | ||||
| <groupId>org.jeecg</groupId> | <groupId>org.jeecg</groupId> | ||||
| <artifactId>easypoi-base</artifactId> | <artifactId>easypoi-base</artifactId> | ||||
| @@ -0,0 +1,33 @@ | |||||
| /** | |||||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| package org.jeecgframework.poi.excel.entity.vo; | |||||
| public interface PDFTemplateConstants extends BasePOIConstants { | |||||
| /** | |||||
| */ | |||||
| public final static String PDF_TEMPLATE_VIEW = "pdfTemplateView"; | |||||
| /** | |||||
| * Entity List | |||||
| */ | |||||
| public final static String ENTITY_LIST = "EntityList"; | |||||
| /** | |||||
| * 数据列表 | |||||
| */ | |||||
| public final static String DATA_LIST = "dataList"; | |||||
| } | |||||
| @@ -25,7 +25,6 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument; | |||||
| import org.jeecgframework.poi.excel.entity.vo.TemplateWordConstants; | import org.jeecgframework.poi.excel.entity.vo.TemplateWordConstants; | ||||
| import org.jeecgframework.poi.word.WordExportUtil; | import org.jeecgframework.poi.word.WordExportUtil; | ||||
| import org.springframework.stereotype.Controller; | import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.servlet.view.AbstractView; | |||||
| /** | /** | ||||
| * Word模板视图 | * Word模板视图 | ||||
| @@ -35,7 +34,7 @@ import org.springframework.web.servlet.view.AbstractView; | |||||
| */ | */ | ||||
| @SuppressWarnings("unchecked") | @SuppressWarnings("unchecked") | ||||
| @Controller(TemplateWordConstants.JEECG_TEMPLATE_WORD_VIEW) | @Controller(TemplateWordConstants.JEECG_TEMPLATE_WORD_VIEW) | ||||
| public class JeecgTemplateWordView extends AbstractView { | |||||
| public class JeecgTemplateWordView extends PoiBaseView { | |||||
| private static final String CONTENT_TYPE = "application/msword"; | private static final String CONTENT_TYPE = "application/msword"; | ||||
| @@ -43,11 +42,6 @@ public class JeecgTemplateWordView extends AbstractView { | |||||
| setContentType(CONTENT_TYPE); | setContentType(CONTENT_TYPE); | ||||
| } | } | ||||
| public boolean isIE(HttpServletRequest request) { | |||||
| return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request | |||||
| .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true : false; | |||||
| } | |||||
| @Override | @Override | ||||
| protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, | protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, | ||||
| HttpServletResponse response) throws Exception { | HttpServletResponse response) throws Exception { | ||||
| @@ -18,7 +18,6 @@ package org.jeecgframework.poi.excel.view; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import javax.annotation.Resource; | |||||
| import javax.servlet.ServletOutputStream; | import javax.servlet.ServletOutputStream; | ||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| @@ -15,16 +15,12 @@ | |||||
| */ | */ | ||||
| package org.jeecgframework.poi.excel.view; | package org.jeecgframework.poi.excel.view; | ||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import org.springframework.web.servlet.view.AbstractView; | |||||
| /** | /** | ||||
| * 基础抽象Excel View | * 基础抽象Excel View | ||||
| * @author JueYue | * @author JueYue | ||||
| * @date 2015年2月28日 下午1:41:05 | * @date 2015年2月28日 下午1:41:05 | ||||
| */ | */ | ||||
| public abstract class MiniAbstractExcelView extends AbstractView { | |||||
| public abstract class MiniAbstractExcelView extends PoiBaseView { | |||||
| private static final String CONTENT_TYPE = "application/vnd.ms-excel"; | private static final String CONTENT_TYPE = "application/vnd.ms-excel"; | ||||
| @@ -35,9 +31,4 @@ public abstract class MiniAbstractExcelView extends AbstractView { | |||||
| setContentType(CONTENT_TYPE); | setContentType(CONTENT_TYPE); | ||||
| } | } | ||||
| protected boolean isIE(HttpServletRequest request) { | |||||
| return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request | |||||
| .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true : false; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,81 @@ | |||||
| /** | |||||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| package org.jeecgframework.poi.excel.view; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.util.Collection; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import org.apache.commons.lang3.StringUtils; | |||||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||||
| import org.jeecgframework.poi.excel.entity.vo.PDFTemplateConstants; | |||||
| import org.jeecgframework.poi.pdf.PdfExportUtil; | |||||
| import org.jeecgframework.poi.pdf.entity.PdfExportParams; | |||||
| import org.springframework.stereotype.Controller; | |||||
| /** | |||||
| * PDF 导出 View | |||||
| * @author JueYue | |||||
| * @date 2016年1月19日 上午10:43:02 | |||||
| */ | |||||
| @Controller(PDFTemplateConstants.PDF_TEMPLATE_VIEW) | |||||
| public class PDFTemplateView extends PoiBaseView { | |||||
| public PDFTemplateView() { | |||||
| setContentType("application/pdf"); | |||||
| } | |||||
| @Override | |||||
| protected boolean generatesDownloadContent() { | |||||
| return true; | |||||
| } | |||||
| @Override | |||||
| @SuppressWarnings("unchecked") | |||||
| protected final void renderMergedOutputModel(Map<String, Object> model, | |||||
| HttpServletRequest request, | |||||
| HttpServletResponse response) throws Exception { | |||||
| String fileName = "临时文件"; | |||||
| ByteArrayOutputStream baos = createTemporaryOutputStream(); | |||||
| PdfExportParams entity = (PdfExportParams) model.get(PDFTemplateConstants.PARAMS); | |||||
| Class<?> pojoClass = (Class<?>) model.get(PDFTemplateConstants.CLASS); | |||||
| Collection<?> dataSet = (Collection<?>) model.get(PDFTemplateConstants.DATA_LIST); | |||||
| List<ExcelExportEntity> entityList = (List<ExcelExportEntity>) model | |||||
| .get(PDFTemplateConstants.ENTITY_LIST); | |||||
| if (entityList == null) { | |||||
| PdfExportUtil.exportPdf(entity, pojoClass, dataSet, baos); | |||||
| } else { | |||||
| PdfExportUtil.exportPdf(entity, entityList, (Collection<? extends Map<?, ?>>) dataSet, | |||||
| baos); | |||||
| } | |||||
| String userFileName = (String) model.get(PDFTemplateConstants.FILE_NAME); | |||||
| if (StringUtils.isNoneBlank(userFileName)) { | |||||
| fileName = userFileName; | |||||
| } | |||||
| if (isIE(request)) { | |||||
| fileName = java.net.URLEncoder.encode(fileName, "UTF8"); | |||||
| } else { | |||||
| fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); | |||||
| } | |||||
| response.setHeader("content-disposition", "attachment;filename=" + fileName + ".pdf"); | |||||
| writeToResponse(response, baos); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,35 @@ | |||||
| /** | |||||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| package org.jeecgframework.poi.excel.view; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import org.springframework.web.servlet.view.AbstractView; | |||||
| /** | |||||
| * 提供一些通用结构 | |||||
| */ | |||||
| public abstract class PoiBaseView extends AbstractView { | |||||
| protected boolean isIE(HttpServletRequest request) { | |||||
| return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 | |||||
| || request.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0 | |||||
| || request.getHeader("USER-AGENT").toLowerCase().indexOf("edge") > 0) ? true | |||||
| : false; | |||||
| } | |||||
| } | |||||