国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.net關(guān)于企業(yè)Excel報表的生成

2024-07-10 12:59:09
字體:
供稿:網(wǎng)友
在一般的企業(yè)應(yīng)用開發(fā)中都會涉及到報表的生成,且一般報表的格式都是生成excel格式的。對于各種報表的生成一直是程序員心中永遠的痛,因為對于很多程序員來說每寫一個報表都意味著要寫一大斷代碼來實現(xiàn),而且有的報表可能極其復雜以及不規(guī)范,這時就會浪費程序員大量的時間來編寫和調(diào)試這些代碼,那到底有沒有一種方法能使代碼盡量少寫,且又能實現(xiàn)各種excel報表的生成呢,下面我們就轉(zhuǎn)入正題。
我們要生成excel報表,其實我們只需要兩樣東西:
1.報表的樣式,也就是哪個字段應(yīng)該填在哪里,哪一列應(yīng)該填什么,字體大小,顏色,單元格高度,寬度,單元格是否合并,是否跨行,是否跨列,是橫向報表(所謂橫向報表,我自定義為:一張excel報表就是有一條記錄或者有一條記錄以及其關(guān)聯(lián)記錄而生成的報表,如一張訂單報表通常就是有一個訂單頭和其相關(guān)的訂單明細所生成,這個就是我自定義的橫向報表)還是縱向報表(所謂縱向報表,我自定義為:一張報表就是有一個記錄集所生成的,如要生成一張記錄某個班級學生情況的報表,則要把這個班級的學生記錄都要導出到這張報表中,這種報表基本上就是統(tǒng)計報表,一張報表可能會有幾萬條記錄或者更多,這個就是我自定義的縱向報表)等等報表樣式。
2.報表的數(shù)據(jù),對于我們而言有了報表樣式,我們就知道在哪個或者哪幾個單元格應(yīng)該填哪些數(shù)據(jù),具體的數(shù)據(jù),我們則可以以datatable的形式來表現(xiàn),也可以以dataset的形式來表現(xiàn),至于用怎么樣的數(shù)據(jù)格式可以隨自己喜歡,自己來定義。
現(xiàn)在我們知道了生成excel報表只要有了樣式和數(shù)據(jù),就可以生成一張自己想要的報表了,數(shù)據(jù)的生成并不困難,但是我們的困難就是這個報表的樣式用什么來描述,怎么來描述。

對于樣式的描述我們可以用兩種方法來實現(xiàn):
1.直接用xml來描述,這個xml描述文件的主要描述的內(nèi)容可以如下(舉個列子說明一下,現(xiàn)在描述的還不是很規(guī)范):
<?xml version="1.0" encoding="utf-8"?>
<style>
<excelstyle sort="縱向" space="1">
<ranges>
<rangestyle>
<range cellwidth="2.0" cellheight="20" cellbord="1" cellbackcolor=""></range>
<titlecell titlename="部件編號" titlestartxpos="1" titleendxpos="1" titlestartypos="1" titleendypos="1"></titlecell>
<datacell dataname="partno" datastartxpos="2" dataendxpos="14" datastartypos="34" dataendypos="34"ismerger="false" align="xlhalign.xlhalignleft" istoarray="true" isdatetime="false" interval="1">
</datacell>
<titlefont titlefontname="宋體" titlefontsize="9" titlefontcolor="black" titlefontbold="false" titlefontitatic="false" titlefontposition="center"> </titlefont>
<datafont datafontname="宋體" datafontsize="11" datafontcolor="black" datafontbold="true" datafontitatic="false" datafonthyperlink="false" datafontposition="center">
</datafont>
</rangestyle>
</ranges>
</excelstyle>
</style>
這個xml中結(jié)點excelstyle的屬性sort描述了整個excel的格式是縱向的還是橫向的(所謂縱向還是橫向,我上面已有所說明),而屬性space則描述了報表每個記錄的行與行之間空多少行。ranges則是下面的所有子節(jié)點rangestyle的父節(jié)點,對于一張報表通常會有很多的rangestyle結(jié)點。rangestyle其實就開始真正來描述哪個或哪些單元格來填寫哪些字段,如結(jié)點range 就定義了單元格高度,寬度,邊框?qū)挾龋伾@些屬性。titlecell就是定義了報表(因為我這張是縱向報表,所以有title)title的屬性,如title的名稱,哪個單元格來填寫這個名稱。節(jié)點datacell則定義了要幫定數(shù)據(jù)中的哪個字段,從哪個單元開始填寫,單元格是否要合并,對齊方式,還有這個字段行與行之間的間隔。結(jié)點title font定義了title字體屬性,如大小,顏色,是否斜體,是否粗體,對齊方式。結(jié)點datafont則定義了數(shù)據(jù)字體的屬性,如大小,顏色,是否斜體,是否粗體,對齊方式。一個rangestyle結(jié)點其實也就定義了一個字段的填寫,如果你的報表要填寫很多字段的話,就會有很多個rangestyle結(jié)點來描述。這個xml樣式定義文件可以自己寫個工具來生成,我有現(xiàn)成的自己寫的生成工具叫excelstyle,不過還很簡陋,用起來還不方便,不過能生成我需要的樣式,哪位需要我可以發(fā)給你們(我不知道怎么提供下載)。
2. xml描述文件和excel模板相結(jié)合的方法,對于有些報表會很復雜,特別是那些橫向的報表,有時候會極其復雜,這時就需要現(xiàn)成的excel模板,有了excel模板我們就可以參照著模板來生成xml樣式定義文件,在具體生成報表的時候,我們只要知道用到的excel模版是哪個,xml樣式文件是哪個,再綁上我們的數(shù)據(jù),那么即使再復雜的報表也同樣能簡單生成了。

具體使用,可參照如下測試用列代碼(聲明exceloperate,xmloperate是我自己寫的幾個通用的組件,如有需要我可發(fā)郵件給你們,其中數(shù)據(jù)我是以datatable的形式來描述的):

sing system;
using nunit.framework;
using exceloperate;
using xmloperate;
using system.data;
using system.data.sqlclient;

namespace testexcel
{
/// <summary>
/// </summary>
///
[testfixture]
public class excelexport
{
[test]
public void export()//不用excel模板的數(shù)據(jù)導出
{
string sql ="select top 100* from customers ";
//取出100條數(shù)據(jù)
excelfactory _factory = new excelfactory();
//定義一個沒有參數(shù)的excelfactory
_factory.createexcelwithouttemplate("c://bbbbbbb.xml",getdatatable(sql ));
//載入定義的樣式文件bbbbbbb.xml和剛?cè)〕鰜淼臄?shù)據(jù)getdatatable(sql )
_factory.saveexcel("c://bbbbbbbbbbbbbbbb.xls");
//保存導出的文件即可

}
[test]
public void exportwithtemplate()//用到了excel模版的數(shù)據(jù)導出
{
string sql ="select top 1* from customers ";
//取出一條數(shù)據(jù)
excelfactory _factory = new excelfactory("c://qstandardcustomer.xls");
//導入模版qstandardcustomer.xls
_factory.createexcel("c://qstandardcustomer.xml",getdatatable(sql ));
//載入定義的樣式文件qstandadrcustomer.xml和剛?cè)〕鰜淼臄?shù)據(jù)getdatatable(sql )

_factory.saveexcel("c://qreportstr.xls");
//最后保存導出的excel文件即可
}

private datatable getdatatable(string sql)
{
string myconnectionstring = "packet size=4096;user id=sa;data source=172.28.200.98;initial catalog=northwind";
sqlconnection myconnection = new sqlconnection(myconnectionstring);
myconnection.open();
sqldataadapter myadapter = new sqldataadapter();


sqlcommand mycommand = new sqlcommand(sql,myconnection);
mycommand.commandtype = commandtype.text;
myadapter.selectcommand = mycommand;
dataset ds = new dataset();
myadapter.fill(ds);
myconnection.close();
return ds.tables[0];
}
}
}

由上面代碼可見,一般的報表生成都是三句代碼,即使對于報表的某些行,某些格式要調(diào)整我們也不需要在去修改程序,只要改xml描述文件即可,這樣就可以使我們大大的在報表的生成上來節(jié)省時間,而可以把更多的時間放在業(yè)務(wù)邏輯的處理上了。

商業(yè)源碼熱門下載www.html.org.cn

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 花莲市| 勐海县| 昌吉市| 晋中市| 高密市| 砀山县| 河东区| 内丘县| 东莞市| 辛集市| 钟山县| 方山县| 开封县| 武邑县| 博湖县| 罗甸县| 上思县| 庆云县| 平远县| 余干县| 汽车| 罗甸县| 全椒县| 荥经县| 秭归县| 普兰店市| 贞丰县| 浙江省| 巍山| 崇仁县| 鹤壁市| 墨脱县| 海城市| 和平县| 双桥区| 澄江县| 华蓥市| 广州市| 封丘县| 沿河| 赤城县|