@@ -0,0 +1,35 @@ | |||
package org.jeecgframework.poi.cache; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import org.jeecgframework.poi.cache.manager.POICacheManager; | |||
import org.jeecgframework.poi.word.entity.JeecgXWPFDocument; | |||
/** | |||
* word 缓存中心 | |||
* | |||
* @author JueYue | |||
* @date 2014年7月24日 下午10:54:31 | |||
*/ | |||
public class WordCache { | |||
public static JeecgXWPFDocument getXWPFDocumen(String url) { | |||
InputStream is = null; | |||
try { | |||
is = POICacheManager.getFile(url); | |||
JeecgXWPFDocument doc = new JeecgXWPFDocument(is); | |||
return doc; | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
} finally { | |||
try { | |||
is.close(); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
return null; | |||
} | |||
} |
@@ -5,7 +5,7 @@ import java.io.FileInputStream; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import org.jeecgframework.poi.util.ExcelPublicUtil; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -23,7 +23,7 @@ class FileLoade { | |||
FileInputStream fileis = null; | |||
ByteArrayOutputStream baos = null; | |||
try { | |||
String path = ExcelPublicUtil.getWebRootPath(url); | |||
String path = POIPublicUtil.getWebRootPath(url); | |||
fileis = new FileInputStream(path); | |||
baos = new ByteArrayOutputStream(); | |||
byte[] buffer = new byte[1024]; | |||
@@ -40,7 +40,7 @@ import org.jeecgframework.poi.excel.entity.params.ComparatorExcelField; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
import org.jeecgframework.poi.excel.entity.params.MergeEntity; | |||
import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | |||
import org.jeecgframework.poi.util.ExcelPublicUtil; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
/** | |||
* 导出基础服务 | |||
@@ -73,11 +73,11 @@ public abstract class ExcelExportBase { | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
// 先判断是不是collection,在判断是不是java自带对象,之后就是我们自己的对象了 | |||
if (ExcelPublicUtil.isNotUserExcelUserThis(exclusionsList, field, | |||
if (POIPublicUtil.isNotUserExcelUserThis(exclusionsList, field, | |||
targetId)) { | |||
continue; | |||
} | |||
if (ExcelPublicUtil.isCollection(field.getType())) { | |||
if (POIPublicUtil.isCollection(field.getType())) { | |||
ExcelCollection excel = field | |||
.getAnnotation(ExcelCollection.class); | |||
ParameterizedType pt = (ParameterizedType) field | |||
@@ -87,16 +87,16 @@ public abstract class ExcelExportBase { | |||
getAllExcelField(exclusions, | |||
StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
: targetId, | |||
ExcelPublicUtil.getClassFields(clz), list, clz, null); | |||
POIPublicUtil.getClassFields(clz), list, clz, null); | |||
excelEntity = new ExcelExportEntity(); | |||
excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
excelEntity | |||
.setOrderNum(getCellOrder(excel.orderNum(), targetId)); | |||
excelEntity.setMethod(ExcelPublicUtil.getMethod( | |||
excelEntity.setMethod(POIPublicUtil.getMethod( | |||
field.getName(), pojoClass)); | |||
excelEntity.setList(list); | |||
excelParams.add(excelEntity); | |||
} else if (ExcelPublicUtil.isJavaClass(field)) { | |||
} else if (POIPublicUtil.isJavaClass(field)) { | |||
excelParams.add(createExcelExportEntity(field, targetId, | |||
pojoClass, getMethods)); | |||
} else { | |||
@@ -104,13 +104,13 @@ public abstract class ExcelExportBase { | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods.add(ExcelPublicUtil.getMethod(field.getName(), | |||
newMethods.add(POIPublicUtil.getMethod(field.getName(), | |||
pojoClass)); | |||
ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | |||
getAllExcelField(exclusions, | |||
StringUtils.isNotEmpty(excel.id()) ? excel.id() | |||
: targetId, | |||
ExcelPublicUtil.getClassFields(field.getType()), | |||
POIPublicUtil.getClassFields(field.getType()), | |||
excelParams, field.getType(), newMethods); | |||
} | |||
} | |||
@@ -224,7 +224,7 @@ public abstract class ExcelExportBase { | |||
.setFormat(StringUtils.isNotEmpty(excel.exportFormat()) ? excel | |||
.exportFormat() : excel.format()); | |||
String fieldname = field.getName(); | |||
excelEntity.setMethod(ExcelPublicUtil.getMethod(fieldname, pojoClass)); | |||
excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass)); | |||
} | |||
/** | |||
@@ -650,7 +650,7 @@ public abstract class ExcelExportBase { | |||
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); | |||
BufferedImage bufferImg; | |||
try { | |||
String path = ExcelPublicUtil.getWebRootPath(string); | |||
String path = POIPublicUtil.getWebRootPath(string); | |||
path = path.replace("WEB-INF/classes/", ""); | |||
path = path.replace("file:/", ""); | |||
bufferImg = ImageIO.read(new File(path)); | |||
@@ -685,7 +685,7 @@ public abstract class ExcelExportBase { | |||
* @date 2013年11月25日 | |||
*/ | |||
public int getImageType(byte[] value) { | |||
String type = ExcelPublicUtil.getFileExtendName(value); | |||
String type = POIPublicUtil.getFileExtendName(value); | |||
if (type.equalsIgnoreCase("JPG")) { | |||
return HSSFWorkbook.PICTURE_TYPE_JPEG; | |||
} else if (type.equalsIgnoreCase("PNG")) { | |||
@@ -24,7 +24,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; | |||
import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
import org.jeecgframework.poi.exception.excel.ExcelExportException; | |||
import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; | |||
import org.jeecgframework.poi.util.ExcelPublicUtil; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -71,7 +71,7 @@ public class ExcelExportServer extends ExcelExportBase { | |||
Drawing patriarch = sheet.createDrawingPatriarch(); | |||
List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||
// 得到所有字段 | |||
Field fileds[] = ExcelPublicUtil.getClassFields(pojoClass); | |||
Field fileds[] = POIPublicUtil.getClassFields(pojoClass); | |||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
String targetId = etarget == null ? null : etarget.value(); | |||
getAllExcelField(entity.getExclusions(), targetId, fileds, | |||
@@ -22,7 +22,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | |||
import org.jeecgframework.poi.excel.export.ExcelExportBase; | |||
import org.jeecgframework.poi.exception.excel.ExcelExportException; | |||
import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; | |||
import org.jeecgframework.poi.util.ExcelPublicUtil; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
/** | |||
* Excel 导出根据模板导出 | |||
@@ -101,7 +101,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { | |||
Map<String, Integer> titlemap = getTitleMap(params, sheet); | |||
Drawing patriarch = sheet.createDrawingPatriarch(); | |||
// 得到所有字段 | |||
Field fileds[] = ExcelPublicUtil.getClassFields(pojoClass); | |||
Field fileds[] = POIPublicUtil.getClassFields(pojoClass); | |||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
String targetId = null; | |||
if (etarget != null) { | |||
@@ -258,7 +258,7 @@ public final class ExcelExportOfTemplateUtil extends ExcelExportBase { | |||
if (object instanceof Map) { | |||
object = ((Map) object).get(paramsArr[index]); | |||
} else { | |||
object = ExcelPublicUtil.getMethod(paramsArr[index], | |||
object = POIPublicUtil.getMethod(paramsArr[index], | |||
object.getClass()).invoke(object, new Object[] {}); | |||
} | |||
return (index == paramsArr.length - 1) ? (object == null ? "" : object | |||
@@ -40,7 +40,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity; | |||
import org.jeecgframework.poi.excel.entity.result.ExcelImportResult; | |||
import org.jeecgframework.poi.excel.entity.result.ExcelVerifyHanlderResult; | |||
import org.jeecgframework.poi.excel.imports.verifys.VerifyHandlerServer; | |||
import org.jeecgframework.poi.util.ExcelPublicUtil; | |||
import org.jeecgframework.poi.util.POIPublicUtil; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -95,10 +95,10 @@ public class ExcelImportServer { | |||
Map<String, PictureData> pictures; | |||
for (int i = 0; i < params.getSheetNum(); i++) { | |||
if (isXSSFWorkbook) { | |||
pictures = ExcelPublicUtil.getSheetPictrues07( | |||
pictures = POIPublicUtil.getSheetPictrues07( | |||
(XSSFSheet) book.getSheetAt(i), (XSSFWorkbook) book); | |||
} else { | |||
pictures = ExcelPublicUtil.getSheetPictrues03( | |||
pictures = POIPublicUtil.getSheetPictrues03( | |||
(HSSFSheet) book.getSheetAt(i), (HSSFWorkbook) book); | |||
} | |||
result.addAll(importExcel(result, book.getSheetAt(i), pojoClass, | |||
@@ -112,7 +112,7 @@ public class ExcelImportServer { | |||
private void saveThisExcel(ImportParams params, Class<?> pojoClass, | |||
boolean isXSSFWorkbook, Workbook book) throws Exception { | |||
String path = ExcelPublicUtil.getWebRootPath(getSaveExcelUrl(params, | |||
String path = POIPublicUtil.getWebRootPath(getSaveExcelUrl(params, | |||
pojoClass)); | |||
File savefile = new File(path); | |||
if (!savefile.exists()) { | |||
@@ -153,7 +153,7 @@ public class ExcelImportServer { | |||
List collection = new ArrayList(); | |||
Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
Field fileds[] = ExcelPublicUtil.getClassFields(pojoClass); | |||
Field fileds[] = POIPublicUtil.getClassFields(pojoClass); | |||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
String targetId = null; | |||
if (etarget != null) { | |||
@@ -194,7 +194,7 @@ public class ExcelImportServer { | |||
pictures, params); | |||
} | |||
} else { | |||
object = ExcelPublicUtil.createObject(pojoClass, targetId); | |||
object = POIPublicUtil.createObject(pojoClass, targetId); | |||
for (int i = row.getFirstCellNum(), le = row.getLastCellNum(); i < le; i++) { | |||
Cell cell = row.getCell(i); | |||
String titleString = (String) titlemap.get(i); | |||
@@ -293,9 +293,9 @@ public class ExcelImportServer { | |||
PictureData image = pictures.get(picId); | |||
byte[] data = image.getData(); | |||
String fileName = "pic" + Math.round(Math.random() * 100000000000L); | |||
fileName += "." + ExcelPublicUtil.getFileExtendName(data); | |||
fileName += "." + POIPublicUtil.getFileExtendName(data); | |||
if (excelParams.get(titleString).getSaveType() == 1) { | |||
String path = ExcelPublicUtil.getWebRootPath(getSaveUrl( | |||
String path = POIPublicUtil.getWebRootPath(getSaveUrl( | |||
excelParams.get(titleString), object)); | |||
File savefile = new File(path); | |||
if (!savefile.exists()) { | |||
@@ -354,10 +354,10 @@ public class ExcelImportServer { | |||
Row row, Map<Integer, String> titlemap, String targetId, | |||
Map<String, PictureData> pictures, ImportParams params) | |||
throws Exception { | |||
Collection collection = (Collection) ExcelPublicUtil.getMethod( | |||
Collection collection = (Collection) POIPublicUtil.getMethod( | |||
param.getName(), object.getClass()).invoke(object, | |||
new Object[] {}); | |||
Object entity = ExcelPublicUtil.createObject(param.getType(), targetId); | |||
Object entity = POIPublicUtil.createObject(param.getType(), targetId); | |||
String picId; | |||
boolean isUsed = false;// 是否需要加上这个对象 | |||
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) { | |||
@@ -436,10 +436,10 @@ public class ExcelImportServer { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (ExcelPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (ExcelPublicUtil.isCollection(field.getType())) { | |||
if (POIPublicUtil.isCollection(field.getType())) { | |||
// 集合对象设置属性 | |||
ExcelCollectionParams collection = new ExcelCollectionParams(); | |||
collection.setName(field.getName()); | |||
@@ -449,10 +449,10 @@ public class ExcelImportServer { | |||
Class<?> clz = (Class<?>) pt.getActualTypeArguments()[0]; | |||
collection.setType(clz); | |||
getExcelFieldList(targetId, | |||
ExcelPublicUtil.getClassFields(clz), clz, temp, null); | |||
POIPublicUtil.getClassFields(clz), clz, temp, null); | |||
collection.setExcelParams(temp); | |||
excelCollection.add(collection); | |||
} else if (ExcelPublicUtil.isJavaClass(field)) { | |||
} else if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, | |||
getMethods, excelParams); | |||
} else { | |||
@@ -460,10 +460,10 @@ public class ExcelImportServer { | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods.add(ExcelPublicUtil.getMethod(field.getName(), | |||
newMethods.add(POIPublicUtil.getMethod(field.getName(), | |||
pojoClass)); | |||
getAllExcelField(targetId, | |||
ExcelPublicUtil.getClassFields(field.getType()), | |||
POIPublicUtil.getClassFields(field.getType()), | |||
excelParams, excelCollection, field.getType(), | |||
newMethods); | |||
} | |||
@@ -476,10 +476,10 @@ public class ExcelImportServer { | |||
ExcelImportEntity excelEntity = null; | |||
for (int i = 0; i < fields.length; i++) { | |||
Field field = fields[i]; | |||
if (ExcelPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
if (POIPublicUtil.isNotUserExcelUserThis(null, field, targetId)) { | |||
continue; | |||
} | |||
if (ExcelPublicUtil.isJavaClass(field)) { | |||
if (POIPublicUtil.isJavaClass(field)) { | |||
addEntityToMap(targetId, field, excelEntity, pojoClass, | |||
getMethods, temp); | |||
} else { | |||
@@ -487,10 +487,10 @@ public class ExcelImportServer { | |||
if (getMethods != null) { | |||
newMethods.addAll(getMethods); | |||
} | |||
newMethods.add(ExcelPublicUtil.getMethod(field.getName(), | |||
newMethods.add(POIPublicUtil.getMethod(field.getName(), | |||
pojoClass, field.getType())); | |||
getExcelFieldList(targetId, | |||
ExcelPublicUtil.getClassFields(field.getType()), | |||
POIPublicUtil.getClassFields(field.getType()), | |||
field.getType(), temp, newMethods); | |||
} | |||
} | |||
@@ -559,7 +559,7 @@ public class ExcelImportServer { | |||
throws Exception { | |||
excelEntity.setName(getExcelName(excel.name(), targetId)); | |||
String fieldname = field.getName(); | |||
excelEntity.setMethod(ExcelPublicUtil.getMethod(fieldname, pojoClass, | |||
excelEntity.setMethod(POIPublicUtil.getMethod(fieldname, pojoClass, | |||
field.getType())); | |||
if (StringUtils.isEmpty(excel.importFormat())) { | |||
excelEntity.setFormat(excel.format()); | |||
@@ -15,11 +15,11 @@ import java.lang.reflect.Field; | |||
import java.lang.reflect.Method; | |||
import java.util.*; | |||
public class ExcelPublicUtil { | |||
public class POIPublicUtil { | |||
public static String getWebRootPath(String filePath) { | |||
// 这个path还是要测试的 | |||
String path = ExcelPublicUtil.class.getClassLoader().getResource("") | |||
String path = POIPublicUtil.class.getClassLoader().getResource("") | |||
.getPath() | |||
+ filePath; | |||
path = path.replace("WEB-INF/classes/", ""); |
@@ -0,0 +1,28 @@ | |||
package org.jeecgframework.poi.word; | |||
import java.util.Map; | |||
import org.apache.poi.xwpf.usermodel.XWPFDocument; | |||
import org.jeecgframework.poi.word.parse.ParseWord07; | |||
/** | |||
* Word使用模板导出工具类 | |||
* @author JueYue | |||
* @date 2013-11-16 | |||
* @version 1.0 | |||
*/ | |||
public class WordExportUtil { | |||
/** | |||
* 解析Word2007版本 | |||
*@Author JueYue | |||
*@date 2013-11-16 | |||
*@param url 模板地址 | |||
*@param map 解析数据源 | |||
*@return | |||
*/ | |||
public static XWPFDocument exportWord07(String url,Map<String,Object> map) throws Exception{ | |||
return new ParseWord07().parseWord(url, map); | |||
} | |||
} |
@@ -0,0 +1,157 @@ | |||
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(OPCPackage opcPackage) throws Exception { | |||
super(opcPackage); | |||
} | |||
public JeecgXWPFDocument(InputStream in) throws Exception { | |||
super(in); | |||
} | |||
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 = "" + | |||
"<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + | |||
" <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + | |||
" <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + | |||
" <pic:nvPicPr>" + | |||
" <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" + | |||
" <pic:cNvPicPr/>" + | |||
" </pic:nvPicPr>" + | |||
" <pic:blipFill>" + | |||
" <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" + | |||
" <a:stretch>" + | |||
" <a:fillRect/>" + | |||
" </a:stretch>" + | |||
" </pic:blipFill>" + | |||
" <pic:spPr>" + | |||
" <a:xfrm>" + | |||
" <a:off x=\"0\" y=\"0\"/>" + | |||
" <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + | |||
" </a:xfrm>" + | |||
" <a:prstGeom prst=\"rect\">" + | |||
" <a:avLst/>" + | |||
" </a:prstGeom>" + | |||
" </pic:spPr>" + | |||
" </pic:pic>" + | |||
" </a:graphicData>" + | |||
"</a:graphic>"; | |||
//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 = "" | |||
+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" | |||
+ " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" | |||
+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" | |||
+ " <pic:nvPicPr>" + " <pic:cNvPr id=\"" | |||
+ id | |||
+ "\" name=\"Generated\"/>" | |||
+ " <pic:cNvPicPr/>" | |||
+ " </pic:nvPicPr>" | |||
+ " <pic:blipFill>" | |||
+ " <a:blip r:embed=\"" | |||
+ blipId | |||
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" | |||
+ " <a:stretch>" | |||
+ " <a:fillRect/>" | |||
+ " </a:stretch>" | |||
+ " </pic:blipFill>" | |||
+ " <pic:spPr>" | |||
+ " <a:xfrm>" | |||
+ " <a:off x=\"0\" y=\"0\"/>" | |||
+ " <a:ext cx=\"" | |||
+ width | |||
+ "\" cy=\"" | |||
+ height | |||
+ "\"/>" | |||
+ " </a:xfrm>" | |||
+ " <a:prstGeom prst=\"rect\">" | |||
+ " <a:avLst/>" | |||
+ " </a:prstGeom>" | |||
+ " </pic:spPr>" | |||
+ " </pic:pic>" | |||
+ " </a:graphicData>" + "</a:graphic>"; | |||
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"); | |||
} | |||
} |
@@ -0,0 +1,67 @@ | |||
package org.jeecgframework.poi.word.entity; | |||
/** | |||
* word导出,图片设置和图片信息 | |||
* @author JueYue | |||
* @date 2013-11-17 | |||
* @version 1.0 | |||
*/ | |||
public class WordImageEntity { | |||
public static String URL = "url"; | |||
public static String Data = "data"; | |||
/** | |||
* 图片输入方式 | |||
*/ | |||
private String type = URL; | |||
/** | |||
* 图片宽度 | |||
*/ | |||
private int width; | |||
//图片高度 | |||
private int height; | |||
//图片地址 | |||
private String url; | |||
//图片信息 | |||
private byte[] data; | |||
public String getType() { | |||
return type; | |||
} | |||
public void setType(String type) { | |||
this.type = type; | |||
} | |||
public int getWidth() { | |||
return width; | |||
} | |||
public void setWidth(int width) { | |||
this.width = width; | |||
} | |||
public int getHeight() { | |||
return height; | |||
} | |||
public void setHeight(int height) { | |||
this.height = height; | |||
} | |||
public String getUrl() { | |||
return url; | |||
} | |||
public void setUrl(String url) { | |||
this.url = url; | |||
} | |||
public byte[] getData() { | |||
return data; | |||
} | |||
public void setData(byte[] data) { | |||
this.data = data; | |||
} | |||
} |
@@ -0,0 +1,282 @@ | |||
package org.jeecgframework.poi.word.parse; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.poi.xwpf.usermodel.XWPFDocument; | |||
import org.apache.poi.xwpf.usermodel.XWPFParagraph; | |||
import org.apache.poi.xwpf.usermodel.XWPFRun; | |||
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.word.entity.WordImageEntity; | |||
import org.jeecgframework.poi.word.util.ParseWordUtil; | |||
/** | |||
* 解析07版的Word,替换文字,生成表格,生成图片 | |||
* | |||
* @author JueYue | |||
* @date 2013-11-16 | |||
* @version 1.0 | |||
*/ | |||
@SuppressWarnings({"unchecked","rawtypes"}) | |||
public class ParseWord07 { | |||
/** | |||
* 解析07版的Word并且进行赋值 | |||
* | |||
* @Author JueYue | |||
* @date 2013-11-16 | |||
* @return | |||
* @throws Exception | |||
*/ | |||
public XWPFDocument parseWord(String url, Map<String, Object> map) | |||
throws Exception { | |||
JeecgXWPFDocument doc = WordCache.getXWPFDocumen(url); | |||
parseWordSetValue(doc, map); | |||
return doc; | |||
} | |||
private void parseWordSetValue(JeecgXWPFDocument doc, | |||
Map<String, Object> map) throws Exception { | |||
//第一步解析文档 | |||
parseAllParagraphic(doc.getParagraphs(),map); | |||
//第二步解析所有表格 | |||
XWPFTable table; | |||
Iterator<XWPFTable> itTable = doc.getTablesIterator(); | |||
while (itTable.hasNext()) { | |||
table = itTable.next(); | |||
if (table.getText().indexOf("{{") != -1) { | |||
parseThisTable(table, map); | |||
} | |||
} | |||
} | |||
/** | |||
* 解析所有的文本 | |||
*@Author JueYue | |||
*@date 2013-11-17 | |||
*@param paragraphs | |||
*@param map | |||
*/ | |||
private void parseAllParagraphic(List<XWPFParagraph> paragraphs, | |||
Map<String, Object> map) throws Exception { | |||
XWPFParagraph paragraph; | |||
for (int i = 0; i < paragraphs.size(); i++) { | |||
paragraph = paragraphs.get(i); | |||
if (paragraph.getText().indexOf("{{") != -1) { | |||
parseThisParagraph(paragraph, map); | |||
} | |||
} | |||
} | |||
/** | |||
* 解析这个表格 | |||
* | |||
* @Author JueYue | |||
* @date 2013-11-17 | |||
* @param table | |||
* @param map | |||
*/ | |||
private void parseThisTable(XWPFTable table, Map<String, Object> map) throws Exception { | |||
XWPFTableRow row; | |||
List<XWPFTableCell> cells; | |||
Object listobj; | |||
for (int i = 0; i < table.getNumberOfRows(); i++) { | |||
row = table.getRow(i); | |||
cells = row.getTableCells(); | |||
if(cells.size() == 1){ | |||
listobj = checkThisTableIsNeedIterator(cells.get(0),map); | |||
if(listobj==null){ | |||
parseThisRow(cells,map); | |||
}else{ | |||
table.removeRow(i);//删除这一行 | |||
parseNextRowAndAddRow(table,i,(List) listobj); | |||
} | |||
}else{ | |||
parseThisRow(cells,map); | |||
} | |||
} | |||
} | |||
/** | |||
* 解析下一行,并且生成更多的行 | |||
*@Author JueYue | |||
*@date 2013-11-18 | |||
*@param table | |||
*@param listobj2 | |||
*/ | |||
private void parseNextRowAndAddRow(XWPFTable table,int index, List<Object> list) throws Exception { | |||
XWPFTableRow currentRow = table.getRow(index); | |||
String[] params = parseCurrentRowGetParams(currentRow); | |||
table.removeRow(index);//移除这一行 | |||
int cellIndex = 0;//创建完成对象一行好像多了一个cell | |||
for(Object obj :list){ | |||
currentRow = table.createRow(); | |||
for(cellIndex = 0;cellIndex<currentRow.getTableCells().size();cellIndex++){ | |||
currentRow.getTableCells().get(cellIndex).setText( | |||
ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0).toString()); | |||
} | |||
for (;cellIndex<params.length;cellIndex++) { | |||
currentRow.createCell().setText( | |||
ParseWordUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0).toString()); | |||
} | |||
} | |||
} | |||
/** | |||
* 解析参数行,获取参数列表 | |||
*@Author JueYue | |||
*@date 2013-11-18 | |||
*@param currentRow | |||
*@return | |||
*/ | |||
private String[] parseCurrentRowGetParams(XWPFTableRow currentRow) { | |||
List<XWPFTableCell> cells = currentRow.getTableCells(); | |||
String[] params = new String[cells.size()]; | |||
String text; | |||
for (int i=0;i<cells.size();i++) { | |||
text = cells.get(i).getText(); | |||
params[i] = text==null?"":text.trim().replace("{{","").replace("}}",""); | |||
} | |||
return params; | |||
} | |||
private void parseThisRow(List<XWPFTableCell> cells, | |||
Map<String, Object> map) throws Exception { | |||
for (XWPFTableCell cell : cells) { | |||
parseAllParagraphic(cell.getParagraphs(),map); | |||
} | |||
} | |||
/** | |||
*判断是不是迭代输出 | |||
*@Author JueYue | |||
*@date 2013-11-18 | |||
*@return | |||
* @throws Exception | |||
*/ | |||
private Object checkThisTableIsNeedIterator(XWPFTableCell cell | |||
, Map<String, Object> map) throws Exception { | |||
String text = cell.getText().trim(); | |||
//判断是不是迭代输出 | |||
if(text.startsWith("{{")&&text.endsWith("}}")&&text.indexOf("in ")!=-1){ | |||
return ParseWordUtil.getRealValue(text.replace("in ", "").trim(),map); | |||
} | |||
return null; | |||
} | |||
/** | |||
* 解析这个段落 | |||
* | |||
* @Author JueYue | |||
* @date 2013-11-16 | |||
* @param paragraph | |||
* @param map | |||
*/ | |||
private void parseThisParagraph(XWPFParagraph paragraph, | |||
Map<String, Object> map) throws Exception { | |||
XWPFRun run; | |||
XWPFRun currentRun = null;// 拿到的第一个run,用来set值,可以保存格式 | |||
String currentText = "";// 存放当前的text | |||
String text; | |||
Boolean isfinde = false;// 判断是不是已经遇到{{ | |||
List<Integer> runIndex = new ArrayList<Integer>();// 存储遇到的run,把他们置空 | |||
for (int i = 0; i < paragraph.getRuns().size(); i++) { | |||
run = paragraph.getRuns().get(i); | |||
text = run.getText(0); | |||
if (text == null || text == "") { | |||
continue; | |||
}// 如果为空或者""这种这继续循环跳过 | |||
if (isfinde) { | |||
currentText += text; | |||
if (currentText.indexOf("{{") == -1) { | |||
isfinde = false; | |||
runIndex.clear(); | |||
} else { | |||
runIndex.add(i); | |||
} | |||
if (currentText.indexOf("}}") != -1) { | |||
changeValues(paragraph, currentRun, currentText, runIndex, | |||
map); | |||
currentText = ""; | |||
isfinde = false; | |||
} | |||
} else if (text.indexOf("{") >= 0) {// 判断是不是开始 | |||
currentText = text; | |||
isfinde = true; | |||
currentRun = run; | |||
}else{ | |||
currentText = ""; | |||
} | |||
if (currentText.indexOf("}}") != -1) { | |||
changeValues(paragraph, currentRun, currentText, runIndex, map); | |||
isfinde = false; | |||
} | |||
} | |||
} | |||
/** | |||
* 根据条件改变值 | |||
* | |||
* @param map | |||
* @Author JueYue | |||
* @date 2013-11-16 | |||
*/ | |||
private void changeValues(XWPFParagraph paragraph, | |||
XWPFRun currentRun, String currentText, List<Integer> runIndex, | |||
Map<String, Object> map) throws Exception { | |||
Object obj = ParseWordUtil.getRealValue(currentText, map); | |||
if(obj instanceof WordImageEntity){//如果是图片就设置为图片 | |||
currentRun.setText("", 0); | |||
addAnImage((WordImageEntity)obj,currentRun); | |||
}else{ | |||
currentText = obj.toString(); | |||
currentRun.setText(currentText,0); | |||
} | |||
for (int k = 0; k < runIndex.size(); k++) { | |||
paragraph.getRuns().get(runIndex.get(k)).setText("", 0); | |||
} | |||
runIndex.clear(); | |||
} | |||
/** | |||
* 添加图片 | |||
*@Author JueYue | |||
*@date 2013-11-20 | |||
*@param obj | |||
*@param currentRun | |||
* @throws Exception | |||
*/ | |||
private void addAnImage(WordImageEntity obj, XWPFRun currentRun) throws Exception { | |||
Object [] isAndType = ParseWordUtil.getIsAndType(obj); | |||
String picId; | |||
try { | |||
picId = currentRun.getParagraph().getDocument().addPictureData( | |||
(byte[]) isAndType[0], | |||
(Integer) isAndType[1]); | |||
((JeecgXWPFDocument) currentRun.getParagraph().getDocument()).createPicture( | |||
currentRun,picId, | |||
currentRun.getParagraph().getDocument().getNextPicNameNumber((Integer) isAndType[1]), | |||
obj.getWidth(),obj.getHeight()); | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,143 @@ | |||
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; | |||
/** | |||
* 解析公告类 | |||
* @author JueYue | |||
* @date 2014-7-24 | |||
* @version 1.1 | |||
*/ | |||
public class ParseWordUtil { | |||
/** | |||
* 解析数据 | |||
* | |||
* @Author JueYue | |||
* @date 2013-11-16 | |||
* @return | |||
*/ | |||
public static Object getRealValue(String currentText, | |||
Map<String, Object> 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){ | |||
return obj; | |||
}else{ | |||
currentText = currentText.replace("{{" + params + "}}", | |||
obj.toString()); | |||
} | |||
} | |||
return currentText; | |||
} | |||
/** | |||
* 获取参数值 | |||
* | |||
* @param params | |||
* @param map | |||
* @return | |||
*/ | |||
private static Object getParamsValue(String params, Map<String, Object> 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) : ""; | |||
} | |||
/** | |||
* 通过遍历过去对象值 | |||
* | |||
* @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); | |||
} | |||
/** | |||
* 返回流和图片类型 | |||
*@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; | |||
} | |||
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; | |||
} | |||
} |
@@ -1,5 +1,5 @@ | |||
#Generated by Maven Integration for Eclipse | |||
#Thu Jul 24 22:34:43 CST 2014 | |||
#Thu Jul 24 23:06:08 CST 2014 | |||
version=2.0.1 | |||
groupId=org.jeecgframework | |||
m2e.projectName=easypoi-base | |||