From 36c24d13f6e7d900e9e87ee6c946c7155fecf352 Mon Sep 17 00:00:00 2001 From: jueyue Date: Sat, 13 Dec 2014 16:34:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AEsonar=E7=9A=84=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E5=88=86=E6=9E=90,=E5=81=9A=E4=BA=86=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecgframework/poi/cache/ExcelCache.java | 10 +- .../jeecgframework/poi/cache/WordCache.java | 14 +- .../poi/cache/manager/FileLoade.java | 10 +- .../poi/cache/manager/POICacheManager.java | 8 +- .../poi/excel/ExcelImportUtil.java | 12 +- .../template/ExcelExportOfTemplateUtil.java | 8 +- .../poi/excel/imports/ExcelImportServer.java | 22 +-- .../poi/util/POIPublicUtil.java | 134 ++++++++++++++- .../poi/word/WordExportUtil.java | 4 + .../poi/word/entity/JeecgXWPFDocument.java | 162 ------------------ .../poi/word/entity/MyXWPFDocument.java | 120 +++++++++++++ .../poi/word/parse/ParseWord07.java | 26 +-- .../poi/word/parse/excel/ExcelMapParse.java | 6 +- .../poi/word/util/ParseWordUtil.java | 146 ---------------- .../poi/word/WordExportUtilAnnExcelTest.java | 2 +- .../poi/word/WordExportUtilBaseExcelTest.java | 2 +- 16 files changed, 329 insertions(+), 357 deletions(-) delete mode 100644 easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/JeecgXWPFDocument.java create mode 100644 easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/MyXWPFDocument.java delete mode 100644 easypoi-base/src/main/java/org/jeecgframework/poi/word/util/ParseWordUtil.java diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/ExcelCache.java b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/ExcelCache.java index e53554e..b97bcd0 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/ExcelCache.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/ExcelCache.java @@ -7,6 +7,8 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.jeecgframework.poi.cache.manager.POICacheManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Excel类型的缓存 @@ -17,6 +19,8 @@ import org.jeecgframework.poi.cache.manager.POICacheManager; */ public final class ExcelCache { + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelCache.class); + public static Workbook getWorkbook(String url, int index) { InputStream is = null; try { @@ -30,14 +34,14 @@ public final class ExcelCache { } return wb; } catch (InvalidFormatException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } finally { try { is.close(); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } } return null; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/WordCache.java b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/WordCache.java index 7fcf72d..deb15db 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/WordCache.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/WordCache.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.io.InputStream; import org.jeecgframework.poi.cache.manager.POICacheManager; -import org.jeecgframework.poi.word.entity.JeecgXWPFDocument; +import org.jeecgframework.poi.word.entity.MyXWPFDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * word 缓存中心 @@ -14,19 +16,21 @@ import org.jeecgframework.poi.word.entity.JeecgXWPFDocument; */ public class WordCache { - public static JeecgXWPFDocument getXWPFDocumen(String url) { + private static final Logger LOGGER = LoggerFactory.getLogger(WordCache.class); + + public static MyXWPFDocument getXWPFDocumen(String url) { InputStream is = null; try { is = POICacheManager.getFile(url); - JeecgXWPFDocument doc = new JeecgXWPFDocument(is); + MyXWPFDocument doc = new MyXWPFDocument(is); return doc; } catch (Exception e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } finally { try { is.close(); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } } return null; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/FileLoade.java b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/FileLoade.java index 6392512..9d0c463 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/FileLoade.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/FileLoade.java @@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory; */ class FileLoade { - private static final Logger logger = LoggerFactory.getLogger(FileLoade.class); + private static final Logger LOGGER = LoggerFactory.getLogger(FileLoade.class); public byte[] getFile(String url) { FileInputStream fileis = null; @@ -34,9 +34,9 @@ class FileLoade { baos.flush(); return baos.toByteArray(); } catch (FileNotFoundException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } finally { try { if (fileis != null) @@ -44,10 +44,10 @@ class FileLoade { if (fileis != null) baos.close(); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } } - logger.error(fileis + "这个路径文件没有找到,请查询"); + LOGGER.error(fileis + "这个路径文件没有找到,请查询"); return null; } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/POICacheManager.java b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/POICacheManager.java index 18b5fdb..007de41 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/POICacheManager.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/cache/manager/POICacheManager.java @@ -6,6 +6,9 @@ import java.util.Arrays; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -19,6 +22,9 @@ import com.google.common.cache.LoadingCache; */ public final class POICacheManager { + private static final Logger LOGGER = LoggerFactory + .getLogger(POICacheManager.class); + private static LoadingCache loadingCache; static { @@ -37,7 +43,7 @@ public final class POICacheManager { byte[] result = Arrays.copyOf(loadingCache.get(id), loadingCache.get(id).length); return new ByteArrayInputStream(result); } catch (ExecutionException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } return null; } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java index 8702c82..6668d2e 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelImportUtil.java @@ -9,6 +9,8 @@ import java.util.List; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.entity.result.ExcelImportResult; import org.jeecgframework.poi.excel.imports.ExcelImportServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Excel 导入工具 @@ -20,6 +22,8 @@ import org.jeecgframework.poi.excel.imports.ExcelImportServer; @SuppressWarnings({ "unchecked" }) public class ExcelImportUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelImportUtil.class); + /** * Excel 导入 数据源本地文件,不返回校验结果 导入 字 段类型 Integer,Long,Double,Date,String,Boolean * @@ -36,12 +40,12 @@ public class ExcelImportUtil { in = new FileInputStream(file); result = new ExcelImportServer().importExcelByIs(in, pojoClass, params).getList(); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(),e.fillInStackTrace()); } finally { try { in.close(); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(),e.fillInStackTrace()); } } return result; @@ -92,12 +96,12 @@ public class ExcelImportUtil { in = new FileInputStream(file); return new ExcelImportServer().importExcelByIs(in, pojoClass, params); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(),e.fillInStackTrace()); } finally { try { in.close(); } catch (IOException e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(),e.fillInStackTrace()); } } return null; 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 2d685ce..7bcd352 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 @@ -23,6 +23,8 @@ import org.jeecgframework.poi.excel.export.base.ExcelExportBase; import org.jeecgframework.poi.exception.excel.ExcelExportException; import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; import org.jeecgframework.poi.util.POIPublicUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Excel 导出根据模板导出 @@ -32,6 +34,8 @@ import org.jeecgframework.poi.util.POIPublicUtil; * @version 1.0 */ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExportOfTemplateUtil.class); /** * 往Sheet 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射 @@ -48,7 +52,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { Map titlemap = getTitleMap(params, sheet); Drawing patriarch = sheet.createDrawingPatriarch(); // 得到所有字段 - Field fileds[] = POIPublicUtil.getClassFields(pojoClass); + Field[] fileds = POIPublicUtil.getClassFields(pojoClass); ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); String targetId = null; if (etarget != null) { @@ -94,7 +98,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { addDataToSheet(params, pojoClass, dataSet, wb.getSheetAt(0), wb); } } catch (Exception e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); return null; } return wb; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java index 6ee67fc..2a65ec4 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/imports/ExcelImportServer.java @@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory; @SuppressWarnings({ "rawtypes", "unchecked", "hiding" }) public class ExcelImportServer { - private final static Logger logger = LoggerFactory.getLogger(ExcelImportServer.class); + private final static Logger LOGGER = LoggerFactory.getLogger(ExcelImportServer.class); private CellValueServer cellValueServer; @@ -62,8 +62,8 @@ public class ExcelImportServer { private boolean verfiyFail = false; public ExcelImportServer() { - cellValueServer = new CellValueServer(); - verifyHandlerServer = new VerifyHandlerServer(); + this.cellValueServer = new CellValueServer(); + this.verifyHandlerServer = new VerifyHandlerServer(); } /** @@ -412,8 +412,8 @@ public class ExcelImportServer { */ public ExcelImportResult importExcelByIs(InputStream inputstream, Class pojoClass, ImportParams params) throws Exception { - if (logger.isDebugEnabled()) { - logger.debug("Excel import start ,class is {}", pojoClass); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Excel import start ,class is {}", pojoClass); } List result = new ArrayList(); Workbook book = null; @@ -429,8 +429,8 @@ public class ExcelImportServer { } Map pictures; for (int i = 0; i < params.getSheetNum(); i++) { - if (logger.isDebugEnabled()) { - logger.debug(" start to read excel by is ,startTime is {}", new Date().getTime()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(" start to read excel by is ,startTime is {}", new Date().getTime()); } if (isXSSFWorkbook) { pictures = POIPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(i), @@ -439,12 +439,12 @@ public class ExcelImportServer { pictures = POIPublicUtil.getSheetPictrues03((HSSFSheet) book.getSheetAt(i), (HSSFWorkbook) book); } - if (logger.isDebugEnabled()) { - logger.debug(" end to read excel by is ,endTime is {}", new Date().getTime()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(" end to read excel by is ,endTime is {}", new Date().getTime()); } result.addAll(importExcel(result, book.getSheetAt(i), pojoClass, params, pictures)); - if (logger.isDebugEnabled()) { - logger.debug(" end to read excel list by pos ,endTime is {}", new Date().getTime()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(" end to read excel list by pos ,endTime is {}", new Date().getTime()); } } if (params.isNeedSave()) { diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java index 706f56e..28e0dd3 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/util/POIPublicUtil.java @@ -1,5 +1,8 @@ package org.jeecgframework.poi.util; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; @@ -8,6 +11,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.imageio.ImageIO; + import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFPicture; @@ -22,15 +27,22 @@ import org.apache.poi.xssf.usermodel.XSSFPicture; import org.apache.poi.xssf.usermodel.XSSFShape; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.jeecgframework.poi.excel.annotation.Excel; import org.jeecgframework.poi.excel.annotation.ExcelCollection; import org.jeecgframework.poi.excel.annotation.ExcelEntity; import org.jeecgframework.poi.excel.annotation.ExcelIgnore; import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; +import org.jeecgframework.poi.word.entity.WordImageEntity; +import org.jeecgframework.poi.word.entity.params.ExcelListEntity; import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; public class POIPublicUtil { + private POIPublicUtil() { + + } + /** * 彻底创建一个对象 * @@ -58,7 +70,6 @@ public class POIPublicUtil { } } catch (Exception e) { - e.printStackTrace(); throw new RuntimeException("创建对象异常"); } return obj; @@ -286,4 +297,125 @@ public class POIPublicUtil { || exportName.indexOf(targetId) != -1; } + private static Integer getImageType(String type) { + if (type.equalsIgnoreCase("JPG") || type.equalsIgnoreCase("JPEG")) { + return XWPFDocument.PICTURE_TYPE_JPEG; + } + if (type.equalsIgnoreCase("GIF")) { + return XWPFDocument.PICTURE_TYPE_GIF; + } + if (type.equalsIgnoreCase("BMP")) { + return XWPFDocument.PICTURE_TYPE_GIF; + } + if (type.equalsIgnoreCase("PNG")) { + return XWPFDocument.PICTURE_TYPE_PNG; + } + return XWPFDocument.PICTURE_TYPE_JPEG; + } + + /** + * 返回流和图片类型 + *@Author JueYue + *@date 2013-11-20 + *@param obj + *@return (byte[]) isAndType[0],(Integer)isAndType[1] + * @throws Exception + */ + public static Object[] getIsAndType(WordImageEntity entity) throws Exception { + Object[] result = new Object[2]; + String type; + if (entity.getType().equals(WordImageEntity.URL)) { + ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); + BufferedImage bufferImg; + String path = Thread.currentThread().getContextClassLoader().getResource("").toURI() + .getPath() + + entity.getUrl(); + path = path.replace("WEB-INF/classes/", ""); + path = path.replace("file:/", ""); + bufferImg = ImageIO.read(new File(path)); + ImageIO.write( + bufferImg, + entity.getUrl().substring(entity.getUrl().indexOf(".") + 1, + entity.getUrl().length()), byteArrayOut); + result[0] = byteArrayOut.toByteArray(); + type = entity.getUrl().split("/.")[entity.getUrl().split("/.").length - 1]; + } else { + result[0] = entity.getData(); + type = POIPublicUtil.getFileExtendName(entity.getData()); + } + result[1] = getImageType(type); + return result; + } + + /** + * 获取参数值 + * + * @param params + * @param map + * @return + */ + private static Object getParamsValue(String params, Map map) throws Exception { + if (params.indexOf(".") != -1) { + String[] paramsArr = params.split("\\."); + return getValueDoWhile(map.get(paramsArr[0]), paramsArr, 1); + } + return map.containsKey(params) ? map.get(params) : ""; + } + + /** + * 解析数据 + * + * @Author JueYue + * @date 2013-11-16 + * @return + */ + public static Object getRealValue(String currentText, Map map) throws Exception { + String params = ""; + while (currentText.indexOf("{{") != -1) { + params = currentText + .substring(currentText.indexOf("{{") + 2, currentText.indexOf("}}")); + Object obj = getParamsValue(params.trim(), map); + //判断图片或者是集合 + + if (obj instanceof WordImageEntity || obj instanceof List + || obj instanceof ExcelListEntity) { + return obj; + } else { + currentText = currentText.replace("{{" + params + "}}", obj.toString()); + } + } + return currentText; + } + + /** + * 通过遍历过去对象值 + * + * @param object + * @param paramsArr + * @param index + * @return + * @throws Exception + * @throws InvocationTargetException + * @throws IllegalAccessException + * @throws IllegalArgumentException + */ + @SuppressWarnings("rawtypes") + public static Object getValueDoWhile(Object object, String[] paramsArr, int index) + throws Exception { + if (object == null) { + return ""; + } + if (object instanceof WordImageEntity) { + return object; + } + if (object instanceof Map) { + object = ((Map) object).get(paramsArr[index]); + } else { + object = POIPublicUtil.getMethod(paramsArr[index], object.getClass()).invoke(object, + new Object[] {}); + } + return (index == paramsArr.length - 1) ? (object == null ? "" : object) : getValueDoWhile( + object, paramsArr, ++index); + } + } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/WordExportUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/WordExportUtil.java index c7fea08..e9ee0aa 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/word/WordExportUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/word/WordExportUtil.java @@ -13,6 +13,10 @@ import org.jeecgframework.poi.word.parse.ParseWord07; * @version 1.0 */ public class WordExportUtil { + + private WordExportUtil(){ + + } /** * 解析Word2007版本 diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/JeecgXWPFDocument.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/JeecgXWPFDocument.java deleted file mode 100644 index d102062..0000000 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/JeecgXWPFDocument.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.jeecgframework.poi.word.entity; - -import java.io.InputStream; - -import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlToken; -import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; -import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; -import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; - -/** - * 扩充document,修复图片插入失败问题问题 - * - * @author JueYue - * @date 2013-11-20 - * @version 1.0 - */ -public class JeecgXWPFDocument extends XWPFDocument { - - public JeecgXWPFDocument() { - super(); - } - - public JeecgXWPFDocument(InputStream in) throws Exception { - super(in); - } - - public JeecgXWPFDocument(OPCPackage opcPackage) throws Exception { - super(opcPackage); - } - - public void createPicture(String blipId, int id, int width, int height) { - final int EMU = 9525; - width *= EMU; - height *= EMU; - //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); - CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); - - String picXml = "" - + "" - + " " - + " " - + " " + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " + ""; - - //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); - XmlToken xmlToken = null; - try { - xmlToken = XmlToken.Factory.parse(picXml); - } catch (XmlException xe) { - xe.printStackTrace(); - } - inline.set(xmlToken); - //graphicData.set(xmlToken); - - inline.setDistT(0); - inline.setDistB(0); - inline.setDistL(0); - inline.setDistR(0); - - CTPositiveSize2D extent = inline.addNewExtent(); - extent.setCx(width); - extent.setCy(height); - - CTNonVisualDrawingProps docPr = inline.addNewDocPr(); - docPr.setId(id); - docPr.setName("Picture " + id); - docPr.setDescr("Generated"); - } - - public void createPicture(XWPFRun run, String blipId, int id, int width, int height) { - final int EMU = 9525; - width *= EMU; - height *= EMU; - CTInline inline = run.getCTR().addNewDrawing().addNewInline(); - - String picXml = "" - + "" - + " " - + " " - + " " + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " + ""; - - XmlToken xmlToken = null; - try { - xmlToken = XmlToken.Factory.parse(picXml); - } catch (XmlException xe) { - xe.printStackTrace(); - } - inline.set(xmlToken); - - inline.setDistT(0); - inline.setDistB(0); - inline.setDistL(0); - inline.setDistR(0); - - CTPositiveSize2D extent = inline.addNewExtent(); - extent.setCx(width); - extent.setCy(height); - - CTNonVisualDrawingProps docPr = inline.addNewDocPr(); - docPr.setId(id); - docPr.setName("Picture " + id); - docPr.setDescr("Generated"); - } - -} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/MyXWPFDocument.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/MyXWPFDocument.java new file mode 100644 index 0000000..894af4e --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/word/entity/MyXWPFDocument.java @@ -0,0 +1,120 @@ +package org.jeecgframework.poi.word.entity; + +import java.io.InputStream; + +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlToken; +import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; +import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; +import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 扩充document,修复图片插入失败问题问题 + * + * @author JueYue + * @date 2013-11-20 + * @version 1.0 + */ +public class MyXWPFDocument extends XWPFDocument { + + private static final Logger LOGGER = LoggerFactory.getLogger(MyXWPFDocument.class); + + private static String PICXML = "" + + "" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + " " + + " " + " " + + " " + + " " + + " " + + " " + + " " + + " " + " " + + " " + " " + + ""; + + public MyXWPFDocument() { + super(); + } + + public MyXWPFDocument(InputStream in) throws Exception { + super(in); + } + + public MyXWPFDocument(OPCPackage opcPackage) throws Exception { + super(opcPackage); + } + + public void createPicture(String blipId, int id, int width, int height) { + final int EMU = 9525; + width *= EMU; + height *= EMU; + CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); + String picXml = String.format(PICXML, id, blipId, width, height); + XmlToken xmlToken = null; + try { + xmlToken = XmlToken.Factory.parse(picXml); + } catch (XmlException xe) { + LOGGER.error(xe.getMessage(), xe.fillInStackTrace()); + } + inline.set(xmlToken); + + inline.setDistT(0); + inline.setDistB(0); + inline.setDistL(0); + inline.setDistR(0); + + CTPositiveSize2D extent = inline.addNewExtent(); + extent.setCx(width); + extent.setCy(height); + + CTNonVisualDrawingProps docPr = inline.addNewDocPr(); + docPr.setId(id); + docPr.setName("Picture " + id); + docPr.setDescr("Generated"); + } + + public void createPicture(XWPFRun run, String blipId, int id, int width, int height) { + final int EMU = 9525; + width *= EMU; + height *= EMU; + CTInline inline = run.getCTR().addNewDrawing().addNewInline(); + String picXml = String.format(PICXML, id, blipId, width, height); + XmlToken xmlToken = null; + try { + xmlToken = XmlToken.Factory.parse(picXml); + } catch (XmlException xe) { + LOGGER.error(xe.getMessage(), xe.fillInStackTrace()); + } + inline.set(xmlToken); + + inline.setDistT(0); + inline.setDistB(0); + inline.setDistL(0); + inline.setDistR(0); + + CTPositiveSize2D extent = inline.addNewExtent(); + extent.setCx(width); + extent.setCy(height); + + CTNonVisualDrawingProps docPr = inline.addNewDocPr(); + docPr.setId(id); + docPr.setName("Picture " + id); + docPr.setDescr("Generated"); + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/ParseWord07.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/ParseWord07.java index 792edd6..0b2f97a 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/ParseWord07.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/ParseWord07.java @@ -12,12 +12,14 @@ import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.jeecgframework.poi.cache.WordCache; -import org.jeecgframework.poi.word.entity.JeecgXWPFDocument; +import org.jeecgframework.poi.util.POIPublicUtil; +import org.jeecgframework.poi.word.entity.MyXWPFDocument; import org.jeecgframework.poi.word.entity.WordImageEntity; import org.jeecgframework.poi.word.entity.params.ExcelListEntity; import org.jeecgframework.poi.word.parse.excel.ExcelEntityParse; import org.jeecgframework.poi.word.parse.excel.ExcelMapParse; -import org.jeecgframework.poi.word.util.ParseWordUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 解析07版的Word,替换文字,生成表格,生成图片 @@ -29,6 +31,8 @@ import org.jeecgframework.poi.word.util.ParseWordUtil; @SuppressWarnings({ "unchecked", "rawtypes" }) public class ParseWord07 { + private static final Logger LOGGER = LoggerFactory.getLogger(ParseWord07.class); + /** * 添加图片 * @@ -39,18 +43,18 @@ public class ParseWord07 { * @throws Exception */ private void addAnImage(WordImageEntity obj, XWPFRun currentRun) throws Exception { - Object[] isAndType = ParseWordUtil.getIsAndType(obj); + Object[] isAndType = POIPublicUtil.getIsAndType(obj); String picId; try { picId = currentRun.getParagraph().getDocument() .addPictureData((byte[]) isAndType[0], (Integer) isAndType[1]); - ((JeecgXWPFDocument) currentRun.getParagraph().getDocument()).createPicture(currentRun, + ((MyXWPFDocument) currentRun.getParagraph().getDocument()).createPicture(currentRun, picId, currentRun.getParagraph().getDocument() .getNextPicNameNumber((Integer) isAndType[1]), obj.getWidth(), obj.getHeight()); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error(e.getMessage(), e.fillInStackTrace()); } } @@ -64,7 +68,7 @@ public class ParseWord07 { */ private void changeValues(XWPFParagraph paragraph, XWPFRun currentRun, String currentText, List runIndex, Map map) throws Exception { - Object obj = ParseWordUtil.getRealValue(currentText, map); + Object obj = POIPublicUtil.getRealValue(currentText, map); if (obj instanceof WordImageEntity) {// 如果是图片就设置为图片 currentRun.setText("", 0); addAnImage((WordImageEntity) obj, currentRun); @@ -91,9 +95,7 @@ public class ParseWord07 { String text = cell.getText().trim(); // 判断是不是迭代输出 if (text.startsWith("{{") && text.endsWith("}}") && text.indexOf("in ") != -1) { - /*text = text.replace("{{", "").replace("}}", "") - .replaceAll("\\s{1,}", " ").trim();*/ - return ParseWordUtil.getRealValue(text.replace("in ", "").trim(), map); + return POIPublicUtil.getRealValue(text.replace("in ", "").trim(), map); } return null; } @@ -217,7 +219,7 @@ public class ParseWord07 { * @throws Exception */ public XWPFDocument parseWord(String url, Map map) throws Exception { - JeecgXWPFDocument doc = WordCache.getXWPFDocumen(url); + MyXWPFDocument doc = WordCache.getXWPFDocumen(url); parseWordSetValue(doc, map); return doc; } @@ -231,10 +233,10 @@ public class ParseWord07 { * @throws Exception */ public void parseWord(XWPFDocument document, Map map) throws Exception { - parseWordSetValue((JeecgXWPFDocument) document, map); + parseWordSetValue((MyXWPFDocument) document, map); } - private void parseWordSetValue(JeecgXWPFDocument doc, Map map) throws Exception { + private void parseWordSetValue(MyXWPFDocument doc, Map map) throws Exception { // 第一步解析文档 parseAllParagraphic(doc.getParagraphs(), map); // 第二步解析所有表格 diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/excel/ExcelMapParse.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/excel/ExcelMapParse.java index 5594386..34347db 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/excel/ExcelMapParse.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/word/parse/excel/ExcelMapParse.java @@ -5,7 +5,7 @@ import java.util.List; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; -import org.jeecgframework.poi.word.util.ParseWordUtil; +import org.jeecgframework.poi.util.POIPublicUtil; /** * 处理和生成Map 类型的数据变成表格 @@ -54,12 +54,12 @@ public final class ExcelMapParse { .getTableCells() .get(cellIndex) .setText( - ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) + POIPublicUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) .toString()); } for (; cellIndex < params.length; cellIndex++) { currentRow.createCell().setText( - ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) + POIPublicUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) .toString()); } } diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/word/util/ParseWordUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/word/util/ParseWordUtil.java deleted file mode 100644 index 55ae9ee..0000000 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/word/util/ParseWordUtil.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.jeecgframework.poi.word.util; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.util.List; -import java.util.Map; - -import javax.imageio.ImageIO; - -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.jeecgframework.poi.util.POIPublicUtil; -import org.jeecgframework.poi.word.entity.WordImageEntity; -import org.jeecgframework.poi.word.entity.params.ExcelListEntity; - -/** - * 解析公告类 - * Excel 实体注解,暂时不支持图片 - * @author JueYue - * @date 2014-7-24 - * @version 1.1 - */ -public class ParseWordUtil { - - private static Integer getImageType(String type) { - if (type.equalsIgnoreCase("JPG") || type.equalsIgnoreCase("JPEG")) { - return XWPFDocument.PICTURE_TYPE_JPEG; - } - if (type.equalsIgnoreCase("GIF")) { - return XWPFDocument.PICTURE_TYPE_GIF; - } - if (type.equalsIgnoreCase("BMP")) { - return XWPFDocument.PICTURE_TYPE_GIF; - } - if (type.equalsIgnoreCase("PNG")) { - return XWPFDocument.PICTURE_TYPE_PNG; - } - return XWPFDocument.PICTURE_TYPE_JPEG; - } - - /** - * 返回流和图片类型 - *@Author JueYue - *@date 2013-11-20 - *@param obj - *@return (byte[]) isAndType[0],(Integer)isAndType[1] - * @throws Exception - */ - public static Object[] getIsAndType(WordImageEntity entity) throws Exception { - Object[] result = new Object[2]; - String type; - if (entity.getType().equals(WordImageEntity.URL)) { - ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); - BufferedImage bufferImg; - String path = Thread.currentThread().getContextClassLoader().getResource("").toURI() - .getPath() - + entity.getUrl(); - path = path.replace("WEB-INF/classes/", ""); - path = path.replace("file:/", ""); - bufferImg = ImageIO.read(new File(path)); - ImageIO.write( - bufferImg, - entity.getUrl().substring(entity.getUrl().indexOf(".") + 1, - entity.getUrl().length()), byteArrayOut); - result[0] = byteArrayOut.toByteArray(); - type = entity.getUrl().split("/.")[entity.getUrl().split("/.").length - 1]; - } else { - result[0] = entity.getData(); - type = POIPublicUtil.getFileExtendName(entity.getData()); - } - result[1] = getImageType(type); - return result; - } - - /** - * 获取参数值 - * - * @param params - * @param map - * @return - */ - private static Object getParamsValue(String params, Map map) throws Exception { - if (params.indexOf(".") != -1) { - String[] paramsArr = params.split("\\."); - return getValueDoWhile(map.get(paramsArr[0]), paramsArr, 1); - } - return map.containsKey(params) ? map.get(params) : ""; - } - - /** - * 解析数据 - * - * @Author JueYue - * @date 2013-11-16 - * @return - */ - public static Object getRealValue(String currentText, Map map) throws Exception { - String params = ""; - while (currentText.indexOf("{{") != -1) { - params = currentText - .substring(currentText.indexOf("{{") + 2, currentText.indexOf("}}")); - Object obj = getParamsValue(params.trim(), map); - //判断图片或者是集合 - if (obj instanceof WordImageEntity || obj instanceof List - || obj instanceof ExcelListEntity) { - return obj; - } else { - currentText = currentText.replace("{{" + params + "}}", obj.toString()); - } - } - return currentText; - } - - /** - * 通过遍历过去对象值 - * - * @param object - * @param paramsArr - * @param index - * @return - * @throws Exception - * @throws InvocationTargetException - * @throws IllegalAccessException - * @throws IllegalArgumentException - */ - @SuppressWarnings("rawtypes") - public static Object getValueDoWhile(Object object, String[] paramsArr, int index) - throws Exception { - if (object == null) { - return ""; - } - if (object instanceof WordImageEntity) { - return object; - } - if (object instanceof Map) { - object = ((Map) object).get(paramsArr[index]); - } else { - object = POIPublicUtil.getMethod(paramsArr[index], object.getClass()).invoke(object, - new Object[] {}); - } - return (index == paramsArr.length - 1) ? (object == null ? "" : object) : getValueDoWhile( - object, paramsArr, ++index); - } - -} diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilAnnExcelTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilAnnExcelTest.java index acdfaa5..577d371 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilAnnExcelTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilAnnExcelTest.java @@ -33,7 +33,7 @@ public class WordExportUtilAnnExcelTest { /** * 简单导出没有图片和Excel */ - //@Test + @Test public void SimpleWordExport() { Map map = new HashMap(); map.put("department", "Jeecg"); diff --git a/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilBaseExcelTest.java b/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilBaseExcelTest.java index 728ad42..e915a5c 100644 --- a/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilBaseExcelTest.java +++ b/easypoi-test/src/main/java/org/jeecgframework/poi/word/WordExportUtilBaseExcelTest.java @@ -20,7 +20,7 @@ public class WordExportUtilBaseExcelTest { /** * 简单导出包含图片 */ - //@Test + @Test public void imageWordExport() { Map map = new HashMap(); map.put("department", "Jeecg");