PoiPublicUtil.java
14.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
package com.bckefu.excel.util;
import com.bckefu.excel.cache.ImageCache;
import com.bckefu.excel.entity.params.ExcelListEntity;
import com.bckefu.excel.annotation.Excel;
import com.bckefu.excel.annotation.ExcelCollection;
import com.bckefu.excel.annotation.ExcelEntity;
import com.bckefu.excel.annotation.ExcelIgnore;
import com.bckefu.excel.entity.ImageEntity;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.net.URISyntaxException;
import java.util.*;
/**
* @author caoliang1918@aliyun.com
* @Date 2017/11/5:22:44
*/
public 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;
try {
if (clazz.equals(Map.class)) {
return new LinkedHashMap<String,Object>();
}
obj = clazz.newInstance();
Field[] fields = getClassFields(clazz);
for (Field field : fields) {
if (isNotUserExcelUserThis(null, field, targetId)) {
continue;
}
if (isCollection(field.getType())) {
ExcelCollection collection = field.getAnnotation(ExcelCollection.class);
PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(),
collection.type().newInstance());
} else if (!isJavaClass(field)) {
PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(),
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;
}
/**
* 获取Excel2003图片
*
* @param sheet
* 当前sheet对象
* @param workbook
* 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流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 sheetIndexPicMap;
}
}
/**
* 获取Excel2007图片
*
* @param sheet
* 当前sheet对象
* @param workbook
* 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流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
|| "java.lang".equals(fieldType.getPackage().getName())
|| "java.math".equals(fieldType.getPackage().getName())
|| "java.sql".equals(fieldType.getPackage().getName())
|| "java.util".equals(fieldType.getPackage().getName())) {
isBaseClass = true;
}
return isBaseClass;
}
/**
* 判断是否不要在这个excel操作中
*
* @param exclusionsList
* @param field
* @param targetId
* @return
*/
public static boolean isNotUserExcelUserThis(List<String> exclusionsList, Field field,
String targetId) {
boolean boo = true;
if (field.getAnnotation(ExcelIgnore.class) != null) {
boo = true;
} else if (boo && field.getAnnotation(ExcelCollection.class) != null
&& isUseInThis(field.getAnnotation(ExcelCollection.class).name(), targetId)
&& (exclusionsList == null || !exclusionsList
.contains(field.getAnnotation(ExcelCollection.class).name()))) {
boo = false;
} else if (boo && field.getAnnotation(Excel.class) != null
&& isUseInThis(field.getAnnotation(Excel.class).name(), targetId)
&& (exclusionsList == null
|| !exclusionsList.contains(field.getAnnotation(Excel.class).name()))) {
boo = false;
} else if (boo && field.getAnnotation(ExcelEntity.class) != null
&& isUseInThis(field.getAnnotation(ExcelEntity.class).name(), targetId)
&& (exclusionsList == null || !exclusionsList
.contains(field.getAnnotation(ExcelEntity.class).name()))) {
boo = false;
}
return boo;
}
/**
* 判断是不是使用
*
* @param exportName
* @param targetId
* @return
*/
private static boolean isUseInThis(String exportName, String targetId) {
return targetId == null || "".equals(exportName) || exportName.indexOf("_") < 0
|| exportName.indexOf(targetId) != -1;
}
private static Integer getImageType(String type) {
if ("JPG".equalsIgnoreCase(type) || "JPEG".equalsIgnoreCase(type)) {
return XWPFDocument.PICTURE_TYPE_JPEG;
}
if ("GIF".equalsIgnoreCase(type)) {
return XWPFDocument.PICTURE_TYPE_GIF;
}
if ("BMP".equalsIgnoreCase(type)) {
return XWPFDocument.PICTURE_TYPE_GIF;
}
if ("PNG".equalsIgnoreCase(type)) {
return XWPFDocument.PICTURE_TYPE_PNG;
}
return XWPFDocument.PICTURE_TYPE_JPEG;
}
/**
* 返回流和图片类型
*@author JueYue
* 2013-11-20
*@param entity
*@return (byte[]) isAndType[0],(Integer)isAndType[1]
* @throws Exception
*/
public static Object[] getIsAndType(ImageEntity entity) throws Exception {
Object[] result = new Object[2];
String type;
if (entity.getType().equals(ImageEntity.URL)) {
result[0] = ImageCache.getImage(entity.getUrl());
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 object
* @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 PoiReflectorUtil.fromCache(object.getClass()).getValue(object, params);
}
/**
* 解析数据
*
* @author JueYue
* 2013-11-16
* @return
*/
public static Object getRealValue(String currentText,
Map<String, Object> map) throws Exception {
String params = "";
while (currentText.indexOf(PoiElUtil.START_STR) != -1) {
params = currentText.substring(currentText.indexOf(PoiElUtil.START_STR) + 2,
currentText.indexOf(PoiElUtil.END_STR));
Object obj = PoiElUtil.eval(params.trim(), map);
//判断图片或者是集合
if (obj instanceof ImageEntity || obj instanceof List
|| obj instanceof ExcelListEntity) {
return obj;
} else {
currentText = currentText.replace(PoiElUtil.START_STR + params + PoiElUtil.END_STR, 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 ImageEntity) {
return object;
}
if (object instanceof Map) {
object = ((Map) object).get(paramsArr[index]);
} else {
object = PoiReflectorUtil.fromCache(object.getClass()).getValue(object,
paramsArr[index]);
}
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;
}
/**
* 统一 key的获取规则
* @param key
* @param targetId
* @return
*/
public static String getValueByTargetId(String key, String targetId, String defalut) {
if (StringUtils.isEmpty(targetId) || key.indexOf("_") < 0) {
return key;
}
String[] arr = key.split(",");
String[] tempArr;
for (String str : arr) {
tempArr = str.split("_");
if (tempArr == null || tempArr.length < 2) {
return defalut;
}
if (targetId.equals(tempArr[1])) {
return tempArr[0];
}
}
return defalut;
}
/**
* 支持换行操作
* @param currentRun
* @param currentText
*/
public static void setWordText(XWPFRun currentRun, String currentText) {
if (StringUtils.isNotBlank(currentText)) {
String[] tempArr = currentText.split("\r\n");
for (int i = 0, le = tempArr.length - 1; i < le; i++) {
currentRun.setText(tempArr[i], i);
currentRun.addBreak();
}
currentRun.setText(tempArr[tempArr.length - 1], tempArr.length - 1);
}
}
}