1 package com.github.mygreen.cellformatter;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.lang.reflect.Method;
5 import java.util.Date;
6 import java.util.TimeZone;
7
8 import org.apache.poi.hssf.model.InternalWorkbook;
9 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
10 import org.apache.poi.ss.usermodel.Cell;
11 import org.apache.poi.ss.usermodel.CellType;
12 import org.apache.poi.ss.usermodel.DataFormat;
13 import org.apache.poi.ss.usermodel.Workbook;
14 import org.apache.poi.ss.util.CellReference;
15 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import com.github.mygreen.cellformatter.lang.ArgUtils;
20
21
22
23
24
25
26
27
28
29
30 public class POICell implements CommonCell {
31
32 private static Logger logger = LoggerFactory.getLogger(POICell.class);
33
34 private final Cell cell;
35
36
37
38
39
40
41 public POICell(final Cell cell) {
42 ArgUtils.notNull(cell, "cell");
43 this.cell = cell;
44 }
45
46
47
48
49
50 public Cell getCell() {
51 return cell;
52 }
53
54 @Override
55 public short getFormatIndex() {
56 final short formatIndex = getCell().getCellStyle().getDataFormat();
57 return formatIndex;
58 }
59
60 @Override
61 public String getFormatPattern() {
62 final DataFormat dataFormat = cell.getSheet().getWorkbook().createDataFormat();
63 final short formatIndex = getFormatIndex();
64
65 String formatPattern = dataFormat.getFormat(formatIndex);
66 if(formatPattern == null) {
67 formatPattern = "";
68 }
69
70 return formatPattern;
71
72 }
73
74 @Override
75 public boolean isText() {
76 return cell.getCellType() == CellType.STRING;
77 }
78
79 @Override
80 public String getTextCellValue() {
81 return cell.getStringCellValue();
82 }
83
84 @Override
85 public boolean isBoolean() {
86 return cell.getCellType() == CellType.BOOLEAN;
87 }
88
89 @Override
90 public boolean getBooleanCellValue() {
91 return cell.getBooleanCellValue();
92 }
93
94 @Override
95 public boolean isNumber() {
96 return cell.getCellType() == CellType.NUMERIC;
97 }
98
99 @Override
100 public double getNumberCellValue() {
101 return cell.getNumericCellValue();
102 }
103
104 @Override
105 public Date getDateCellValue() {
106 final Date date = cell.getDateCellValue();
107
108
109 return new Date(date.getTime() + TimeZone.getDefault().getRawOffset());
110 }
111
112 @Override
113 public boolean isDateStart1904() {
114
115 final Workbook workbook = cell.getSheet().getWorkbook();
116 if(workbook instanceof HSSFWorkbook) {
117 try {
118 Method method = HSSFWorkbook.class.getDeclaredMethod("getWorkbook");
119 method.setAccessible(true);
120
121 InternalWorkbook iw = (InternalWorkbook) method.invoke(workbook);
122 return iw.isUsing1904DateWindowing();
123
124 } catch(NoSuchMethodException | SecurityException e) {
125 logger.warn("fail access method HSSFWorkbook.getWorkbook.", e);
126 return false;
127 } catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
128 logger.warn("fail invoke method HSSFWorkbook.getWorkbook.", e);
129 return false;
130 }
131
132 } else if(workbook instanceof XSSFWorkbook) {
133 try {
134 Method method = XSSFWorkbook.class.getDeclaredMethod("isDate1904");
135 method.setAccessible(true);
136
137 boolean value = (boolean) method.invoke(workbook);
138 return value;
139
140 } catch(NoSuchMethodException | SecurityException e) {
141 logger.warn("fail access method XSSFWorkbook.isDate1904.", e);
142 return false;
143 } catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
144 logger.warn("fail invoke method XSSFWorkbook.isDate1904.", e);
145 return false;
146 }
147
148 } else {
149 logger.warn("unknown workbook type.", workbook.getClass().getName());
150 }
151
152 return false;
153 }
154
155 @Override
156 public String getCellAddress() {
157 return CellReference.convertNumToColString(cell.getColumnIndex()) + String.valueOf(cell.getRowIndex()+1);
158 }
159
160 }