C#從實(shí)體對(duì)象集合中導(dǎo)出Excel的代碼
更新時(shí)間:2008年08月26日 08:46:04 作者:
數(shù)據(jù)的導(dǎo)出是項(xiàng)目中經(jīng)常要實(shí)現(xiàn)的功能,就拿最常見(jiàn)的要導(dǎo)出成Excel來(lái)說(shuō),網(wǎng)上看來(lái)看去,都是介紹從Datatable中導(dǎo)出
或是將Datagrid或是Gridview的輸出導(dǎo)出,實(shí)現(xiàn)大體上又分為調(diào)用COM+組件或是利用Response(當(dāng)然是B/S架構(gòu)的項(xiàng)目)的輸出來(lái)做,COM+組件的方式以前在項(xiàng)目中也應(yīng)用過(guò),但說(shuō)實(shí)話感覺(jué)效果并不好,一是布署很麻煩,二是當(dāng)時(shí)記得好像WEB服務(wù)器端的有個(gè)進(jìn)程老關(guān)不掉,并且還有個(gè)問(wèn)題是服務(wù)器端安裝的EXCEL版本的不同,在程序中調(diào)用的方法傳入的參數(shù)個(gè)數(shù)都不相同,真是夠郁悶的,但是好處是這種方式當(dāng)然是最靈活的。
我們還是以一個(gè)B/S架構(gòu)的項(xiàng)目應(yīng)用來(lái)說(shuō)說(shuō)導(dǎo)出吧,通用一點(diǎn)兒的還是從數(shù)據(jù)集往外導(dǎo)出吧,畢竟將Gridview的輸出導(dǎo)出來(lái)這種方式個(gè)人感覺(jué)適用性不高,因?yàn)榇蟛糠智闆r我們的頁(yè)面中的運(yùn)用Gridview都是要牽扯分頁(yè)的,我們還是直接來(lái)做從數(shù)據(jù)集往外導(dǎo)吧,從DataTable往外導(dǎo)網(wǎng)上很多現(xiàn)成的,但是運(yùn)用在一個(gè)嚴(yán)格分層架構(gòu)的項(xiàng)目中,還是會(huì)有些不爽的,假如我們嚴(yán)格要求我們的項(xiàng)目是標(biāo)準(zhǔn)的三層架構(gòu),我們層與層之間傳遞的是我們的實(shí)體對(duì)象,我們不傳遞DataTable這種弱類(lèi)型的東東,那我們導(dǎo)出的數(shù)據(jù)源就只能是實(shí)體對(duì)象集合了,于是,我們需要寫(xiě)一個(gè)以實(shí)體對(duì)象為數(shù)據(jù)源的導(dǎo)出方法,感覺(jué)還是不太完美,比如在參數(shù)中“導(dǎo)出列信息”參數(shù)的設(shè)計(jì),感覺(jué)還有更好的方式,呵呵,以后有空再想吧!
貼出我的實(shí)現(xiàn),大家也幫忙看看!
/// <summary>
/// 將一組對(duì)象導(dǎo)出成EXCEL
/// </summary>
/// <typeparam name="T">要導(dǎo)出對(duì)象的類(lèi)型</typeparam>
/// <param name="objList">一組對(duì)象</param>
/// <param name="FileName">導(dǎo)出后的文件名</param>
/// <param name="columnInfo">列名信息</param>
public static void ExExcel<T>(List<T> objList, string FileName, Dictionary<string, string> columnInfo)
{
if (columnInfo.Count == 0) { return; }
if (objList.Count == 0) { return; }
//生成EXCEL的HTML
string excelStr = "";
Type myType = objList[0].GetType();
//根據(jù)反射從傳遞進(jìn)來(lái)的屬性名信息得到要顯示的屬性
List<PropertyInfo> myPro = new List<PropertyInfo>();
foreach (string cName in columnInfo.Keys)
{
PropertyInfo p = myType.GetProperty(cName);
if (p != null)
{
myPro.Add(p);
excelStr += columnInfo[cName] + "\t";
}
}
//如果沒(méi)有找到可用的屬性則結(jié)束
if (myPro.Count == 0) { return; }
excelStr += "\n";
foreach (T obj in objList)
{
foreach (PropertyInfo p in myPro)
{
excelStr += p.GetValue(obj, null)+"\t";
}
excelStr += "\n";
}
//輸出EXCEL
HttpResponse rs = System.Web.HttpContext.Current.Response;
rs.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
rs.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
rs.ContentType = "application/ms-excel";
rs.Write(excelStr);
rs.End();
}
我們還是以一個(gè)B/S架構(gòu)的項(xiàng)目應(yīng)用來(lái)說(shuō)說(shuō)導(dǎo)出吧,通用一點(diǎn)兒的還是從數(shù)據(jù)集往外導(dǎo)出吧,畢竟將Gridview的輸出導(dǎo)出來(lái)這種方式個(gè)人感覺(jué)適用性不高,因?yàn)榇蟛糠智闆r我們的頁(yè)面中的運(yùn)用Gridview都是要牽扯分頁(yè)的,我們還是直接來(lái)做從數(shù)據(jù)集往外導(dǎo)吧,從DataTable往外導(dǎo)網(wǎng)上很多現(xiàn)成的,但是運(yùn)用在一個(gè)嚴(yán)格分層架構(gòu)的項(xiàng)目中,還是會(huì)有些不爽的,假如我們嚴(yán)格要求我們的項(xiàng)目是標(biāo)準(zhǔn)的三層架構(gòu),我們層與層之間傳遞的是我們的實(shí)體對(duì)象,我們不傳遞DataTable這種弱類(lèi)型的東東,那我們導(dǎo)出的數(shù)據(jù)源就只能是實(shí)體對(duì)象集合了,于是,我們需要寫(xiě)一個(gè)以實(shí)體對(duì)象為數(shù)據(jù)源的導(dǎo)出方法,感覺(jué)還是不太完美,比如在參數(shù)中“導(dǎo)出列信息”參數(shù)的設(shè)計(jì),感覺(jué)還有更好的方式,呵呵,以后有空再想吧!
貼出我的實(shí)現(xiàn),大家也幫忙看看!
復(fù)制代碼 代碼如下:
/// <summary>
/// 將一組對(duì)象導(dǎo)出成EXCEL
/// </summary>
/// <typeparam name="T">要導(dǎo)出對(duì)象的類(lèi)型</typeparam>
/// <param name="objList">一組對(duì)象</param>
/// <param name="FileName">導(dǎo)出后的文件名</param>
/// <param name="columnInfo">列名信息</param>
public static void ExExcel<T>(List<T> objList, string FileName, Dictionary<string, string> columnInfo)
{
if (columnInfo.Count == 0) { return; }
if (objList.Count == 0) { return; }
//生成EXCEL的HTML
string excelStr = "";
Type myType = objList[0].GetType();
//根據(jù)反射從傳遞進(jìn)來(lái)的屬性名信息得到要顯示的屬性
List<PropertyInfo> myPro = new List<PropertyInfo>();
foreach (string cName in columnInfo.Keys)
{
PropertyInfo p = myType.GetProperty(cName);
if (p != null)
{
myPro.Add(p);
excelStr += columnInfo[cName] + "\t";
}
}
//如果沒(méi)有找到可用的屬性則結(jié)束
if (myPro.Count == 0) { return; }
excelStr += "\n";
foreach (T obj in objList)
{
foreach (PropertyInfo p in myPro)
{
excelStr += p.GetValue(obj, null)+"\t";
}
excelStr += "\n";
}
//輸出EXCEL
HttpResponse rs = System.Web.HttpContext.Current.Response;
rs.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
rs.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
rs.ContentType = "application/ms-excel";
rs.Write(excelStr);
rs.End();
}
您可能感興趣的文章:
- C#基于NPOI生成具有精確列寬行高的Excel文件的方法
- c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
- ASP.NET(C#)讀取Excel的文件內(nèi)容
- C#如何將DataTable導(dǎo)出到Excel解決方案
- C#數(shù)據(jù)導(dǎo)入/導(dǎo)出Excel文件及winForm導(dǎo)出Execl總結(jié)
- C#將html table 導(dǎo)出成excel實(shí)例
- C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實(shí)例
- C#操作Excel數(shù)據(jù)增刪改查示例
- c#讀寫(xiě)excel文件使用示例
- C#導(dǎo)出生成excel文件的方法小結(jié)(xml,html方式)
- C#控制Excel Sheet使其自適應(yīng)頁(yè)寬與列寬的方法
相關(guān)文章
C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類(lèi)的方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類(lèi)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2018-04-04C# Char結(jié)構(gòu)中IsLetterOrDigit(Char)的方法詳解
這篇文章給大家介紹了C#的Char 結(jié)構(gòu)的IsLetterOrDigit(Char)的方法,并通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02Winform控件Picture實(shí)現(xiàn)圖片拖拽顯示效果
這篇文章主要為大家詳細(xì)介紹了Winform控件Picture實(shí)現(xiàn)圖片拖拽顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例
這篇文章主要介紹了C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁(yè)授權(quán)操作的原理、步驟并給出了C#實(shí)現(xiàn)的網(wǎng)頁(yè)授權(quán)操作邏輯封裝類(lèi),需要的朋友可以參考下2016-10-10C#實(shí)現(xiàn)延時(shí)并自動(dòng)關(guān)閉MessageBox的方法
這篇文章主要介紹了C#實(shí)現(xiàn)延時(shí)并自動(dòng)關(guān)閉MessageBox的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08詳解C#打開(kāi)和關(guān)閉可執(zhí)行文件
這篇文章主要介紹了C#打開(kāi)和關(guān)閉可執(zhí)行文件,以QQ應(yīng)用程序?yàn)槔?,需要的朋友可以參考?/div> 2015-12-12最新評(píng)論