View Javadoc
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   * POIのセルのラッパークラス。
24   *
25   * @version 0.10
26   * @since 0.4
27   * @author T.TSUCHIE
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       * @param cell フォーマット対象のセルのインスタンス。
39       * @throws IllegalArgumentException {@literal cell == null.}
40       */
41      public POICell(final Cell cell) {
42          ArgUtils.notNull(cell, "cell");
43          this.cell = cell;
44      }
45  
46      /**
47       * POIの元々のセルのインスタンスを取得する。
48       * @return
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 }