unicorn.net

我的連結

Blog Stats

每月文章

隨筆分類

影像集

.net

blog

forum

friends

jQuery

open source

tools

web

修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題

Koogra 一套讀取Excel 的類別庫,雖然作者很久沒更新了,但它簡單好用讀取快速,是我讀取excel時最佳選擇,但今天碰到了一個問題,當 sheet's name 用中文命名時,用程式讀取sheet's name會變亂碼,還好他是開放原始碼,花了點時間看看,做了底下修改,至於為什麼我知道這樣改?  我是參考 MyXls 的原始碼,是另一套還在持續發展中有點bug但同時可寫/讀excel檔的類別庫。

 

將 \Excel\Records\BoundSheetRecord.cs 34~38行

ushort nameLen = reader.ReadUInt16();
StringBuilder nb = new StringBuilder(nameLen);
nb.Append(new string(reader.ReadChars(nameLen)));

_name = nb.ToString();

 

改成

 

ushort nameLen = (ushort)reader.ReadByte();
bool compressed = (reader.ReadByte() * 0x01) == 0;

if (!compressed) {
    nameLen *= 2;
}

byte[] charBytes = reader.ReadBytes(nameLen);

if (compressed) {
    //decompress
    byte[] wideBytes = new byte[charBytes.Length * 2];
    for (int i = 0; i < charBytes.Length; i++)
        wideBytes[2 * i] = charBytes[i];
    charBytes = wideBytes;
}

_name = new string(Encoding.Unicode.GetChars(charBytes));

posted on Friday, April 04, 2008 3:32 AM

Feedback

# re: 修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題 6/11/2008 12:58 PM unicorn

part 2:修改日期欄位的格式字串值

讀取 excel 裏的日期資料,譬如 2007/3/5
用cell.FormattedValue() 會取得字串 "3/5/07"
那通常不是我想要的,所以我修改了原本的 Cell.cs
public string FormattedValue() {
...
...
// get the format string
string formatString = format.FormatValue;
+if (formatString == "M/D/YY") {
+ formatString = "yyyy/MM/dd";
+}
...
...
}

# re: 修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題 6/11/2008 1:07 PM unicorn

順手再為 cell.cs 加一隻取日期value的 method
public DateTime? DateTimeValue() {
if (this.Value is double) {
return new DateTime(1899, 12, 30).AddDays((double)this.Value);
}
return null;
}

# re: 修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題 11/15/2008 9:06 AM seven.shi

koogra读取Excel中的图片仍然是null。我想添加ImageRecord.但是new CompoudFile()的stream的怎么读取Excel的呢?请教:

# re: 修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題 11/15/2008 10:55 AM unicorn

抱歉 沒研究喔

# 无依赖Office资源的导入导出 11/28/2008 2:10 PM 林子

最近在?注Excel?入?出的??,乍看起??是非常Easy的事情,但仔?想想以前几?做法,各有各的??和弊端! 1。B/S方式下直接?出 2。?用ExcelCOM?件 上面的种种弊端就不再多...

# 转 无依赖Office资源的导入导出 2/6/2009 8:57 AM 小K

最近在?注Excel?入?出的??,乍看起??是非常Easy的事情,但仔?想想以前几?做法,各有各的??和弊端! 1。B/S方式下直接?出 2。?用ExcelCOM?件 上面的种种弊端就不再多...

# re: 修正 Koogra 讀取 Sheet Name ,如果是中文會變亂碼的問題 3/12/2009 10:06 AM W. Jordan

上面讀取中文SheetName的代碼可稍微簡化一點,改成這樣就可以了。

ushort nameLen = (ushort)reader.ReadByte ();
bool ascii = (reader.ReadByte () * 0x01) == 0;

if (!ascii) {
nameLen *= 2;
}

byte[] name = reader.ReadBytes (nameLen);

_name = ascii ? Encoding.ASCII.GetString (name) : Encoding.Unicode.GetString (name);

# 转 无依赖Office资源的导入导出 12/10/2009 8:54 AM 自由泳

?自:http://www.cnblogs.com/yamajia/archive/2009/02/06/1385032.html

Title  
Name  
Url
驗證碼  
Comments