OSDN Git Service

#34479 対応中
[jaxcel/jaxcel.git] / Jaxcel / src / org / hanei / jaxcel / util / ExcelUtil.java
index a977c44..2c5f789 100644 (file)
@@ -21,6 +21,9 @@ package org.hanei.jaxcel.util;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 
 import org.apache.poi.POIXMLDocumentPart;
@@ -62,7 +65,7 @@ import org.slf4j.Logger;
 /**
  * Excelユーティリティクラス
  * 
- * @version 1.00.00
+ * @since 1.00.00
  * @author Noboru Saito
  */
 public class ExcelUtil {
@@ -655,8 +658,9 @@ public class ExcelUtil {
                if(!validateRange(sheet, range)) {
                        _range = getIntersectRange(sheet, range);
                        if(_range == null) {
-                               log.error("range is illegal: [{}]", range.formatAsString());
-                               throw new JaxcelInputException("range is illegal");
+                               log.warn("range is illegal: [{}]", range.formatAsString());
+                               log.trace("clearRange end");
+                               return;
                        }
                        else {
                                log.info("resize range: [{}]", _range.formatAsString());
@@ -1033,49 +1037,6 @@ public class ExcelUtil {
                        }
                }
                
-/*             
-               // シェイプ等のオブジェクトの削除・移動
-               // xls形式
-               if(sheet instanceof HSSFSheet) {
-                       try {
-                               HSSFClientAnchor anchor;
-                               HSSFPatriarch patriarch = ((HSSFSheet)sheet).getDrawingPatriarch();
-                               if(patriarch != null) {
-                                       List<HSSFShape> shapes = patriarch.getChildren();
-                                       if(shapes != null) {
-                                               int r1, c1, r2, c2;
-                                               for (int i = 0; i < shapes.size(); i++) {
-                                                       log.debug("shape class: {}", shapes.get(i).getClass().getName());
-                                                       // オブジェクトの位置情報取得
-                                                       anchor = (HSSFClientAnchor)shapes.get(i).getAnchor();
-                                                       if(anchor == null) continue;
-                                                       r1 = anchor.getRow1();
-                                                       c1 = anchor.getCol1();
-                                                       r2 = anchor.getRow2();
-                                                       c2 = anchor.getCol2();
-                                                       tmpRange = new CellRangeAddress(r1, r2, c1, c2);
-                                                       
-                                                       // 移動先範囲に含まれている、掛かっているなら移動
-                                                       
-                                                       // 移動元レンジに含まれている、掛かっているなら移動
-                                                       switch(CellRangeUtil.intersect(range, tmpRange)) {
-                                                       case CellRangeUtil.INSIDE:
-                                                       case CellRangeUtil.OVERLAP:
-                                                               anchor.setRow1(r1 + rowDistance);
-                                                               anchor.setRow2(r2 + rowDistance);
-                                                               anchor.setCol1(c1 + colDistance);
-                                                               anchor.setCol2(c2 + colDistance);
-                                                               log.debug("shape move from: [{}] to: [{}]", tmpRange.formatAsString(), (new CellRangeAddress(anchor.getRow1(), anchor.getRow2(), anchor.getCol1(), anchor.getCol2())).formatAsString());
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       catch(Exception e) {
-                               log.error("shape move error: {}", e.getMessage(), e);
-                       }
-               }
-*/
                // シェイプ等のオブジェクトの削除・移動 Excel2007以降 ooxml形式のみ対応
                if(sheet instanceof XSSFSheet) {
                        XSSFSheet xSheet = (XSSFSheet) sheet;
@@ -1430,4 +1391,98 @@ public class ExcelUtil {
                        }
                }
        }
+       
+       /**
+        * セルのアドレス比較<br>
+        * 
+        * @param cellA 対象セルA
+        * @param cellB 対象セルB
+        * @param isCheckSheet  trueの場合、シート名を含め比較する
+        * 
+        * @return 判定結果<br>
+        * 対象セルのいずれかでもnullの場合はfalse
+        * 
+        * @since 1.01.00
+        */
+       public static boolean equalsCellAddress(Cell cellA, Cell cellB, boolean isCheckSheet) {
+               
+               if(cellA == null || cellB == null) return false;
+               
+               if(isCheckSheet) {
+                       if(!(cellA.getSheet().getSheetName().equals(cellB.getSheet().getSheetName()))) {
+                               return false;
+                       }
+               }
+               return cellA.getColumnIndex() == cellB.getColumnIndex() &&
+                               cellA.getRowIndex() == cellB.getRowIndex();
+               
+       }
+       
+       /**
+        * セルの文字列・数式から指定された正規表現の最初の部分を指定された文字列に置換した結果を返却<br>
+        * 
+        * replacement内でのバックスラッシュ (\) とドル記号 ($) は、String.replaceFirstと同様に作用します。
+        * 
+        * @param cell  対象セル
+        * @param target        置換される文字列
+        * @param replacement   置き換える文字列
+        * @param regex trueの場合、targetを正規表現として扱う
+        * 
+        * @return 置換後のセル文字列・計算式<br>
+        * 対象セルがnullの場合はnull<br>
+        * 対象セルのセルタイプが文字列・数式以外の場合はnull
+        * 
+        * @since 1.01.00
+        */
+       public static String replaceFirstCellValue(Cell cell, String target, String replacement, boolean regex) {
+               // チェック
+               if(cell == null) return null;
+               String _replacement = replacement == null ? "" : replacement;
+               String _return = null;
+               // セルタイプ毎処理
+               switch(cell.getCellType()) {
+               case Cell.CELL_TYPE_STRING:
+                       if(target == null) _return = cell.getStringCellValue();
+                       try {
+                               _return = cell.getStringCellValue().replaceFirst(regex ? target : Pattern.quote(target), _replacement);
+                       }
+                       catch(PatternSyntaxException e) {
+                               log.warn("replaceFirst error. {}", e.getMessage());
+                       }
+                       break;
+               case Cell.CELL_TYPE_FORMULA:
+                       if(target == null) _return = cell.getCellFormula();
+                       try {
+                               _return = cell.getCellFormula().replaceFirst(regex ? target : Pattern.quote(target), _replacement);
+                       }
+                       catch(PatternSyntaxException e) {
+                               log.warn("replaceFirst error. {}", e.getMessage());
+                       }
+                       break;
+               default:
+                       // セルタイプが上記以外の場合はnull返却
+                       log.warn("cell type is not strng or formula");
+                       return null;
+               }
+               if(_return == null) _return = "";
+               return _return;
+       }       
+
+       /**
+        * セルの文字列・数式から指定された文字列の最初の部分を指定された文字列に置換した結果を返却<br>
+        * 引数のtarget, replacementともに正規表現として扱いません。
+        * 
+        * @param cell  対象セル
+        * @param target        置換される文字列
+        * @param replacement   置き換える文字列
+        * 
+        * @return 置換後のセル文字列・計算式<br>
+        * 対象セルがnullの場合はnull<br>
+        * 対象セルのセルタイプが文字列・数式以外の場合はnull
+        * 
+        * @since 1.01.00
+        */
+       public static String replaceFirstCellValue(Cell cell, String target, String replacement) {
+               return replaceFirstCellValue(cell, target, Matcher.quoteReplacement(replacement), false);
+       }
 }