JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
己加入精華區
by koji at 2008-03-18 18:45
本主題所含的標籤
無標籤
作者 Excel 中(中文難字) 的處理 [精華]
jini

SoftLeader Taiwan

版主

發文: 1266
積分: 23
於 2008-03-18 13:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
附件中, 主要有幾個字

大輔

游錫

那幾個字, 我採用 POI 或是 JExcel API 外加 Jacob 呼叫 Excel.Application 存取出來, 都是 問號

1. 有關 System property , file.encoding

我設定 UTF-8, UTF8 都失敗.. 放棄

2. 有關 jexcel api 應該會用到 jxl.read.biff.SSTRecord
主要有問題的應該是 readStrings method, 他傳入的 offset = 8,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  /**
   * Reads in all the strings from the raw data
   *
   * @param data the raw data
   * @param offset the offset
   * @param ws the workbook settings
   */
  private void readStrings(byte[] data, int offset, WorkbookSettings ws)
  {
    int pos = offset;
    int numChars;
    byte optionFlags;
    String s = null;
    boolean asciiEncoding = false;
    boolean richString = false;
    boolean extendedString = false;
    int formattingRuns = 0;
    int extendedRunLength = 0;
 
    for (int i = 0; i < uniqueStrings; i++)
    {
      // Read in the number of characters
      numChars = IntegerHelper.getInt(data[pos], data[pos + 1]);
      pos += 2;
      optionFlags = data[pos];
      pos++;
 
      // See if it is an extended string
      extendedString = ((optionFlags & 0x04) != 0);
 
      // See if string contains formatting information
      richString = ((optionFlags & 0x08) != 0);
 
      if (richString)
      {
        // Read in the crun
        formattingRuns = IntegerHelper.getInt(data[pos], data[pos + 1]);
        pos += 2;
      }
 
      if (extendedString)
      {
        // Read in cchExtRst
        extendedRunLength = IntegerHelper.getInt
          (data[pos], data[pos + 1], data[pos + 2], data[pos + 3]);
        pos += 4;
      }
 
      // See if string is ASCII (compressed) or unicode
      asciiEncoding = ((optionFlags & 0x01) == 0);
 
      ByteArrayHolder bah = new ByteArrayHolder();
      BooleanHolder   bh = new BooleanHolder();
      bh.value = asciiEncoding;
      pos += getChars(data, bah, pos, bh, numChars);
      asciiEncoding = bh.value;
 
      if (asciiEncoding)
      {
        s = StringHelper.getString(bah.bytes, numChars, 0, ws);
      }
      else
      {
        s = StringHelper.getUnicodeString(bah.bytes, numChars, 0);
      }
 
      strings[i] = s;
 
      // For rich strings, skip over the formatting runs
      if (richString)
      {
        pos += 4 * formattingRuns;
      }
 
      // For extended strings, skip over the extended string data
      if (extendedString)
      {
        pos += extendedRunLength;
      }
 
      if (pos > data.length)
      {
        Assert.verify(false, "pos exceeds record length");
      }
    }
  }


我想問的是, 我該怎麼判斷那些難字的 header code 而進行判斷與處理呢 ? 還是沒有辦法哩 @@"

sample.xls (13.5k)


reply to postreply to post
作者 Re:Excel 中(中文難字) 的處理 [Re:jini]
koji

秒速5センチメートル

站長

發文: 8415
積分: 19
於 2008-03-18 15:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
會不會是java中印不出來?
實際debug mode下應該看的到字這樣?

koji


reply to postreply to post
JCConf Taiwan 2015 開始售票了!!
Facebook上的TWJUG社團,歡迎加入
作者 Re:Excel 中(中文難字) 的處理 [Re:jini]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2008-03-18 16:08 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jini wrote:
附件中, 主要有幾個字

大輔

游錫

那幾個字, 我採用 POI 或是 JExcel API 外加 Jacob 呼叫 Excel.Application 存取出來, 都是 問號

1. 有關 System property , file.encoding

我設定 UTF-8, UTF8 都失敗.. 放棄

2. 有關 jexcel api 應該會用到 jxl.read.biff.SSTRecord
主要有問題的應該是 readStrings method, 他傳入的 offset = 8,


我使用 POI-3.0.2-final 試了一下你的附件,是可以正確讀出文件中的文字。
你看到的問號如果是指在 console 看見的,那只是這些字無法以 Big5/MS950 編碼來 encode 而以 ? 取代。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:Excel 中(中文難字) 的處理 [Re:Duncan]
jini

SoftLeader Taiwan

版主

發文: 1266
積分: 23
於 2008-03-18 16:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感恩, 我的確是在 Debug Console 無法看到正確的中文
另外, 將資料庫欄位 ( MS-SQL ) 設定為 nvarchar 即可

感謝 koji 及 duncan 的指導

BTW, 我有辦法何修改 console ( Eclipse ) 的 encoding 為 UTF-8 嗎, 這樣的確造成我測試上的誤會


reply to postreply to post
作者 Re:Excel 中(中文難字) 的處理 [Re:jini]
ryanpai





發文: 47
積分: 0
於 2008-03-18 16:47 user profilesend a private message to usersend email to ryanpaireply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jxl...

1
2
3
4
5
6
7
8
9
10
11
12
Workbook workbook = Workbook.getWorkbook(new File("D:\\sample.xls"));
Sheet sheet = workbook.getSheet(0);
Cell fcell;
fcell = sheet.getCell(0, 0);
String str = fcell.getContents();
 
// To UTF-8 external txt (記事本打開ok)...另存ASCII又變亂碼
String filename = "D:\\test.txt";
byte data[] = str.getBytes("UTF-8");
FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.close();


reply to postreply to post
Ryan Pai
作者 Re:Excel 中(中文難字) 的處理 [Re:jini]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2008-03-18 17:09 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jini wrote:
感恩, 我的確是在 Debug Console 無法看到正確的中文
另外, 將資料庫欄位 ( MS-SQL ) 設定為 nvarchar 即可

感謝 koji 及 duncan 的指導

BTW, 我有辦法何修改 console ( Eclipse ) 的 encoding 為 UTF-8 嗎, 這樣的確造成我測試上的誤會


如果你是使用 Eclipse debug run,可以在 [open debug dialog] 裡找到你的應用對應的 configuration 設定,在 [Common] 分頁可以設定 console encoding。

不過我試了一下,感覺上這部分 Eclipse 沒有整合好,你如果只變更 condole encoding 為 UTF-8,那麼你的程式輸出不見得會正確,因為如果你的程式執行時的 system encoding 為 Big5,那麼你透過 stdout/stderr 輸出的文字都會以 Big5 編碼過,而 Eclipse console 會以 UTF-8 來 decode Java 程式的輸出,所以在 console view 還是會顯示錯誤的文字(會比把 console encoding 設定成 MS950 更糟)。

我本來以為設定 console encoding 後,Eclipse debug run 應該會 patch 適當的 stdout/stderr 來擷取 output,但是測試結果顯示不是這個情況。

如果你把 console encoding 設定為 UTF-8,那麼你必須要確保你的 Java 應用在執行時, JRE 的預設 encoding 是 UTF-8,否則你必須自行在程式一執行時先 patch stdout/stderr。
1
2
System.setOut(new PrintStream(System.out, true, "UTF-8"));
System.setErr(new PrintStream(System.err, true, "UTF-8"));


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:Excel 中(中文難字) 的處理 [Re:ryanpai]
jini

SoftLeader Taiwan

版主

發文: 1266
積分: 23
於 2008-03-18 18:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ryanpai wrote:
jxl...

1
2
3
4
5
6
7
8
9
10
11
12
Workbook workbook = Workbook.getWorkbook(new File("D:\\sample.xls"));
Sheet sheet = workbook.getSheet(0);
Cell fcell;
fcell = sheet.getCell(0, 0);
String str = fcell.getContents();
 
// To UTF-8 external txt (記事本打開ok)...另存ASCII又變亂碼
String filename = "D:\\test.txt";
byte data[] = str.getBytes("UTF-8");
FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.close();



jxl 是可以的, 只是需要設定 System.setProperty("jxl.encoding", "UTF-8") 或是 System.setProerperty("file.encoding", "UTF-8"); 即可


reply to postreply to post
» JWorld@TW »  Java SE 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8