@@ -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; | |||||
} | |||||
} |