依據SZW朋友的提醒:本文所說的Excel檔案指.xls檔案,不包括Excel2007的預設儲存文檔格式.
大量資料匯出到Excel檔案,一般情況有以下三個麻煩:
1.匯出的執行速度要比較快,否則有http請求逾時的問題;
當然如果您是使用winForm方式就不在此列。
2.Excel檔案有最多65535行資料的限制;
3.數字會有格式變成指數方式的麻煩;
比如社會安全號碼碼,以數字方式儲存後,資訊末幾位有丟失的情況。
解決思路:
1.使用oledb,把excel檔案當作資料庫處理,效率相對其他五花八門的匯出方案來說,算比較高的。雖然不是最高的,但得到的excel檔案是真正的二進位Excel檔案,如果使用者好要把匯出的資料整理後導回到系統,那麼恭喜了,這種方法是你最好的選擇。
2.每個sheet最多最多65535行資料,但一個檔案可以有很多個sheet檔案,如果您要匯出的資料超過65535個,那麼需要設法把多餘的資料放到第二、三....個sheet中去。
3.一個sheet我們可以看作是一個資料庫的表,那麼我們是不是可以通過定義表的欄位的資料屬性來保證資料的正確格式呢?
關鍵代碼:
備忘:完整的代碼是偶寫的工程代碼,著作權的。但大家可以根據我的思路和關鍵代碼的提示自己完成想要的功能,呵呵
程式碼片段一 sheet建立://產生建立表的指令碼
StringBuilder sb = new StringBuilder();
sb.Append("CREATE TABLE ");
sb.Append("[" + tableName + "] ( ");
for (int i = 0; i < headers.Length; i++)
{
string datatype;
switch (dt.Columns[columns[i]].DataType.Name.ToLower())
{
case "float": datatype = "float"; break;
case "int32": datatype = "int"; break;
case "double": datatype = "double"; break;
case "decimal": datatype = "float"; break;
default: datatype = "text"; break;
}
if (i < headers.Length - 1)
{
sb.Append(string.Format("[{0}] {1},", headers[i], datatype));
}
else
{
sb.Append(string.Format("[{0}] {1})", headers[i], datatype));
}
}
return sb.ToString();
大家看到了把,我們可以使用create語句建立sheet。我們使用的表的名稱,將變成sheet名稱。
建議大家匯出的名稱可以這樣依次起:比如產品資訊資料,表名可以分別叫 產品資訊(第1頁)、產品資訊(第2頁)等等。
程式碼片段二 按照需要自動建立多個sheet:for (int i = 0; i < dt.Rows.Count; i++)
{
//建立sheet
if (i % 65535 == 0)
{
tableName = string.Format("{0}Page{1}", dt.TableName, (i / 65535) + 1);
objCmd.CommandText = GetCreateSheetSQL(dt, headers, columns, tableName);
objCmd.ExecuteNonQuery();
}
插入語句#region 插入語句
sb.Append("INSERT INTO ");
sb.Append("[" + tableName + "] ( ");
.
最後提醒大家:excel作為資料庫的時候,是可以支援交易處理的哦,大家別忘了使用事務機制。
如果大家處理的資料量比較小,要求的格式非常複雜,比如多重表頭,有統計圖形等,那麼請使用其他的excel匯出方法。本解決方案適用範圍前面已經說過了,請大家參考。
http://piedpiper.cnblogs.com
本文是偶原創,想轉貼的朋友勞駕寫明轉貼二字。呵呵