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;
/**
* Excelユーティリティクラス
*
- * @version 1.00.00
+ * @since 1.00.00
* @author Noboru Saito
*/
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("shift end");
+ return;
}
else {
log.info("resize range: [{}]", _range.formatAsString());
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());
if(cell == null) continue;
// ハイパーリンクのクリア
clearHyperlink(sheet, cell);
+ // コメントクリア
+ cell.removeCellComment();
// スタイルクリアならセルの削除
if(clearStyle) {
row.removeCell(cell);
}
}
-/*
- // シェイプ等のオブジェクトの削除・移動
- // 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;
// 移動元セルがnullでない、移動先がシート範囲外
else if(fCell != null && tCell == null) {
log.debug("cell move to outside sheet. clear cell: [{}]", (new CellReference(fCell)).formatAsString());
+ // コメントクリア
+ fCell.removeCellComment();
// 移動元セルのハイパーリンク クリア
clearHyperlink(sheet, fCell);
// 移動元セル クリア
tCell.setCellType(Cell.CELL_TYPE_BLANK);
// スタイルのコピー
tCell.setCellStyle(fCell.getCellStyle());
+ // コメントのコピー
+ tCell.removeCellComment();
+ if(fCell.getCellComment() != null) {
+ tCell.setCellComment(fCell.getCellComment());
+ }
// 値
switch(fCell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
}
// ハイパーリンク 移動
moveHyperlink(sheet, fCell, tCell);
+ // 移動元セル コメントクリア
+ fCell.removeCellComment();
// 移動元セル クリア
fRow.removeCell(fCell);
}
}
}
}
+
+ /**
+ * セルのアドレス比較<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);
+ }
}