そのアドレスから、さらにシート名だけをとりだしたい。
2015/12/29
java
poi
javaです。
poiでエクセル操作です。
セルにハイパーリンクでドキュメント内にあるリンクをはり、それをpoiを使って取得するのですが、その参照の形式は、シート名!A1という感じのものになります。
これがエクセル内での特殊文字?とか使われると'シート名!!'!A1という感じになります(ここではシート名に!をあえて含めています)。
参照(アドレス)の取得の仕方は、
Cell::getHyperlink()でHyperlinkをとりだして、さらにそこからHyperlink::getAddress()で、文字列表現をとりだします。
そのアドレスから、さらにシート名だけをとりだしたい。
poiでエクセル操作です。
セルにハイパーリンクでドキュメント内にあるリンクをはり、それをpoiを使って取得するのですが、その参照の形式は、シート名!A1という感じのものになります。
これがエクセル内での特殊文字?とか使われると'シート名!!'!A1という感じになります(ここではシート名に!をあえて含めています)。
参照(アドレス)の取得の仕方は、
Cell::getHyperlink()でHyperlinkをとりだして、さらにそこからHyperlink::getAddress()で、文字列表現をとりだします。
そのアドレスから、さらにシート名だけをとりだしたい。
poiのコードをのぞいていますと、
org.apache.poi.ss.util.CellReferenceにあるparseSheetNameでやっているようです。
ちなみにバージョンは、バージョン3.10.1です。
現時点でのコードをみるとTODOがコメントに書いてあって、どうもこの似たような処理を、あちらこちらでやっているようで、それをリファクタリングしたいようです。
簡単にシート名をとりだすためのユーティリティメソッドを書いてみました。
以下、コード
public static String parseSheetName(String reference) {
final char QUOTE = '\'';
StringBuilder sb = new StringBuilder();
int startPos = 0;
if (reference.charAt(0) == QUOTE) {
startPos = 1;
}
for (int i = startPos; i < reference.length(); i++) {
char c = reference.charAt(i);
if (QUOTE == c) {
break;
}
if (1 != startPos && '!' == c) {
break;
}
sb.append(c);
}
return sb.toString();
}
: