管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔_第1頁(yè)
管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔_第2頁(yè)
管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔_第3頁(yè)
管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔_第4頁(yè)
管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

管理信息化BI商務(wù)智能birt開(kāi)發(fā)文檔Birt開(kāi)發(fā)文檔目錄一.前言2二.開(kāi)發(fā)環(huán)境安裝3三.報(bào)表分類31.清單表42.固定格子表43.交叉表44.Chart圖表4四.報(bào)表開(kāi)發(fā)51.清單表62.固定格子表173.交叉表184.Chart圖表22五.報(bào)表的參數(shù)使用261.Combobox262.Radiobutton273.List27六.報(bào)表的級(jí)聯(lián)參數(shù)的使用29七.模板及自定義js321.樣式模板332.自定義js文件35八.報(bào)表中script的使用381.在script中對(duì)sql的控制382.報(bào)表中script的控制42(1).隔行換色42(2).鼠標(biāo)高亮44(3).birt所提供常用的script方法46九.項(xiàng)目開(kāi)發(fā)中整合birt511.Struts2整合問(wèn)題522.實(shí)現(xiàn)報(bào)表的數(shù)據(jù)權(quán)限的控制58十.Birt的擴(kuò)展611.Birt的頁(yè)面樣式62(1).修改bobox頁(yè)面63(2).修改textbox頁(yè)面70(3).按鈕樣式的修改752.Birt國(guó)際化75十一.Birt的使用小技巧771.報(bào)表的返回792.報(bào)表的參數(shù)默認(rèn)值80(1).日?qǐng)?bào)返回系統(tǒng)前一天的8位日期80(2).月報(bào)返回系統(tǒng)上個(gè)月末8位日期823.報(bào)表的配置844.報(bào)表參數(shù)的頁(yè)面開(kāi)發(fā)85(1).參數(shù)的傳遞方式85(2).birt標(biāo)簽的使用87①.view標(biāo)簽87②.report標(biāo)簽89③.param標(biāo)簽90④.parameterPage標(biāo)簽90⑤.paramDef標(biāo)簽92一.前言BIRT(BusinessIntelligenceandReportingTools),是為Web應(yīng)用程序開(kāi)發(fā)的基于EclipseJava和J2EE為基礎(chǔ)。BIRTEclipse的報(bào)表設(shè)計(jì)器,以及部署到應(yīng)用服務(wù)器上的運(yùn)行時(shí)組件。Birt有以下幾點(diǎn)優(yōu)點(diǎn):1、開(kāi)發(fā)方便,Birt是Eclipse的一個(gè)插件可以很好的集成在Eclipse中,圖形編輯框架下可以在幾分鐘之內(nèi)做出一個(gè)報(bào)表。2、可以很方便地在一個(gè)報(bào)表中混合展現(xiàn)概要數(shù)據(jù)和詳細(xì)數(shù)據(jù)。3、操作界面友好大方。4、提供了強(qiáng)大靈活的樣式定義,對(duì)于熟悉CSS的設(shè)計(jì)人員來(lái)說(shuō),應(yīng)該可以設(shè)計(jì)出相當(dāng)出色的報(bào)表樣式。5、集成在Eclipse中,不用再開(kāi)啟別報(bào)表開(kāi)發(fā)工具窗口,對(duì)于習(xí)慣于Eclipse開(kāi)發(fā)的程序員來(lái)說(shuō)這點(diǎn)非常重要。6、Birt的本地化做的很好,安裝以后操作界面就是中文的(這點(diǎn)我在使用過(guò)程中沒(méi)有充分體現(xiàn),我使用了Birt的中文語(yǔ)言包)。7、開(kāi)源的報(bào)表產(chǎn)品,有源代碼,可以進(jìn)行深層的定制開(kāi)發(fā)。8、生成的報(bào)表完全是XML格式,擴(kuò)展性好。9、容易和應(yīng)用系統(tǒng)結(jié)合。10、最重要一點(diǎn)是開(kāi)源免費(fèi)的。二.開(kāi)發(fā)環(huán)境安裝目前最新的birt版本是2.6,為了方便使用可以直接下載安裝Myeclipse9.0,已經(jīng)集成好的birt插件,安裝好之后可以直接進(jìn)行birt2.6需要有JDK1.6的支持。另一種開(kāi)發(fā)birt的環(huán)境birt-report-designer-all-in-one是官網(wǎng)所提供的類似于eclipse操作界面的環(huán)境,還提供了一個(gè)birt運(yùn)行的一個(gè)平臺(tái)Birt-runtime類似于tomcat在tomcat服務(wù)器上運(yùn)行。三.報(bào)表分類所有報(bào)表大致分為四類:清單表、固定格子表、交叉表、chart圖表1.清單表sql語(yǔ)句直接進(jìn)行展現(xiàn),數(shù)據(jù)會(huì)自動(dòng)的向下延展。2.固定格子表于字段數(shù)據(jù)過(guò)多的情況出表的效率還是有點(diǎn)低,不方便維護(hù)。3.交叉表度大大的提高了,對(duì)于補(bǔ)錄數(shù)據(jù)也提供了方便。4.chart圖表所謂chart圖表旁邊再配上數(shù)據(jù)表分析起來(lái)就更為了直觀了。而birt所提供的十余種圖表技術(shù),給用戶提供了大量的空間進(jìn)行開(kāi)發(fā)。四.報(bào)表開(kāi)發(fā)對(duì)于在團(tuán)隊(duì)中進(jìn)行項(xiàng)目的開(kāi)發(fā)時(shí)候?yàn)榱丝紤]后期的維護(hù)和開(kāi)發(fā)Library公共數(shù)據(jù)源以及樣式模板和自定義javascript文件的導(dǎo)入:首先定義公共數(shù)據(jù)源,在myeclipse中新建一個(gè)報(bào)表工程,new->reportwebproject,建好工程之后可以看到report-viewer這個(gè)目錄放置了birt運(yùn)行時(shí)用戶能夠看到所有的jsp頁(yè)面以及一些css樣式和一些ajax相關(guān)的js修改樣式(具體的修改會(huì)在后面做介紹),reports目錄這個(gè)里面就是webliblibrary在這個(gè)目錄下新建一個(gè)library文件new->library開(kāi),這里需要打開(kāi)一個(gè)outline的面板window->showview里面找到此面板打開(kāi)(左邊為工程目錄,右邊為outline中l(wèi)ibrary的目錄),如圖:接下來(lái)就可以在DataSources右鍵新建NewDataSources,彈出的窗口選擇第一個(gè)JDBC數(shù)據(jù)源設(shè)置Driver和jndi一個(gè)進(jìn)行數(shù)據(jù)庫(kù)的配置,當(dāng)然如果你已經(jīng)在DBbrower中已經(jīng)配置好你也可以建立數(shù)據(jù)集和數(shù)據(jù)參數(shù)或者交叉表的cube好接下來(lái)就可以進(jìn)行開(kāi)發(fā)一個(gè)簡(jiǎn)單的報(bào)表了。1.清單表首先在reports目錄中右鍵新建一張報(bào)表new->reports口進(jìn)行命名以及在哪一個(gè)目錄下面,點(diǎn)擊下一步會(huì)出現(xiàn)一個(gè)template下面就是公共的報(bào)表模板了,不過(guò)第一次做還是選擇blank,點(diǎn)擊下一步直接完成就會(huì)生成一張報(bào)表。生成報(bào)表第一步還是建立數(shù)據(jù)源,因?yàn)槲覀冎耙呀?jīng)在library樣的在showview中打開(kāi)libraryexplorer窗口里面可以看到這個(gè)項(xiàng)目下的目錄打開(kāi)lib下面的library的DataSource這樣就會(huì)出現(xiàn)一個(gè)綁定的數(shù)據(jù)源,這樣做的好處就是如果開(kāi)發(fā)的報(bào)表數(shù)量較大,這樣以后如果移植數(shù)據(jù)庫(kù)只需要去修改library中的數(shù)據(jù)源,而其他的報(bào)表就會(huì)跟著自動(dòng)都修改過(guò)來(lái)。接下來(lái)我們就可以定義數(shù)據(jù)集了,在DataSets中新建,命名好sqlbirt會(huì)根據(jù)你的sql生query就是你的sql和數(shù)據(jù)庫(kù)信息,dataSource就是數(shù)據(jù)源,OutColumn會(huì)顯示根據(jù)你的sqlComputedColumn就aggregation中選擇計(jì)算類型,expression面顯示一列,parameter就是用來(lái)給報(bào)表綁定參數(shù),filters是用來(lái)Propertybinding中可以給寫(xiě)script代碼,做各種業(yè)務(wù)邏輯的處理,下面的querytimeout可以設(shè)置查詢超時(shí),preview是可以對(duì)數(shù)據(jù)進(jìn)行預(yù)覽,會(huì)顯示sql生成視圖的數(shù)據(jù),如圖:但我們定義好了數(shù)據(jù)集之后我們就可以把這個(gè)數(shù)據(jù)集手動(dòng)直接拖到中間報(bào)表的layout的界面這樣就會(huì)自動(dòng)生成一個(gè)table表格,如果不做任何的樣式處理就可以直接在下面的preview中直接預(yù)覽報(bào)表,或者在上面的工具欄中有一個(gè)viewerreport這里面有各種格式展示sql獨(dú)拖動(dòng)某一個(gè)字段到table可以用這種方式進(jìn)行。定義:例如:select*fromtestwherename=?這一段sql如果沒(méi)有條件會(huì)查出所有的數(shù)據(jù)但是現(xiàn)在有了where,至于birt的規(guī)則規(guī)定凡是參數(shù)都設(shè)置為等于?,這樣才能夠識(shí)別它,接下來(lái)我們就在外面的Reportparameters中定義參數(shù),先定義最簡(jiǎn)單的文本框,同樣還是新建會(huì)彈出窗口如圖:Name定義參數(shù)的名字會(huì)顯示在reportparameters中的名字,同樣也會(huì)顯示在報(bào)表運(yùn)行時(shí)的參數(shù)名字,這里建議使用英文(后面會(huì)說(shuō)明原),下面會(huì)有prompttext這個(gè)就是可以替代name來(lái)定義中文名字例DataType為數(shù)據(jù)的類型,displaytype這里面可以定義參數(shù)的類型,包括文本框,下拉框,單選框,以及多選框,而右邊的helptext其實(shí)就是鼠4業(yè)務(wù)需要在script中定義默認(rèn)的參數(shù),這樣我們的文本框就定義好了。紹到的數(shù)據(jù)集中的parameters點(diǎn)擊新建在linkedtoreportparameters表定義,sql中的where條件后的?就可以接收到了用戶所輸入的內(nèi)容進(jìn)行查詢,(?就要有多少個(gè)參數(shù))。來(lái)就比較美觀,點(diǎn)擊detail行,右鍵insertgroup就會(huì)彈出分組的窗口設(shè)置,如圖:面的itemExpression中可以設(shè)置這個(gè)組顯示為那個(gè)字段,例如按照某個(gè)id來(lái)分組,但是顯示的是相應(yīng)的描述來(lái)給用戶看更為的直觀。當(dāng)我們插入分組后還需要一些調(diào)試可以看到在detail行上面增加了一個(gè)group行,我們只要把detail行的ind_dsc去掉就可以正常的顯示分組后的數(shù)據(jù)了,但是birt的問(wèn)題會(huì)出現(xiàn)某些先太粗之類的情況,這個(gè)需要你手動(dòng)的針對(duì)粗的地方在border中把相應(yīng)的邊線只要去掉,多次測(cè)試后就可以正常顯示了,最后運(yùn)行的樣子:2.固定格子表現(xiàn)就不能用上面介紹的table來(lái)實(shí)現(xiàn)了,需要用到grid網(wǎng)格來(lái)進(jìn)行操作,首先在showview中打開(kāi)palette,這個(gè)里面提供了一些birt的控件,例如label,text等。這里我們將grid拖到報(bào)表中會(huì)彈出一個(gè)窗口選擇幾行幾列,我們根據(jù)要求建好之后就可以開(kāi)始制作了,我們可以從數(shù)據(jù)集的下拉框中找到所需要的數(shù)據(jù)把這些數(shù)據(jù)字段一個(gè)一個(gè)放置到自己所規(guī)定的位置中,可以在grid自由的定制表頭,難度就是根據(jù)表樣來(lái)把字段拖到相應(yīng)位置,如果定義表頭可以插入label進(jìn)行定義表頭,這樣很容易就完成了固定格子報(bào)表的展現(xiàn)。但太高。3.交叉表時(shí)也相對(duì)很靈活。和之前的表一樣,定義數(shù)據(jù)源和數(shù)據(jù)集,之后在Datacube中新建一個(gè)交叉表的數(shù)據(jù)集,也就是把在datasets中定義好的拖到交叉表的相應(yīng)的位置,Dataset中的Primarydataset定義需要的數(shù)據(jù)集在groupandsummery中定義交叉表的分組和明細(xì),如圖:先看groups這個(gè)就是創(chuàng)建分組,對(duì)應(yīng)表中也就是表的左下角的位置,而下面的summaryfields到報(bào)表的制作頁(yè)面了,可以直接將cube拉到展現(xiàn)頁(yè)面中就可以生成,也可以在palette中把crosstable拖到頁(yè)面中,針對(duì)每個(gè)位置自己手動(dòng)把在cube中定義的每個(gè)部分拖放到相應(yīng)的位置,如圖交叉表的空白結(jié)構(gòu):交叉表拖放完字段的結(jié)構(gòu):市,城市包含地區(qū)等。total這個(gè)里面可以添加行列的小計(jì)和合計(jì),不過(guò)這里需要注意你的的就是所有組的合計(jì)會(huì)顯示在最下面如果點(diǎn)擊的是第二組級(jí)別那么右上角的分組字段的total圖:序的中文添加個(gè)idid這個(gè)字段作為組放到交叉表中,把這個(gè)id字段拖到需要排序的字段的前面或者上面就可以限制他的順序,正如上圖中的org_id,左側(cè)的org_id_type都是限定后面的漢字的順序,不過(guò)需要注意的時(shí)候要隱藏這些id字段,在屬性里面有個(gè)visibility中可以隱藏輸出,選擇all就可以了,但是還需要在advance中的box把相關(guān)的邊框?qū)挾榷荚O(shè)置為0,因?yàn)槟J(rèn)是1,以及屬性中的高度或者寬度都設(shè)置為0,就能實(shí)現(xiàn)了。4.Chart圖表palette中把chart拖到右側(cè)頁(yè)面,要么在右側(cè)頁(yè)面鼠標(biāo)右鍵有一個(gè)insert–chart就會(huì)彈出一個(gè)頁(yè)面:可以看出birt提供了多種圖表的形式,開(kāi)發(fā)者可以根據(jù)需求來(lái)選擇相應(yīng)的圖表,這里我選擇line線性圖作為例子來(lái)說(shuō)明,對(duì)于線性圖提供了3種類型的樣式,下面可以選擇是2D還是3D,以及輸出圖片的格式,目前2.6支持四種格式的輸出,同樣還可以選擇多個(gè)Y軸,F(xiàn)lipaxis其實(shí)就是x和y顛倒了,選擇好之后就點(diǎn)擊下一步可以看到這個(gè)頁(yè)面就是定義x和yselectdata中選擇userdatafrom也就是之前外面定義好的數(shù)據(jù)集,分別在x軸和y軸定義自己需要的數(shù)據(jù)集中的字段,y軸可以定義多條曲線的也就是多個(gè)字段都可以展示,全部定義好了就可以下一步了,到formatchart,這里就是對(duì)圖表的界面樣式進(jìn)行設(shè)置,例如定義圖表的標(biāo)題,x和y軸的名字,顏色,字體,位置,大小以及各種事件的定義,如圖:SeriesY軸左側(cè)的數(shù)據(jù)的密interactivity中定義事件,包括onmouseover、onclick等多種事件處理,控制圖標(biāo)展示的效果ChartArea可以定義XTitleplotlegend規(guī)定,還有圖表的位置、標(biāo)題的位置、大小等屬性的設(shè)置。五.報(bào)表的參數(shù)使用之前有介紹過(guò)文本框的使用,接下來(lái)在介紹下其他的三種參數(shù)的使用方法:1.Combobox是他在selectlistvalue中選擇靜態(tài)變量或者動(dòng)態(tài)變量:所謂靜態(tài)變量也就是自己手動(dòng)去填入下拉框的內(nèi)容在右側(cè)點(diǎn)擊new就可以對(duì)值進(jìn)行輸入,有相應(yīng)的顯示的值和實(shí)際的值,下側(cè)也可值設(shè)置為默認(rèn)的值,最下面還有Sort是可以進(jìn)行排序的升序或者降序所謂的動(dòng)態(tài)變量就是通過(guò)讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)來(lái)作為下拉框的值,在Dataset可以選擇數(shù)據(jù)集,selectvalue選擇值的字段,在displaytext中選擇顯示的內(nèi)容,靜態(tài)和動(dòng)態(tài)的設(shè)置默認(rèn)值的區(qū)別就是,動(dòng)態(tài)可以寫(xiě)入script代碼,靈活的控制默認(rèn)值,而靜態(tài)變量只能固定某一個(gè)值。2.RadioButton例如男、女,在上面可以設(shè)置allowduplicate為多選,就形成了復(fù)的值。3.ListBox該組件其實(shí)就是拉長(zhǎng)了boboxbobox的區(qū)別在于sql為name=sql中的in()listbox的值,如果想設(shè)置在數(shù)據(jù)集的參數(shù)中,就不能在parameters中來(lái)綁定參數(shù)了,需要在filters中點(diǎn)擊新建左邊就是選擇需要對(duì)那一個(gè)字段進(jìn)行in的操作,中間呢顧名思義就選擇in的操作符,而右邊就選擇Category中的ReportParameters選擇定義的那個(gè)listbox參數(shù),這樣完成了多選框的定義。六.報(bào)表的級(jí)聯(lián)參數(shù)的使用一個(gè)值的時(shí)候相應(yīng)的第二個(gè)參數(shù)框就會(huì)根據(jù)第一個(gè)框中值到數(shù)據(jù)庫(kù)以一個(gè)例子來(lái)說(shuō)明級(jí)聯(lián)的應(yīng)用:首先,定義一個(gè)數(shù)據(jù)集為年,其sql為:selectyear_id,year_namefromdim_date在定義一個(gè)月的數(shù)據(jù)集,其sql為:selectmon_id,mon_namefromdim_dateawhereyear_id=?這里的?其實(shí)就是來(lái)自于第一個(gè)年的值來(lái)查詢出相應(yīng)月份。接下來(lái)就可以定義級(jí)聯(lián)參數(shù)了,在reportparameters中,新建一個(gè)cascadingparametersgroup級(jí)聯(lián)參數(shù)組如圖:同樣的可以為參數(shù)組設(shè)置name和prompttext,下來(lái)可以定義singledataset和multipledataset,因?yàn)槲覀円?jí)聯(lián)多個(gè)參數(shù)所以addyear_id,默認(rèn)值設(shè)置為year_name并取名為year,可以在下面的prompttext中設(shè)置中文名字作為顯示方便個(gè)月的參數(shù),和年的定義是一樣的,設(shè)置mon_id和mon_name,此次兩個(gè)級(jí)聯(lián)的參數(shù)都定義完了,不過(guò)要怎么把兩個(gè)參數(shù)關(guān)聯(lián)在一起呢!也就是月中的where的數(shù)據(jù)集中的paramenters中來(lái)關(guān)聯(lián)年這個(gè)參數(shù),如圖:這樣我們的級(jí)聯(lián)參數(shù)就定義完成了可以運(yùn)行報(bào)表看看效果是不是實(shí)現(xiàn)了。七.模板及自定義js1.樣式模板有的時(shí)候我們開(kāi)發(fā)的報(bào)表量過(guò)大為了統(tǒng)一報(bào)表的樣式風(fēng)格我們就需要公共的模板了首先,在項(xiàng)目中new–template文件進(jìn)行命名和目錄的選擇以導(dǎo)入模板的圖片。板里面可以自己做一個(gè)通用樣式的報(bào)表所有元素的定義和報(bào)表都是一樣的,當(dāng)我們做好之后模板是需要發(fā)布的才能夠進(jìn)行公共的使用,右鍵點(diǎn)擊模板會(huì)出現(xiàn)如圖:于如何使用在我們每次都新建報(bào)表的框里有個(gè)選擇報(bào)表的樣式的地行報(bào)表的開(kāi)發(fā)。2.自定義js文件用戶自己定義一個(gè)目錄用來(lái)放置自己建立的js文件,接下來(lái)就新建一個(gè)javascript文件,右鍵new->javascript如圖:點(diǎn)擊完成就建立好了文件,我們就可以定義自己的方法了,這里我舉一個(gè)簡(jiǎn)單的返回兩個(gè)值相加的方法作為參考:functionbine(num1,num2){varstr=num1+“_”+num2;returnstr;}寫(xiě)好方法之后就可以在報(bào)表中使用了,具體的使用方法如下:打開(kāi)你所要引入js文件的報(bào)表,切換到xmlsource的標(biāo)簽查看報(bào)表的配置源碼,加入以下代碼:<list-propertyname="includeScripts"><property>js/</property></list-property>態(tài)文本在script輸入方法名字,傳入了兩個(gè)參數(shù),最后預(yù)覽報(bào)表的時(shí)候就會(huì)顯示為:我們可以看到最下面就會(huì)有輸出1_2,這樣就完成了自定義js功能。但是需要注意的是有可能在chart中的事件script中無(wú)法引入自定義js文件,需要用戶自己注意。八.報(bào)表中script的使用1.在script中對(duì)sql的控制這里我們介紹報(bào)表中如何使用script之前做報(bào)表都是將sql放在query中,在parameters中給報(bào)表綁定sql進(jìn)行拆分,一部分就放在script來(lái)實(shí)現(xiàn)追加sql同樣的也可以達(dá)到目標(biāo),當(dāng)我們的一些需求無(wú)法滿足,就可以使用這種方法。例如:我們?cè)趒uery中定義了一段sql,select*fromtestwherename=?,我們可以將where之后的條件拆掉放到script中寫(xiě),如圖:script中的beforeopen中vara=(“參數(shù)名字這個(gè)方法可以獲取用戶所選擇的參數(shù),接下來(lái)我們就可以追加where之后的sql這里的a就是之前獲取的動(dòng)態(tài)參數(shù)值,這樣就實(shí)現(xiàn)了該方法了。同樣的我們也可以在數(shù)據(jù)集中的promptbinding中定義個(gè)人還是比較偏向前者,因?yàn)榍罢吆芸梢栽诶锩嫱ㄟ^(guò)用session獲取用戶的id來(lái)控制登錄用戶所訪問(wèn)報(bào)表的權(quán)限,當(dāng)然需要后臺(tái)數(shù)據(jù)庫(kù)的支持了。們?cè)趕cript中如何來(lái)控制呢?很簡(jiǎn)單,我們只要在追加sql那里稍微坐下if的判斷例如:if(!"".equals(a)&&a!=null){+=“wherename=‘”+a+”’”;}這樣當(dāng)用戶輸入了參數(shù)就會(huì)追加這段sql沒(méi)有選擇這段sql就不會(huì)追加了。2.報(bào)表中script的控制雖然birt提供了很多beforeopen、beforeclose等多種區(qū)域的script制。⑴.隔行換色接下來(lái)我們來(lái)看看報(bào)表中的script應(yīng)用,進(jìn)入報(bào)表script選中table的detail行,進(jìn)入script,會(huì)有三種選擇,onprepare,oncreate等,我以報(bào)表的隔行換色為例子來(lái)說(shuō)明:首先,我們?cè)趏nprepare定義一個(gè)全局的變量count=0(不可以帶var否則oncreate無(wú)法獲取),在oncreate中寫(xiě)如下代碼:count++;if(count%2!=0){("#F0F0F0");}else{("#FFFFCC");}這樣我們就實(shí)現(xiàn)了報(bào)表的隔行換色的效果了。還有另外一種的實(shí)現(xiàn)方法大體思路一樣只是判斷有區(qū)別,代碼如下:if(row.__rownum%2==0){().backgroundColor="#E9EAEB";}else{().backgroundColor="#FFFFFF";}⑵.鼠標(biāo)高亮可以實(shí)現(xiàn)鼠標(biāo)滑過(guò)表格數(shù)據(jù)會(huì)產(chǎn)生自己定義的背景顏色,我們可以在表中的footer或者h(yuǎn)eader行中任意插入一個(gè)text文本,(最好還是添加一個(gè)header行在里面加入文本代碼)<divid="d1"></div><script>varo=("d1");while(o!=null){if(o.tagName=="TBODY")break;o=o.parentNode;}for(vari=1;i<o.;i++){varro=o.children[i];=function(){.background="#aaeeff";};=function(){.background="white";};}</script>效果圖如下:⑶.birt所提供常用的script方法①.如何得到全局變量首先,我們?cè)趫?bào)表中的initialize中定義一個(gè)全局變量代碼如下:("testglobal","testglobalstring");如果哪里需要用到這個(gè)變量我們就可以在相應(yīng)的script中的onPrepare中輸入=('testglobal');那么text的原先的值就會(huì)被替代了。②.如何得到定義的集合全局變量同樣的寫(xiě)入appContext=();importPackage(.util)myArrList=newArrayList();("one");("two");哪里需要就寫(xiě)入appContext=();myObject=("AppContextTest");=();③.如何得到定義的全局的方法先定義方法functiongTest(v){return"GlobalFunction:"+v;}在需要的地方寫(xiě)=gTest("MyTest");④.如何找到當(dāng)頁(yè)的最后一行如果一頁(yè)有40條數(shù)據(jù),那么就在detail行中的onrender中寫(xiě)入if(()%40==1){……}⑤.如何給某一條數(shù)據(jù)添加鏈接在你需要添加的地方的onprepare中寫(xiě)入().URI="''";⑥.row中和cell中控制對(duì)象Row:if(().getExpressionValue("row[QtyOrdered]")>30){().fontFamily="Arial"().backgroundColor="Yellow"}Cell:().getExpressionValue("row.__rownum")==2⑦.動(dòng)態(tài)文本中顯示查詢語(yǔ)句文本名字為TestHeader,在beforeFactory中輸入:query=("DataSet").queryText("TestHeader").valueExpr="query;";⑧.如何修改chart中的titlefunctionbeforeGeneration(chart,context){importPackage(...);newChartTitle=().getScriptable().getPersistentGlobalVariable("testglobal");().getLabel().getCaption().setValue(newChartTitle);}⑨.方法集合(“參數(shù)名”):此方法獲取用戶輸入的參數(shù)的值。params[“參數(shù)名”]:也是獲取用戶輸入的參數(shù)值,同上功能是一樣的。dataSetRow[“字段名”]中雙擊detail中的字段就可以看到表達(dá)式。row[“字段名”]script中獲取某一個(gè)字段的數(shù)據(jù)。()的script中的。getStyle()修改樣式方法,例如字體大小、位置、顏色、背景色等。:也就是鼠標(biāo)滑過(guò)顯示的提示信息。:水平位置可以居中、居左、居右。:垂直位置可以居中、居頂、局底。:設(shè)置其name屬性。和:設(shè)置寬度和高度。:獲取鉆取的超鏈接對(duì)象。setDisplayValue():設(shè)置默認(rèn)的名字。().getParent().getParent():順序就為dataElement->Cell->Row->Table⑩.輸出sql和日志調(diào)試報(bào)表輸出sql:importPackage(.io);out=newPrintWriter(newFileWriter("f:/",true));("sql="+);();輸出日志查看信息:在script中的initialize:("DEBUG");("c:");九.項(xiàng)目開(kāi)發(fā)中整合birt首先介紹開(kāi)發(fā)中整合的環(huán)境,最為常用應(yīng)該就是SSH和birt的整合,但是在項(xiàng)目開(kāi)發(fā)中一般會(huì)把系統(tǒng)的項(xiàng)目和birt的項(xiàng)目分開(kāi)放加一個(gè)鏈接就可以調(diào)用birt項(xiàng)目中的報(bào)表了。這里我以經(jīng)歷的項(xiàng)目為例做說(shuō)明,我們的系統(tǒng)采用的是java的SSH和頁(yè)面的ext、flex整合開(kāi)發(fā)的系統(tǒng),而另一個(gè)則是birt的項(xiàng)目,頁(yè)面上則用ext中tab把birt的報(bào)表頁(yè)面嵌進(jìn)去相當(dāng)于瀏覽器的頁(yè)面一樣,只需要配置birt報(bào)表的鏈接地址就可以了如圖:當(dāng)然如果采用的傳統(tǒng)的jsp的頁(yè)面技術(shù),可以選擇iframe形式把報(bào)表頁(yè)面嵌進(jìn)去。⑴.struts2整合問(wèn)題如果用戶采用的是struts2框架來(lái)進(jìn)行開(kāi)發(fā)在和birt整合時(shí)候肯定會(huì)出現(xiàn)404是和birt機(jī)制有關(guān)系,因?yàn)閎irt的轉(zhuǎn)發(fā)請(qǐng)求的機(jī)制是基于servletstruts2的轉(zhuǎn)發(fā)請(qǐng)求時(shí)候會(huì)根據(jù)自己的核心控制器來(lái)控制servlet請(qǐng)求就沒(méi)法找到相應(yīng)的報(bào)表了。針對(duì)這個(gè)問(wèn)題我們是有處理的辦法,就是自己為birt寫(xiě)一個(gè)專struts2下:packageutil;import.IOException;import.HashMap;import.Map;import.Set;import.Filter;import.FilterChain;import.FilterConfig;import.RequestDispatcher;import.ServletContext;import.ServletException;import.ServletRequest;import.ServletResponse;import.;publicclassBirtFilterimplementsFilter{//用來(lái)封裝birt相關(guān)功能的uri和所對(duì)應(yīng)的Servlet名鍵值對(duì)Map<String,String>map=newHashMap<String,String>();ServletContextcontext;//debug開(kāi)關(guān)staticbooleandebug=false;publicvoiddestroy(){map=null;}/***過(guò)濾birt請(qǐng)求,轉(zhuǎn)發(fā)到對(duì)應(yīng)的servlet,以繞過(guò)其他的過(guò)濾器,struts2**/publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)request;Stringuri=();if(debug){.println(">>>Requesting"+uri+"?"+());}Set<String>keys=();for(Stringkey:keys){if((key)){RequestDispatcherrd=.getNamedDispatcher((key));if(rd!=null){if(debug){.println(">>>Redirectsuccessfullyexecuted");}//跳過(guò)其他的過(guò)濾器(request,response);}else{if(debug){.println(">>>Redirectunsuccessfullyexecuted");}}return;}}(request,response);}publicvoidinit(FilterConfigfilterConfig)throwsServletException{=();("frameset","ViewerServlet");("preview","EngineServlet");}}寫(xiě)好以上代碼接下來(lái)我們就要在中來(lái)配置這個(gè)過(guò)濾器了代碼如下:<filter><filter-name>BirtFilter</filter-name><filter-class></filter-class></filter><filter-mapping><filter-name>BirtFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意以上代碼一定要配置在struts2的過(guò)濾器之前!?。、?實(shí)現(xiàn)報(bào)表的數(shù)據(jù)權(quán)限的控制系統(tǒng)的控制和報(bào)表沒(méi)什么關(guān)系。這個(gè)部門的數(shù)據(jù)了,后臺(tái)數(shù)據(jù)準(zhǔn)備好了之后,我們就先從系統(tǒng)觸發(fā),對(duì)于兩個(gè)項(xiàng)目來(lái)說(shuō)我們可以通過(guò)session的方式來(lái)進(jìn)行傳遞用戶的賬個(gè)session可以把sessionsession方式來(lái)進(jìn)行傳遞。session照傳統(tǒng)的方法直接就可以獲取session在往session放入賬號(hào)值就正ServletContext是經(jīng)過(guò)測(cè)試發(fā)現(xiàn)ServletContext對(duì)于該域內(nèi)就僅有這一個(gè),所以就是我在這個(gè)基礎(chǔ)上就引入了cookiesessionID為名來(lái)控制session傳遞過(guò)去的唯一性,代碼如下:ServletContextcontext=getRequest().getSession().getServletContext().getContext("/PrimeTPA");HashMaps_map=(HashMap)("session_MAP");Stringsession_id=getSession().getId();getSession().setAttribute("userId",());if(s_map==null){s_map=newHashMap();}s_(session_id,getSession());("session_MAP",s_map);Cookiecookie=newCookie("sessionID",getSession().getId());(-1);("/PrimeTPA_Report");getResponse().addCookie(cookie);此處的requestsessionresponse獲取這些對(duì)象,還有在getContext(“/PrimeTPA”)這個(gè)里面需要寫(xiě)項(xiàng)目中的contextcontextsession中的內(nèi)容了代碼如下:importPackage(.);varget_sessionID="";varcookieName="sessionID";varcontext=().getSession().getServletContext().getContext("/PrimeTPA");varsession=().getSession();varcookies=().getRequest().getCookies();for(vari=0;i<;i++){if(cookies[i].getName().equals(cookieName)){get_sessionID=cookies[i].getValue();}}varhashMap=("session_MAP");if(hashMap==null){hashMap=newHashMap();}varhash_session=(get_sessionID);varuser=hash_("userId");userId是用戶自己定義的session配置一些信息,也就是之前提到過(guò)的如何識(shí)別那些項(xiàng)目共用這個(gè)context呢!我以tomcat為例,代碼如下:<Hostname="localhost"appBase="webapps"unpackWARs="true"autoDeploy="true"xmlValidation="false"xmlNamespaceAware="false"><Contextpath="/PrimeTPA"debug="0"reloadable="true"crossContext="true"></Context><Contextpath="/PrimeTPA_Report"debug="0"reloadable="true"crossContext="true"></Context></Host>當(dāng)我們配置好了之后就ok正常運(yùn)行了。十.Birt的擴(kuò)展得自己去對(duì)birt的頁(yè)面或者功能進(jìn)行擴(kuò)展。1.birt的頁(yè)面樣式birt的頁(yè)面樣式基本都提供給我們了,就在項(xiàng)目中的report-viewer中的birtjsp和css以及js文件,首先給大家看看我自己修改的頁(yè)面樣式;里主要需要修改的地方就是birtparameters所有的參數(shù)選擇頁(yè)面,我們都知道birt提供的下拉框下面會(huì)帶個(gè)文nullvalue(1).修改boboxCSS樣式代碼:<styletype="text/css">select{border-right:#pxsolid;border-top:#ffffff1pxsolid;font-size:14px;border-left:#ffffff1pxsolid;color:#003366;border-bottom:#pxsolid;background-color:ECE9D8;}</style>接著就是tr中的代碼,這里大家自己去對(duì)比不同的地方<TR><TDNOWRAP><FONTTITLE="<%=()%>"><LABELFOR="<%=encodedParameterName+"_selection"%>"><%=()%>:</LABEL></FONT><%--isrequired--%><%if(()){%><FONTCOLOR="red"><LABELFOR="<%=encodedParameterName+"_selection"%>">*</LABEL></FONT><%}%></TD><TDNOWRAPWIDTH="100%"><INPUTTYPE="HIDDEN"ID="control_type"VALUE="select"><INPUTTYPE="HIDDEN"ID="data_type"VALUE="<%=""+().getDataType()%>"><INPUTTYPE="HIDDEN"ID="<%=encodedParameterName+"_value"%>"NAME="<%=encodedParameterName%>"<%=paramValue!=null?"VALUE=\""+(paramValue)+"\"":""%>><%booleanCHECKED=true;if(())//TODO:Editable{CHECKED=()||paramValue==null||(!()&&defaultValue!=null&&(paramValue));}%><SELECTclass="select"style="width:250px;"ID="<%=encodedParameterName+"_selection"%>"TITLE="<%=()%>"<%=!CHECKED?"DISABLED='true'":""%><%=allowMultiValue?"multiple='true'":""%><%=(!()&&())?"aria-required='true'":""%>><%if(()!=null){if(!()||(()&&(defaultValue).length()<=0)){if(allowMultiValue&&(values,"",true)){%><OPTIONSELECTED></OPTION><%}else{%><OPTION>請(qǐng)選擇</OPTION><%}}if((defaultValue).length()>0&&!())//AdddefaultvalueinComboBox{booleanflag=false;if(allowMultiValue){flag=(values,defaultValue,true);}else{flag=CHECKED&&!();//ifdisplayTextisinrequest,useitif(flag&&()){defaultDisplayText=displayText;}}%><OPTIONVALUE="<%=(defaultValue)%>"TITLE="<%=(defaultDisplayText)%>"<%=flag?"SELECTED":""%>><%=(defaultDisplayText)%></OPTION><%}booleanisSelected=false;for(inti=0;i<().size();i++){ParameterSelectionChoiceselectionItem=(ParameterSelectionChoice)().get(i);Stringlabel=();Stringvalue=(String)();StringoutputValue=((value==null)?_VALUE:value);StringoutputLabel=((label==null)?_VALUE_DISPLAY:label);if(allowMultiValue){if((values,value,true)){%><OPTIONVALUE="<%=outputValue%>"TITLE="<%=outputLabel%>"SELECTED><%=outputLabel%></OPTION><%}else{%><OPTIONVALUE="<%=outputValue%>"TITLE="<%=outputLabel%>"><%=outputLabel%></OPTION><%}}else{if(!isSelected&&(paramValue,value)&&(!isDisplayTextInList||(isDisplayTextInList&&(label,displayText)))){isSelected=true;%><OPTIONVALUE="<%=outputValue%>"TITLE="<%=outputLabel%>"SELECTED><%=outputLabel%></OPTION><%}else{%><OPTIONVALUE="<%=outputValue%>"TITLE="<%=outputLabel%>"><%=outputLabel%></OPTION><%}}}}%></SELECT><%if(())//TODO:editable.{%><BR><LABELFOR="<%=encodedParameterName+"_radio_input"%>"CLASS="birtviewer_hidden_label">Input</LABEL><LABELFOR="<%=encodedParameterName+"_input"%>"CLASS="birtviewer_hidden_label">Inputtext</LABEL><INPUTTYPE="HIDDEN"ID="<%=encodedParameterName+"_displayText"%>"<%=!CHECKED&&displayText!=null?"VALUE=\""+(displayText)+"\"":""%>><%}%><INPUTTYPE="HIDDEN"ID="isRequired"VALUE="<%=()?"true":"false"%>"><%if(()){%><INPUTTYPE="HIDDEN"ID="<%=_CASCADE%>"VALUE="true"/><%}%></TD></TR>(2).修改textbox頁(yè)面<TR><TDNOWRAP><FONTTITLE="<%=()%>"><LABELFOR="<%=encodedParameterName%>"><%=()%>:</LABEL></FONT><%--isrequired--%><%if(()){%><FONTCOLOR="red"><LABELFOR="<%=encodedParameterName%>">*</LABEL></FONT><%}%></TD><TDNOWRAPWIDTH="100%"><INPUTTYPE="HIDDEN"ID="control_type"VALUE="text"><INPUTTYPE="HIDDEN"ID="data_type"VALUE="<%=""+().getDataType()%>"><%if(!()){%><LABELFOR="<%=encodedParameterName+"_radio_notnull"%>"CLASS="birtviewer_hidden_label">Inputtext</LABEL><%}%><%if(().equals("年月日")||().equals("日期")||().equals("time")||().equals("date")||().equals("date_id")||().equals("date_dte")||().equals("date_dt")){%><INPUTCLASS="BirtViewer_parameter_dialog_Input"TYPE="<%=()?"PASSWORD":"TEXT"%>"NAME="<%=encodedParameterName%>"ID="<%=encodedParameterName%>"TITLE="<%=()%>"VALUE="<%=((()==null)?"":())%>"<%=(!()&&()==null)?"CHECKED":""%><%=()?"aria-required='true'":""%>onclick="setday(this)"style="background:url(..)no-repeatright"><%}else{%><INPUTCLASS="BirtViewer_parameter_dialog_Input"TYPE="<%=()?"PASSWORD":"TEXT"%>"NAME="<%=encodedParameterName%>"ID="<%=encodedParameterName%>"TITLE="<%=()%>"VALUE="<%=((()==null)?"":())%>"<%=(!()&&()==null)?"CHECKED":""%><%=()?"aria-required='true'":""%>><%}%><INPUTTYPE="HIDDEN"ID="<%=encodedParameterName+"_value"%>"VALUE="<%=((()==null)?"":())%>"><INPUTTYPE="HIDDEN"ID="<%=encodedParameterName+"_displayText"%>"VALUE="<%=((()==null)?"":())%>"><%if(!()){%><BR><LABELFOR="<%=encodedParameterName+"_radio_null"%>"CLASS="birtviewer_hidden_label">NullValue</LABEL><%}%><INPUTTYPE="HIDDEN"ID="isRequired"VALUE="<%=()?"true":"false"%>"></TD></TR>的頁(yè)面的樣式。(3).按鈕樣式的修改在dialog的目錄下dialogfragment的頁(yè)面中最下面就是可以設(shè)置按鈕的樣式,代碼如下:<DIVid="birt_hint"style="font-size:12px;color:#000000;display:none;position:absolute;z-index:300;background-color:#F7F7F7;layer-background-color:#0099FF;border:1px#000000solid;filter:Alpha(style=0,opacity=80,finishOpacity=100);"></DIV>2.birt國(guó)際化Birt包安裝插件到你的開(kāi)發(fā)環(huán)境,在這里給大家介紹如何自己修改birt的源文件來(lái)實(shí)現(xiàn)國(guó)際化。首先找到viewservlet的jar文件,到最下層的目錄找到resource這個(gè)目錄進(jìn)去后打開(kāi)文件這個(gè)里面是birt關(guān)于頁(yè)面展示的ascii碼的工具,不過(guò)系統(tǒng)都是有自帶的,我們直接在window中運(yùn)行native2asciiascii的編碼把這個(gè)編碼換到等號(hào)的后面就ok了。以下是修改過(guò)的配置文件了,用戶可以根據(jù)情況來(lái)自行的定義十一.Birt的使用小技巧們從第一張表出發(fā):在下面的屬性表Properties里面有個(gè)超鏈接Hyperlink,點(diǎn)擊編輯edit會(huì)彈出設(shè)置框:這里我們選擇drill-throughstep1中選擇要鉆取到的報(bào)表,在reportparameters設(shè)置需要給第二張報(bào)表傳遞的參數(shù),這里step4來(lái)選擇窗口展現(xiàn)要,至于中間的選項(xiàng)暫時(shí)用不到,step6可以設(shè)置鼠標(biāo)提示信息。1.報(bào)表返回birt本身沒(méi)有提供現(xiàn)成的返回操作,之前個(gè)人有用過(guò)添加一個(gè)text在里面寫(xiě)入javascriptgoback需要把之前傳過(guò)來(lái)的參數(shù)在傳遞回去就可以實(shí)現(xiàn)了返回的操作在表上面添加了一個(gè)label給這個(gè)label運(yùn)行時(shí)無(wú)關(guān)的參數(shù)只是為了返回時(shí)能滿足一表的需求。2.報(bào)表參數(shù)的默認(rèn)值尤其是用戶選擇日期,可能會(huì)有年月日的下拉框或者文本框的形式出現(xiàn),為了方便用戶的操作我們最好能夠提供給用戶一個(gè)默認(rèn)值,報(bào)和月報(bào):⑴.首先,日?qǐng)?bào)根據(jù)業(yè)務(wù)習(xí)慣通常會(huì)默認(rèn)系統(tǒng)時(shí)間的前一天,那么我們一般來(lái)說(shuō)這種情況會(huì)用文本框來(lái)實(shí)現(xiàn),讓用戶輸入一個(gè)8位日期,在文本框的script中我們可以輸入以下代碼:if((newDate())<10&&(newDate())>1){vara=(newDate().getMonth()).toString();varb="0"+a;varc="0"+(newDate()).toString();}elseif((newDate())>10&&(newDate())<13){vara=(newDate().getMonth()).toString();varb=a;varc=(newDate()).toString();}elseif((newDate())==10){vara="09";varb=a;varc="10";}elseif((newDate())==1){vara="12";varb=a;varc="01";}if(newDate().getDate()<10&&newDate().getDate()>1){vard="0"+(newDate().getDate()-1).toString();vare="0"+newDate().getDate().toString();}elseif(newDate().getDate()>10&&newDate().getDate()<32){vard=(newDate().getDate()-1).toString();vare=newDate().getDate().toString();}elseif(newDate().getDate()==10){vard="09";vare="10";}if(newDate().getDate()==1){if(a.equals("1")||a.equals("3")||a.equals("5")||a.equals("7")||a.equals("8")||a.equals("10")||a.equals("12")){(newDate()).toString()+b+"31"}if(a.equals("2")){if(newDate().getFullYear()%4!=0){(newDate()).toString()+b+"28"}else{(newDate()).toString()+b+"29"}}else{(newDate()).toString()+b+"30"}}else{(newDate()).toString()+c+d}if((newDate())==1&&newDate().getDate()==1){((newDate())-1).toString()+"1231"}(2).用一個(gè)年和月的下拉框的選擇,至于日我們?cè)趕cript中自己去拼,因此年的下拉框?yàn)椋篿f((newDate())==1){((newDate())-1).toString()}else{(newDate()).toString()}月的下拉框?yàn)椋篿f((newDate())==1){"12"}if((newDate())>1&&(newDate())<11){"0"+((newDate())-1).toString()}if((newDate())==11){"10"}if((newDate())==12){"11"}在script中我們可以寫(xiě)入以下代碼控制日:varg=("yer");varh=("mon");if(h.equals("01")||h.equals("03")||h.equals("05")||h.equals("07")||h.equals("08")||h.equals("10")||h.equals("12")){vari=g+h+"31";+="";}if(h.equals("04")||h.equals("06")||h.equals("09")||h.equals("11")){vari=g+h+"30";+="";}if(h.equals("02")){if(g.equals("2012")||g.equals("2016")||g.equals("2020")||g.equals("2024")||g.equals("2028")){vari=g+h+"29";+="";}else{vari=g+h+"28";+="";}}3.報(bào)表配置問(wèn)題曾經(jīng)遇到過(guò)相應(yīng)的問(wèn)題就是當(dāng)報(bào)表重新選擇參數(shù)的時(shí)候里面的要重新的加載,代碼如下:<context-param><description>Flagwhethertoforcebrowser-optimizedHTMLoutput.Defaultstotrue</description><param-name>BIRT_OVERWRITE_DOCUMENT</param-name><param-value>true</param-value></context-param>4.參數(shù)頁(yè)面的開(kāi)發(fā)有些人會(huì)認(rèn)為birt的參數(shù)頁(yè)面不美觀,而且對(duì)于多選框的實(shí)現(xiàn)的想法,這里先給大家看看我個(gè)人開(kāi)發(fā)的頁(yè)面樣式:這個(gè)是采用extjsp多選框的操作會(huì)更為的方便。(1).參數(shù)的傳遞方式Birturl的形式來(lái)接收,第二種可以從session中獲取參數(shù)。第一種:url為localhost:8080frameset?__report=&sample=my+parametersample字一樣的參數(shù)就可以接收到這個(gè)值來(lái)運(yùn)行報(bào)表了。之前還有說(shuō)過(guò)如果在script中用方法來(lái)獲取參數(shù)params[“sample”],這樣就無(wú)需在定義參數(shù)就可以運(yùn)行報(bào)表了。第二種:session其實(shí)就是把準(zhǔn)備好的參數(shù)通過(guò)sessionscript中beforeOpen中寫(xiě)varsession=().getSession();u

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論