Java tutorial
/** * 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 com.qihang.winter.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.math.BigDecimal; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; 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; import org.apache.poi.hssf.usermodel.HSSFPictureData; import org.apache.poi.hssf.usermodel.HSSFShape; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.PictureData; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; 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.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * EASYPOI * @author Zerrion * @date 201545 ?12:59:22 */ public final class PoiPublicUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PoiPublicUtil.class); private PoiPublicUtil() { } @SuppressWarnings({ "unchecked" }) public static <K, V> Map<K, V> mapFor(Object... mapping) { Map<K, V> map = new HashMap<K, V>(); for (int i = 0; i < mapping.length; i += 2) { map.put((K) mapping[i], (V) mapping[i + 1]); } return map; } /** * * * @param clazz * @return */ public static Object createObject(Class<?> clazz, String targetId) { Object obj = null; Method setMethod; try { if (clazz.equals(Map.class)) { return new HashMap<String, Object>(); } obj = clazz.newInstance(); Field[] fields = getClassFields(clazz); for (Field field : fields) { if (isNotUserExcelUserThis(null, field, targetId)) { continue; } if (isCollection(field.getType())) { com.qihang.winter.poi.excel.annotation.ExcelCollection collection = field .getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelCollection.class); setMethod = getMethod(field.getName(), clazz, field.getType()); setMethod.invoke(obj, collection.type().newInstance()); } else if (!isJavaClass(field)) { setMethod = getMethod(field.getName(), clazz, field.getType()); setMethod.invoke(obj, createObject(field.getType(), targetId)); } } } catch (Exception e) { LOGGER.error(e.getMessage(), e); throw new RuntimeException(""); } return obj; } /** * ?class * * @param clazz * @return */ public static Field[] getClassFields(Class<?> clazz) { List<Field> list = new ArrayList<Field>(); Field[] fields; do { fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { list.add(fields[i]); } clazz = clazz.getSuperclass(); } while (clazz != Object.class && clazz != null); return list.toArray(fields); } /** * @param photoByte * @return */ public static String getFileExtendName(byte[] photoByte) { String strFileExtendName = "JPG"; if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) { strFileExtendName = "GIF"; } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) { strFileExtendName = "JPG"; } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { strFileExtendName = "BMP"; } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) { strFileExtendName = "PNG"; } return strFileExtendName; } /** * ?GET * * @param name * @param pojoClass * @return * @throws Exception */ public static Method getMethod(String name, Class<?> pojoClass) throws Exception { StringBuffer getMethodName = new StringBuffer(com.qihang.winter.poi.excel.entity.vo.PoiBaseConstants.GET); getMethodName.append(name.substring(0, 1).toUpperCase()); getMethodName.append(name.substring(1)); Method method = null; try { method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); } catch (Exception e) { method = pojoClass.getMethod( getMethodName.toString().replace(com.qihang.winter.poi.excel.entity.vo.PoiBaseConstants.GET, com.qihang.winter.poi.excel.entity.vo.PoiBaseConstants.IS), new Class[] {}); } return method; } /** * ?SET * * @param name * @param pojoClass * @param type * @return * @throws Exception */ public static Method getMethod(String name, Class<?> pojoClass, Class<?> type) throws Exception { StringBuffer getMethodName = new StringBuffer(com.qihang.winter.poi.excel.entity.vo.PoiBaseConstants.SET); getMethodName.append(name.substring(0, 1).toUpperCase()); getMethodName.append(name.substring(1)); return pojoClass.getMethod(getMethodName.toString(), new Class[] { type }); } /** * ?Excel2003 * * @param sheet * ?sheet * @param workbook * * @return Map key:?1_1Stringvalue:?PictureData */ public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, HSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); List<HSSFPictureData> pictures = workbook.getAllPictures(); if (!pictures.isEmpty()) { for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); if (shape instanceof HSSFPicture) { HSSFPicture pic = (HSSFPicture) shape; int pictureIndex = pic.getPictureIndex() - 1; HSSFPictureData picData = pictures.get(pictureIndex); String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); sheetIndexPicMap.put(picIndex, picData); } } return sheetIndexPicMap; } else { return null; } } /** * ?Excel2007 * * @param sheet * ?sheet * @param workbook * * @return Map key:?1_1Stringvalue:?PictureData */ public static Map<String, PictureData> getSheetPictrues07(XSSFSheet sheet, XSSFWorkbook workbook) { Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); for (POIXMLDocumentPart dr : sheet.getRelations()) { if (dr instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) dr; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } return sheetIndexPicMap; } public static String getWebRootPath(String filePath) { try { String path = PoiPublicUtil.class.getClassLoader().getResource("").toURI().getPath(); path = path.replace("WEB-INF/classes/", ""); path = path.replace("file:/", ""); return path + filePath; } catch (URISyntaxException e) { throw new RuntimeException(e); } } /** * ?? * * @param clazz * @return */ public static boolean isCollection(Class<?> clazz) { return Collection.class.isAssignableFrom(clazz); } /** * ?java * * @param field * @return */ public static boolean isJavaClass(Field field) { Class<?> fieldType = field.getType(); boolean isBaseClass = false; if (fieldType.isArray()) { isBaseClass = false; } else if (fieldType.isPrimitive() || fieldType.getPackage() == null || fieldType.getPackage().getName().equals("java.lang") || fieldType.getPackage().getName().equals("java.math") || fieldType.getPackage().getName().equals("java.sql") || fieldType.getPackage().getName().equals("java.util")) { isBaseClass = true; } return isBaseClass; } /** * ???excel? * * @param * @param field * @param targetId * @return */ public static boolean isNotUserExcelUserThis(List<String> exclusionsList, Field field, String targetId) { boolean boo = true; if (field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelIgnore.class) != null) { boo = true; } else if (boo && field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelCollection.class) != null && isUseInThis( field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelCollection.class).name(), targetId) && (exclusionsList == null || !exclusionsList.contains(field .getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelCollection.class).name()))) { boo = false; } else if (boo && field.getAnnotation(com.qihang.winter.poi.excel.annotation.Excel.class) != null && isUseInThis(field.getAnnotation(com.qihang.winter.poi.excel.annotation.Excel.class).name(), targetId) && (exclusionsList == null || !exclusionsList.contains( field.getAnnotation(com.qihang.winter.poi.excel.annotation.Excel.class).name()))) { boo = false; } else if (boo && field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelEntity.class) != null && isUseInThis(field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelEntity.class).name(), targetId) && (exclusionsList == null || !exclusionsList.contains( field.getAnnotation(com.qihang.winter.poi.excel.annotation.ExcelEntity.class).name()))) { boo = false; } return boo; } /** * ? * * @param exportName * @param targetId * @return */ private static boolean isUseInThis(String exportName, String targetId) { return targetId == null || exportName.equals("") || exportName.indexOf("_") < 0 || 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 Zerrion *@date 2013-11-20 *@param entity *@return (byte[]) isAndType[0],(Integer)isAndType[1] * @throws Exception */ public static Object[] getIsAndType(com.qihang.winter.poi.word.entity.WordImageEntity entity) throws Exception { Object[] result = new Object[2]; String type; if (entity.getType().equals(com.qihang.winter.poi.word.entity.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 */ @SuppressWarnings("rawtypes") public static Object getParamsValue(String params, Object object) throws Exception { if (params.indexOf(".") != -1) { String[] paramsArr = params.split("\\."); return getValueDoWhile(object, paramsArr, 0); } if (object instanceof Map) { return ((Map) object).get(params); } return getMethod(params, object.getClass()).invoke(object, new Object[] {}); } /** * ?? * * @author Zerrion * @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 com.qihang.winter.poi.word.entity.WordImageEntity || obj instanceof List || obj instanceof com.qihang.winter.poi.word.entity.params.ExcelListEntity) { return obj; } else { currentText = currentText.replace("{{" + params + "}}", obj.toString()); } } return currentText; } /** * ?? * * @param object * @param paramsArr * @param index * @return * @throws Exception */ @SuppressWarnings("rawtypes") public static Object getValueDoWhile(Object object, String[] paramsArr, int index) throws Exception { if (object == null) { return ""; } if (object instanceof com.qihang.winter.poi.word.entity.WordImageEntity) { return object; } if (object instanceof Map) { object = ((Map) object).get(paramsArr[index]); } else { object = getMethod(paramsArr[index], object.getClass()).invoke(object, new Object[] {}); } return (index == paramsArr.length - 1) ? (object == null ? "" : object) : getValueDoWhile(object, paramsArr, ++index); } /** * double to String * @param value * @return */ public static String doubleToString(Double value) { String temp = value.toString(); if (temp.contains("E")) { BigDecimal bigDecimal = new BigDecimal(temp); temp = bigDecimal.toPlainString(); } return temp; } }