牢騷:今天又是一個不太平的日子,打開任務表一看里面有一堆bug,其中有一個就是今天要說的這個關於商品導出的問題,本功能是臨時授命接一個任務,本來呢這個導出功能在系統各大模塊已經都很成熟了,但是總有一個問題:導出來的excel表格不是真正的.xls格式的文件所以呢就造成了一個后果,那就是將導出來的列表修改內容或者不修改保存后再導入到系統里面就會出現格式不正確的報錯現象,原因很簡單:導出時通過接口查詢出所需要的數據模型,然后將這個model循環遍歷到html頁面里,最終通過System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition","attachent;fileName=" + "商品批量編輯列表.xls"); System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel";
通過這樣的操作可以將列表導出到excel里面,問題來了,其實我們導出的是什么格式?並不是真正的excel格式,而是普通的HTML格式,只不過excel支持html的格式的數據而已,所以在導入的時候Npoi插件調用解析表格的方法時,就會報錯。好吧!!!!說了這么多也沒有說到今天的重點,正因為有這個問題所以本人就對這個問題進行了優化,優化的方法就是使用NPOI創建工作簿,再創建工作表,再對表格進行修改樣式(主要是樣式做起來實在是太讓人頭疼了),再把數據填寫到表里面這樣再將數據導出來,當然這樣操作就會解決之前說的問題,接着導入也會導入到系統里面,原因很簡單因為我導出的是真正的表格嘛,所以也自然解析會通過,現在的問題是,用火狐瀏覽器導出時出現了問題,導出的文件名真是讓人頭大,顯示的竟然是加密后的亂碼,讓處於興奮狀態的我立刻就nie了。算了這就是亂碼瀏覽器不兼容的問題,頓時就覺得應該好好整頓這個瀏覽器市場了,不要在這么干下去了對大伙都不好,算了我說的不算。好下面就將解決代碼跟大家分享一下吧,這個代碼不僅解決了上述問題而且還有可能治愈精神疾病,因為它把我從崩潰的邊緣拉了回來,廢話不多說看真經:
string sFileName = "XXXXXX.xls";
if (baseContext.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
{
sFileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sFileName)) + "?=";
}
else
{
sFileName = System.Web.HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8);
sFileName = sFileName.Replace("+", "%20");
}
baseContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName);
baseContext.Response.AddHeader("Content-Length", ms.Length.ToString());
baseContext.Response.AddHeader("Content-Transfer-Encoding", "binary");
baseContext.Response.ContentType = "application/octet-stream;charset=utf-8";
baseContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
baseContext.Response.BinaryWrite(ms.ToArray());
Ps: 當代碼復用時注意根據實際情況添加。或多或少的進行改進。