Jakarta POIで日本語シート名を読む方法

注) byte列の文字列化で、UTF-16LE(リトルエンディアン)を使っているので、環境依存しそうです...
モノによっては、UTF-16BE(ビッグエンディアン)でうまく動くのかも。

- 手順 -

  1. POIのソース版を拾ってくる (jakarta-poi-1.5.1-final-src.zip)
  2. 1.のアーカイブを展開する
  3. POIのCVSリポジトリから、以下のファイルを取得し、2)で展開したファイルと置き換える
    ・org.apache.poi.hssf.record.BoundSheetRecord.java
    ・org.apache.poi.util.StringUtil.java
  4. StringUtilクラスに、以下のメソッドを追加する。
    public static String getUncompressedUnicode(final byte[] string,
    	            final int offset, final int len)
    	             throws ArrayIndexOutOfBoundsException, IllegalArgumentException, UnsupportedEncodingException {
    	        if ((offset < 0) || (offset >= string.length)) {
    	            throw new ArrayIndexOutOfBoundsException("Illegal offset");
    	        }
    	        if ((len < 0) || (((string.length - offset) / 2) < len)) {
    	            throw new IllegalArgumentException("Illegal length");
    	        }
    
    	        byte[] bstring = new byte[len * 2];
    	        int index = offset;
    	        // start with high bits.
    
    	        for (int k = 0; k < (len * 2); k++) {
    	        	System.out.println("val: " + string[k]);
    	            bstring[k] = string[index];
    	            index++;
    	        }
    
    	        return new String(bstring, "UTF-16LE");
    	    }
  5. BoundSheetRecord.javaの143行目を、以下のように変更する。
    - field_5_sheetname = StringUtil.getFromUnicodeHigh( data, 8 + offset, nameLength );
    + field_5_sheetname = StringUtil.getUncompressedUnicode( data, 8 + offset, nameLength );
  6. 2.で展開したルートにあるbuild.batを実行し、プロンプトが出たら「jar」を入力し、Enterを押す。
  7. buildフォルダ内に、jakarta-poi-1.5.1-final-<作成日付>.jarが作成される。

- 結果 -

-- Sheet1 --
日本語文字
character
123.0
123.0
character
日本語文字
ddd
...
-- 日本語シート名 --
日本語文字
character
123.0
123.0
character
日本語文字

2002/08/07作成