@@ -0,0 +1,70 @@ | |||||
/** | |||||
* 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.cache; | |||||
import java.awt.image.BufferedImage; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.InputStream; | |||||
import java.util.concurrent.TimeUnit; | |||||
import javax.imageio.ImageIO; | |||||
import org.apache.poi.util.IOUtils; | |||||
import org.jeecgframework.poi.cache.manager.POICacheManager; | |||||
import com.google.common.cache.CacheBuilder; | |||||
import com.google.common.cache.CacheLoader; | |||||
import com.google.common.cache.LoadingCache; | |||||
/** | |||||
* 图片缓存处理 | |||||
* @author JueYue | |||||
* @date 2016年1月8日 下午4:16:32 | |||||
*/ | |||||
public class ImageCache { | |||||
private static LoadingCache<String, byte[]> loadingCache; | |||||
static { | |||||
loadingCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.DAYS) | |||||
.maximumSize(2000).build(new CacheLoader<String, byte[]>() { | |||||
@Override | |||||
public byte[] load(String imagePath) throws Exception { | |||||
InputStream is = POICacheManager.getFile(imagePath); | |||||
BufferedImage bufferImg = ImageIO.read(is); | |||||
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); | |||||
try { | |||||
ImageIO.write(bufferImg, | |||||
imagePath.substring(imagePath.indexOf(".") + 1, imagePath.length()), | |||||
byteArrayOut); | |||||
return byteArrayOut.toByteArray(); | |||||
} finally { | |||||
IOUtils.closeQuietly(is); | |||||
IOUtils.closeQuietly(byteArrayOut); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
public static byte[] getImage(String imagePath) { | |||||
try { | |||||
return loadingCache.get(imagePath); | |||||
} catch (Exception e) { | |||||
return null; | |||||
} | |||||
} | |||||
} |
@@ -38,16 +38,17 @@ import com.google.common.cache.LoadingCache; | |||||
*/ | */ | ||||
public final class POICacheManager { | public final class POICacheManager { | ||||
private static final Logger LOGGER = LoggerFactory.getLogger(POICacheManager.class); | |||||
private static final Logger LOGGER = LoggerFactory | |||||
.getLogger(POICacheManager.class); | |||||
private static LoadingCache<String, byte[]> loadingCache; | private static LoadingCache<String, byte[]> loadingCache; | ||||
private static IFileLoader fileLoder; | |||||
private static IFileLoader fileLoder; | |||||
private static ThreadLocal<IFileLoader> LOCAL_FILELOADER = new ThreadLocal<IFileLoader>(); | |||||
private static ThreadLocal<IFileLoader> LOCAL_FILELOADER = new ThreadLocal<IFileLoader>(); | |||||
static { | static { | ||||
loadingCache = CacheBuilder.newBuilder().expireAfterWrite(7, TimeUnit.DAYS).maximumSize(50) | |||||
loadingCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).maximumSize(50) | |||||
.build(new CacheLoader<String, byte[]>() { | .build(new CacheLoader<String, byte[]>() { | ||||
@Override | @Override | ||||
public byte[] load(String url) throws Exception { | public byte[] load(String url) throws Exception { | ||||
@@ -15,10 +15,6 @@ | |||||
*/ | */ | ||||
package org.jeecgframework.poi.excel.export.base; | package org.jeecgframework.poi.excel.export.base; | ||||
import java.awt.image.BufferedImage; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.text.DecimalFormat; | import java.text.DecimalFormat; | ||||
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
@@ -26,8 +22,6 @@ import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Set; | import java.util.Set; | ||||
import javax.imageio.ImageIO; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.apache.poi.hssf.usermodel.HSSFClientAnchor; | import org.apache.poi.hssf.usermodel.HSSFClientAnchor; | ||||
import org.apache.poi.hssf.usermodel.HSSFRichTextString; | import org.apache.poi.hssf.usermodel.HSSFRichTextString; | ||||
@@ -42,6 +36,7 @@ import org.apache.poi.ss.usermodel.Workbook; | |||||
import org.apache.poi.ss.util.CellRangeAddress; | import org.apache.poi.ss.util.CellRangeAddress; | ||||
import org.apache.poi.xssf.usermodel.XSSFClientAnchor; | import org.apache.poi.xssf.usermodel.XSSFClientAnchor; | ||||
import org.apache.poi.xssf.usermodel.XSSFRichTextString; | import org.apache.poi.xssf.usermodel.XSSFRichTextString; | ||||
import org.jeecgframework.poi.cache.ImageCache; | |||||
import org.jeecgframework.poi.excel.entity.enmus.ExcelType; | import org.jeecgframework.poi.excel.entity.enmus.ExcelType; | ||||
import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | ||||
import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; | import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; | ||||
@@ -170,22 +165,9 @@ public abstract class ExcelExportBase extends ExportBase { | |||||
return; | return; | ||||
} | } | ||||
if (entity.getExportImageType() == 1) { | if (entity.getExportImageType() == 1) { | ||||
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); | |||||
BufferedImage bufferImg; | |||||
try { | |||||
String path = PoiPublicUtil.getWebRootPath(imagePath); | |||||
path = path.replace("WEB-INF/classes/", ""); | |||||
path = path.replace("file:/", ""); | |||||
bufferImg = ImageIO.read(new File(path)); | |||||
ImageIO.write(bufferImg, | |||||
imagePath.substring(imagePath.indexOf(".") + 1, imagePath.length()), | |||||
byteArrayOut); | |||||
byte[] value = byteArrayOut.toByteArray(); | |||||
patriarch.createPicture(anchor, | |||||
row.getSheet().getWorkbook().addPicture(value, getImageType(value))); | |||||
} catch (IOException e) { | |||||
LOGGER.error(e.getMessage(), e); | |||||
} | |||||
byte[] value = ImageCache.getImage(imagePath); | |||||
patriarch.createPicture(anchor, | |||||
row.getSheet().getWorkbook().addPicture(value, getImageType(value))); | |||||
} else { | } else { | ||||
byte[] value = (byte[]) (entity.getMethods() != null | byte[] value = (byte[]) (entity.getMethods() != null | ||||
? getFieldBySomeMethod(entity.getMethods(), obj) | ? getFieldBySomeMethod(entity.getMethods(), obj) | ||||
@@ -173,7 +173,7 @@ public class CellValueServer { | |||||
* @param cell | * @param cell | ||||
* @param titleString | * @param titleString | ||||
*/ | */ | ||||
public Object getValue(IExcelDataHandler dataHanlder, Object object, Cell cell, | |||||
public Object getValue(IExcelDataHandler<?> dataHanlder, Object object, Cell cell, | |||||
Map<String, ExcelImportEntity> excelParams, | Map<String, ExcelImportEntity> excelParams, | ||||
String titleString) throws Exception { | String titleString) throws Exception { | ||||
ExcelImportEntity entity = excelParams.get(titleString); | ExcelImportEntity entity = excelParams.get(titleString); | ||||
@@ -202,7 +202,7 @@ public class CellValueServer { | |||||
* @param titleString | * @param titleString | ||||
* @return | * @return | ||||
*/ | */ | ||||
public Object getValue(IExcelDataHandler dataHanlder, Object object, | |||||
public Object getValue(IExcelDataHandler<?> dataHanlder, Object object, | |||||
SaxReadCellEntity cellEntity, Map<String, ExcelImportEntity> excelParams, | SaxReadCellEntity cellEntity, Map<String, ExcelImportEntity> excelParams, | ||||
String titleString) { | String titleString) { | ||||
ExcelImportEntity entity = excelParams.get(titleString); | ExcelImportEntity entity = excelParams.get(titleString); | ||||
@@ -304,6 +304,7 @@ public class CellValueServer { | |||||
* @param titleString | * @param titleString | ||||
* @return | * @return | ||||
*/ | */ | ||||
@SuppressWarnings({ "unchecked", "rawtypes" }) | |||||
private Object hanlderValue(IExcelDataHandler dataHanlder, Object object, Object result, | private Object hanlderValue(IExcelDataHandler dataHanlder, Object object, Object result, | ||||
String titleString) { | String titleString) { | ||||
if (dataHanlder == null || dataHanlder.getNeedHandlerFields() == null | if (dataHanlder == null || dataHanlder.getNeedHandlerFields() == null | ||||
@@ -0,0 +1,21 @@ | |||||
/** | |||||
* 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. | |||||
*/ | |||||
/** | |||||
* Excel模块,支持2003,2007的导入导出,模板的导出,流的导出(大数据量) | |||||
* @author JueYue | |||||
* @date 2014年6月20日 上午12:08:09 | |||||
*/ | |||||
package org.jeecgframework.poi.excel; |
@@ -63,6 +63,10 @@ public class PdfExportParams extends ExcelBaseParams { | |||||
} | } | ||||
public PdfExportParams(String title) { | |||||
this.title = title; | |||||
} | |||||
public PdfExportParams(String title, String secondTitle) { | public PdfExportParams(String title, String secondTitle) { | ||||
this.title = title; | this.title = title; | ||||
this.secondTitle = secondTitle; | this.secondTitle = secondTitle; | ||||
@@ -15,14 +15,17 @@ | |||||
*/ | */ | ||||
package org.jeecgframework.poi.pdf.export; | package org.jeecgframework.poi.pdf.export; | ||||
import java.io.IOException; | |||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||
import java.net.MalformedURLException; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.Iterator; | 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.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; | ||||
import org.jeecgframework.poi.excel.export.base.ExportBase; | import org.jeecgframework.poi.excel.export.base.ExportBase; | ||||
@@ -33,9 +36,11 @@ import org.jeecgframework.poi.util.PoiPublicUtil; | |||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
import com.itextpdf.text.BadElementException; | |||||
import com.itextpdf.text.Document; | import com.itextpdf.text.Document; | ||||
import com.itextpdf.text.DocumentException; | import com.itextpdf.text.DocumentException; | ||||
import com.itextpdf.text.Element; | import com.itextpdf.text.Element; | ||||
import com.itextpdf.text.Image; | |||||
import com.itextpdf.text.Phrase; | import com.itextpdf.text.Phrase; | ||||
import com.itextpdf.text.pdf.PdfPCell; | import com.itextpdf.text.pdf.PdfPCell; | ||||
import com.itextpdf.text.pdf.PdfPTable; | import com.itextpdf.text.pdf.PdfPTable; | ||||
@@ -144,7 +149,8 @@ public class PdfExportServer extends ExportBase { | |||||
createStringCell(table, value == null ? "" : value.toString(), entity, | createStringCell(table, value == null ? "" : value.toString(), entity, | ||||
rowHeight, 1, maxHeight); | rowHeight, 1, maxHeight); | ||||
} else { | } else { | ||||
createImageCell(table, value == null ? "" : value.toString(), entity, rowHeight, | |||||
1, maxHeight); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -167,7 +173,8 @@ public class PdfExportServer extends ExportBase { | |||||
if (entity.getType() == 1) { | if (entity.getType() == 1) { | ||||
createStringCell(table, value == null ? "" : value.toString(), entity, rowHeight); | createStringCell(table, value == null ? "" : value.toString(), entity, rowHeight); | ||||
} else { | } else { | ||||
createImageCell(table, value == null ? "" : value.toString(), entity, rowHeight, 1, | |||||
1); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -299,4 +306,25 @@ public class PdfExportServer extends ExportBase { | |||||
return iCell; | return iCell; | ||||
} | } | ||||
private PdfPCell createImageCell(PdfPTable table, String text, ExcelExportEntity entity, | |||||
int rowHeight, int rowSpan, int colSpan) { | |||||
try { | |||||
Image image = Image.getInstance(ImageCache.getImage(text)); | |||||
PdfPCell iCell = new PdfPCell(image); | |||||
styler.setCellStyler(iCell, entity, text); | |||||
iCell.setFixedHeight((int) (rowHeight * 2.5)); | |||||
table.addCell(iCell); | |||||
return iCell; | |||||
} catch (BadElementException e) { | |||||
LOGGER.error(e.getMessage(), e); | |||||
} catch (MalformedURLException e) { | |||||
LOGGER.error(e.getMessage(), e); | |||||
} catch (IOException e) { | |||||
LOGGER.error(e.getMessage(), e); | |||||
} | |||||
return new PdfPCell(); | |||||
} | |||||
} | } |
@@ -0,0 +1,21 @@ | |||||
/** | |||||
* 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. | |||||
*/ | |||||
/** | |||||
* Word 模块,因为2003不好用,所以都是基于2007来处理的数据 | |||||
* @author JueYue | |||||
* @date 2014年6月20日 上午12:08:09 | |||||
*/ | |||||
package org.jeecgframework.poi.word; |