告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)_第1頁
告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)_第2頁
告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)_第3頁
告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)_第4頁
告別ASP.NET操作EXCEL的煩惱(總結(jié)篇)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、公元19XX年前,關(guān)于EXCEL的操作就如滔滔江水,連綿不絕,真正操作EXCEL我也是從去年下半年開始的,有些比較復(fù)雜的年度報(bào)表之類的,做起來也有點(diǎn)費(fèi)力,不過還是都能畫出來了,關(guān)于EXCEL的報(bào)表導(dǎo)出,考慮到導(dǎo)出耗時(shí)的問題我主要采用AJAX來做的,分別捕捉幾個(gè)起止?fàn)顟B(tài),給客戶端提示3個(gè)狀態(tài):正在檢索數(shù)據(jù)。準(zhǔn)備導(dǎo)出數(shù)據(jù)。(只是從數(shù)據(jù)庫成功取出,還沒有讀寫excel文件)-正在讀寫文件-導(dǎo)出數(shù)據(jù)成功,當(dāng)然如果哪一過程出錯(cuò),都有對(duì)應(yīng)的提示,只所以想到寫這篇文章,主要是因?yàn)榻衲暧袀€(gè)系統(tǒng)的部分EXCEL的操作也讓我做,順便結(jié)合之前操作EXCEL的經(jīng)驗(yàn)作一下總結(jié),可能也算不上什么,對(duì)于絕大多數(shù)來說也沒什么

2、技術(shù)含量,網(wǎng)上一搜一大把,但我想還是有必要總結(jié)一下,至少能給園子里的新手些許幫助,OK,Lets Go. 一. 程序操作EXCEL的應(yīng)用主要還是在統(tǒng)計(jì)報(bào)表方面,您可能會(huì)考慮讀EXCEL模板,也可能會(huì)考慮沒必要讀模板,其實(shí)讀不讀模板都能達(dá)到一樣的效果,看實(shí)際情況而用了。1. 讀模板的話,首先模板存放在某個(gè)路徑下,根據(jù)模板把從數(shù)據(jù)庫里取出的數(shù)據(jù)寫回EXCEL然后生成一個(gè)新的EXCEL存放都另一個(gè)路徑以供下載,模板不變。 我這里的EXCEL操作主要是在VS2005里的,VS2003也可以的,不過沒怎么研究03里的操作(文章最后我會(huì)把05的示例下載地址貼上 那個(gè)demo里之前打包忘了放了一個(gè)生成數(shù)據(jù)的

3、文件,剛放進(jìn)去了,不加也是可以運(yùn)行的,還有模板文件的數(shù)據(jù)稍微過濾了下重新放了部分對(duì)照看下)vs05中操作EXCEL直接引用.NET自帶的COM組件,添加后項(xiàng)目的bin目錄下會(huì)自動(dòng)出現(xiàn) Interop.Excel.dll這個(gè)DLL(需安裝office2003 excel,下面的說明及示例都是基于office2003的,版本不同調(diào)用可能會(huì)不一樣)頁面的命名空間引用 using Excel;下面是調(diào)用模板的一段代碼1#region使用模板導(dǎo)出Excel表2caseReportByTemp:345DataViewdv=CacheReportByTempasDataView;6/建立一個(gè)Excel.Ap

4、plication的新進(jìn)程7Excel.Applicationapp=newExcel.Application();8if(app=null)910return;1112app.Visible=false;13app.UserControl=true;14Workbooksworkbooks=app.Workbooks;15_Workbookworkbook=workbooks.Add(template_path+EXCEL測試模板.xls);/這里的Add方法里的參數(shù)就是模板的路徑16Sheetssheets=workbook.Worksheets;17_Worksheetworksheet

5、=(_Worksheet)sheets.get_Item(1);/模板只有一個(gè)sheet表18if(worksheet=null)1920return;212223introwNum=0;24for(inti=0;idv.Count;i+)2526rowNum=i+1;27worksheet.Cells3+i,1=rowNum;28worksheet.Cells3+i,2=dvi.Row0.ToString();29worksheet.Cells3+i,3=dvi.Row1.ToString();3031excelOperate.SetBold(worksheet,worksheet.Cell

6、s3+i,1,worksheet.Cells3+i,1);/黑體32excelOperate.SetHAlignCenter(worksheet,worksheet.Cells3+i,1,worksheet.Cells3+i,3);/居中33worksheet.get_Range(worksheet.Cells3+i,1,worksheet.Cells3+i,3).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);34353637tick=DateTime.Now.Ticks.ToStr

7、ing();38save_path=temp_path+tick+.xls;39oChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);40excelOperate.Dispose(worksheet,workbook,app);/關(guān)閉Excel進(jìn)程414243break;44#endregion效果如下:2. 不讀模板的話,調(diào)用的時(shí)候其實(shí)會(huì)繼承一個(gè)空白模板,然后寫入數(shù)據(jù),程序畫表頭,最終達(dá)到一樣的效果,程序如下:1#region不使用模板生成Excel表2caseReportByNone:3

8、45DataViewdv=CacheReportByNoneasDataView;6/建立一個(gè)Excel.Application的新進(jìn)程7Excel.Applicationapp=newExcel.Application();8if(app=null)910return;1112app.Visible=false;13app.UserControl=true;14Workbooksworkbooks=app.Workbooks;15_Workbookworkbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);/這里的Add方法里的參數(shù)就相當(dāng)于繼承

9、了一個(gè)空模板(暫這樣理解吧)16Sheetssheets=workbook.Worksheets;17_Worksheetworksheet=(_Worksheet)sheets.get_Item(1);18if(worksheet=null)1920return;212223worksheet.get_Range(worksheet.Cells1,1,worksheet.Cells1,3).Merge(Missing.Value);/橫向合并24worksheet.get_Range(worksheet.Cells1,1,worksheet.Cells1,1).Value2=導(dǎo)出EXCEL測

10、試一;25excelOperate.SetBold(worksheet,worksheet.Cells1,1,worksheet.Cells1,1);/黑體26excelOperate.SetHAlignCenter(worksheet,worksheet.Cells1,1,worksheet.Cells1,1);/居中27excelOperate.SetBgColor(worksheet,worksheet.Cells1,1,worksheet.Cells1,1,System.Drawing.Color.Red);/背景色28excelOperate.SetFontSize(workshee

11、t,worksheet.Cells1,1,worksheet.Cells1,1,16);/字體大小29excelOperate.SetRowHeight(worksheet,worksheet.Cells1,1,worksheet.Cells1,1,32.25);/行高30worksheet.get_Range(worksheet.Cells1,1,worksheet.Cells1,1).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);/黑色連續(xù)邊框3132worksheet.Cell

12、s2,1=序號(hào);33worksheet.Cells2,2=公司;34worksheet.Cells2,3=部門;35excelOperate.SetBold(worksheet,worksheet.Cells2,1,worksheet.Cells2,3);/黑體36worksheet.get_Range(worksheet.Cells2,1,worksheet.Cells2,3e(System.Drawing.Color.Black);37excelOperate.SetHAlignRight(worksheet,worksheet.Cells2,1,worksheet.Cells2,3);3

13、8excelOperate.SetBgColor(worksheet,worksheet.Cells2,1,worksheet.Cells2,3,System.Drawing.Color.Silver);/背景色39introwNum=0;40for(inti=0;idv.Count;i+)4142rowNum=i+1;43worksheet.Cells3+i,1=rowNum;44worksheet.Cells3+i,2=dvi.Row0.ToString();45worksheet.Cells3+i,3=dvi.Row1.ToString();4647excelOperate.SetBol

14、d(worksheet,worksheet.Cells3+i,1,worksheet.Cells3+i,1);/黑體48excelOperate.SetHAlignCenter(worksheet,worksheet.Cells3+i,1,worksheet.Cells3+i,3);/居中49worksheet.get_Range(worksheet.Cells3+i,1,worksheet.Cells3+i,3).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);/設(shè)置邊框顏色,不然打

15、印預(yù)覽,會(huì)非常不雅觀505152excelOperate.SetColumnWidth(worksheet,A,10);53excelOperate.SetColumnWidth(worksheet,B,20);54excelOperate.SetColumnWidth(worksheet,C,20);55worksheet.Name=導(dǎo)出EXCEL測試一;5657tick=DateTime.Now.Ticks.ToString();58save_path=temp_path+tick+.xls;59workbook.SaveAs(save_path,Missing.Value,Missing

16、.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);60excelOperate.Dispose(worksheet,workbook,app);/關(guān)閉Excel進(jìn)程616263break;6465#endregion效果如下:以上我給了兩個(gè)最簡單的操作說明,下面詳細(xì)說一下對(duì)于一些稍微復(fù)雜的報(bào)表的生成處理 二. 對(duì)于復(fù)雜的EXCEL報(bào)表的

17、生成處理,無非是縱向合并相同的數(shù)據(jù)行及嵌套縱向合并等一些操作,下面就幾個(gè)具有針對(duì)性的報(bào)表作下說明. 1.要生成相對(duì)復(fù)雜的EXCEL表,在從數(shù)據(jù)庫取數(shù)據(jù)時(shí),要注意先按照合理的要求排好序,有時(shí)候可能order by后面要跟好幾個(gè)字段,而且這幾個(gè)字段誰先誰后也要注意,因?yàn)檫@些會(huì)直接影響報(bào)表呈現(xiàn)的效果,比如你的EXCEL表要按月份統(tǒng)計(jì)國內(nèi)外的項(xiàng)目,顯示出來的時(shí)候要多個(gè)項(xiàng)目相同的人連續(xù),那么排序就可能要這樣order by 月份,項(xiàng)目類別,用戶ID,項(xiàng)目ID(這是寫好的視圖,基于視圖來檢索的),這個(gè)排序的字段順序就不能變了,變了的話就不太好生成想要的形式了,如下圖:這個(gè)也是動(dòng)態(tài)畫的,用了個(gè)簡單的模板,模

18、板就一個(gè)表頭,沒多大意義,除非表頭很復(fù)雜而且在列表中不需要重畫,考慮模板就比較好,向上面那個(gè)一月份國際的和其它月份的都是需要重畫表頭的。至于合并,如果不是嵌套的合并,我們可以在向模板循環(huán)寫數(shù)據(jù)的時(shí)候直接控制,比如下面一個(gè)簡單的寫法:1for(i=0;itable.Rows.Count;i+)23bidName=table.RowsindexBIDNAME.ToString();4if(table.RowsiBIDNAME.ToString()=bidName)56projNum+;7worksheet.Cells5+i,2=table.RowsiPROJNO;8worksheet.Cells5

19、+i,3=table.RowsiPROJNAME;9worksheet.Cells5+i,4=table.RowsiSTAT_DATE;10worksheet.Cells5+i,5=table.RowsiPROJTYPE;11worksheet.Cells5+i,6=table.RowsiCONTENT;12worksheet.Cells5+i,7=table.RowsiOPENDT;13worksheet.Cells5+i,8=table.RowsiOPENADDRESS;14worksheet.Cells5+i,9=table.RowsiREV_DATE;15worksheet.Cells

20、5+i,10=table.RowsiBID_UNIT;16worksheet.Cells5+i,11=table.RowsiAGT_AMOUNT;17worksheet.Cells5+i,12=table.RowsiCURRENCY+:+table.RowsiBIDSER_AMOUNT;18worksheet.Cells5+i,13=table.RowsiSENDDATE;19worksheet.Cells5+i,14=table.RowsiCURRENCY+:+table.RowsiBIDPRICE;20worksheet.Cells5+i,15=table.RowsiBOOKAMOUNT;

21、21worksheet.Cells5+i,16=table.RowsiCURRENCY+:+table.RowsiBAIL_AMOUNT;22worksheet.Cells5+i,17=table.RowsiUSERNAME;23worksheet.Cells5+i,18=table.RowsiSECOND_USER;24worksheet.Cells5+i,19=;25worksheet.get_Range(worksheet.Cells5+i,1,worksheet.Cells5+i,19).Borders.Color=System.Drawing.ColorTranslator.ToOl

22、e(System.Drawing.Color.Black);26continue;272829worksheet.get_Range(worksheet.Cells5+rowid,1,worksheet.Cells5+i-1,1).Merge(Missing.Value);/將第一列按投標(biāo)單位合并30worksheet.get_Range(worksheet.Cells5+rowid,1,worksheet.Cells5+rowid,1).Value2=bidName+(+projNum.ToString()+個(gè)項(xiàng)目);/合并后的單元格內(nèi)容合并單元格的時(shí)候也要注意一個(gè)問題,就是合并的單元格必須

23、是為空的,不然在執(zhí)行合并時(shí),會(huì)提示“合并后的單元格的值將丟失”,具體不這樣提示的,大致是這個(gè)意思,一般我們合并都單元格相同的內(nèi)容,在合并前我們先保存那個(gè)值,再清空后合并,上面的代碼中把worksheet.Cell5+rowid,1這里系列的單元格的值空出來了,沒寫數(shù)據(jù),而且最后合并了再寫值,避免了去循環(huán)清空。 2.嵌套的合并向上面那樣做可能控制比較麻煩,而且思路可能很混亂,我們可以考慮先循環(huán)填充所有的數(shù)據(jù),在循環(huán)出來要合并的列,比如像下面的這張表先循環(huán)填充數(shù)據(jù),如下:1intindex=0,rownum=0;2stringProjNo=;3for(i=0;itable.Rows.Count;i

24、+)45ProjNo=table.RowsindexPROJNO.ToString();6if(table.RowsiPROJNO.ToString()=ProjNo)78wksheet.Cells3+i,1=rownum+1;9wksheet.Cells3+i,2=+table.RowsiPROJNO;/加上單引號(hào)保證以0開頭的字符原樣輸出10wksheet.Cells3+i,3=+table.RowsiPROJNAME;11wksheet.Cells3+i,4=+table.RowsiPA_NAME;12wksheet.Cells3+i,5=+table.RowsiBIDER_NAME;1

25、3wksheet.Cells3+i,6=table.RowsiBAIL_AMOUNT;14wksheet.Cells3+i,7=table.RowsiNOT_BACK;15wksheet.get_Range(wksheet.Cells3+i,1,wksheet.Cells3+i,7).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);16continue;171819index=i;20rownum+;21i-;2223下面合并前三列相同內(nèi)容的單元:1/合并前三列操作2intm=1,ro

26、wid=3,k;3stringprojName=;4for(k=3;k=i+2;k+)56if(Convert.ToInt32(wksheet.get_Range(wksheet.Cellsk,1,wksheet.Cellsk,1).Value2)=m)78ProjNo=wksheet.get_Range(wksheet.Cellsk,2,wksheet.Cellsk,2).Value2.ToString();9projName=wksheet.get_Range(wksheet.Cellsk,3,wksheet.Cellsk,3).Value2.ToString();10wksheet.ge

27、t_Range(wksheet.Cellsk,1,wksheet.Cellsk,1).Value2=;11wksheet.get_Range(wksheet.Cellsk,2,wksheet.Cellsk,2).Value2=;12wksheet.get_Range(wksheet.Cellsk,3,wksheet.Cellsk,3).Value2=;13continue;1415wksheet.get_Range(wksheet.Cellsrowid,1,wksheet.Cellsk-1,1).Merge(Missing.Value);16wksheet.get_Range(wksheet.

28、Cellsrowid,1,wksheet.Cellsrowid,1).Value2=m;1718wksheet.get_Range(wksheet.Cellsrowid,2,wksheet.Cellsk-1,2).Merge(Missing.Value);19wksheet.get_Range(wksheet.Cellsrowid,2,wksheet.Cellsrowid,2).Value2=+ProjNo;2021wksheet.get_Range(wksheet.Cellsrowid,3,wksheet.Cellsk-1,3).Merge(Missing.Value);22wksheet.

29、get_Range(wksheet.Cellsrowid,3,wksheet.Cellsrowid,3).Value2=+projName;2324m+;25rowid=k;26k-;2728/跳出循環(huán)后合并最后一個(gè)招標(biāo)項(xiàng)目2930wksheet.get_Range(wksheet.Cellsrowid,1,wksheet.Cellsk-1,1).Merge(Missing.Value);31wksheet.get_Range(wksheet.Cellsrowid,1,wksheet.Cellsrowid,1).Value2=m;3233wksheet.get_Range(wksheet.Ce

30、llsrowid,2,wksheet.Cellsk-1,2).Merge(Missing.Value);34wksheet.get_Range(wksheet.Cellsrowid,2,wksheet.Cellsrowid,2).Value2=+ProjNo;3536wksheet.get_Range(wksheet.Cellsrowid,3,wksheet.Cellsk-1,3).Merge(Missing.Value);37wksheet.get_Range(wksheet.Cellsrowid,3,wksheet.Cellsrowid,3).Value2=+projName;下面合并標(biāo)段

31、列1/合并標(biāo)段列23index=0;rowid=3;/重置變量4stringpa_name=string.Empty;/標(biāo)段名稱5for(k=3;k=i+2;k+)67pa_name=table.RowsindexPA_NAME.ToString();8if(wksheet.get_Range(wksheet.Cellsk,4,wksheet.Cellsk,4).Value2.ToString()=pa_name)910wksheet.get_Range(wksheet.Cellsk,4,wksheet.Cellsk,4).Value2=;11continue;1213wksheet.get_

32、Range(wksheet.Cellsrowid,4,wksheet.Cellsk-1,4).Merge(Missing.Value);14wksheet.get_Range(wksheet.Cellsrowid,4,wksheet.Cellsrowid,4).Value2=+pa_name;15index=k-3;16rowid=k;17k-;181920/退出循環(huán)時(shí)合并最后一個(gè)項(xiàng)目的標(biāo)段21wksheet.get_Range(wksheet.Cellsrowid,4,wksheet.Cellsk-1,4).Merge(Missing.Value);22wksheet.get_Range(w

33、ksheet.Cellsrowid,4,wksheet.Cellsrowid,4).Value2=+pa_name;23tick=DateTime.Now.ToString(yyyyMMddhhmmss);24save_path=temp_path+tick+保證金收退情況表.xls;25SessionBailBackID=tick+保證金收退情況表.xls;26Session_BailBack=true;27workbook.SaveAs(save_path,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Val

34、ue,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);28excelOperate.Dispose(worksheet,workbook,app);/關(guān)閉Excel進(jìn)程29/DownLoad(save_path);30/Page_Close();當(dāng)然,上面的操作中會(huì)進(jìn)行好幾次循環(huán),在性能方面不太可取,園子里的兄弟也許會(huì)有更好的方法,小弟不吝賜教了下面我們看下幾個(gè)效果圖:(注意:這里提示的導(dǎo)出數(shù)據(jù)是指從數(shù)據(jù)庫成功取出數(shù)據(jù),還沒有操作

35、EXCEL對(duì)象,剛開始已經(jīng)說過了,當(dāng)然這個(gè)提示文字換成其它的也可以)整個(gè)過程采用AJAX提示的,一來不刷新,二來導(dǎo)出時(shí)間比較長的話,可以給客戶一個(gè)良好的體驗(yàn)效果,否可,用戶一點(diǎn)導(dǎo)出按鈕,半天沒反應(yīng)也沒提示,客戶就覺得怎么這么慢的,是不是你們程序有問題,指責(zé)一大堆,有了這么些交互提示信息,讓客戶多等幾分鐘也能承受。 3.生成的表格包含多個(gè)sheet的操作,比如下面一種情況繪制這張表的要求是根據(jù)選擇某年的幾月到幾月,生成這個(gè)幾個(gè)月的一個(gè)綜合情況的sheet,然后分別生成這幾個(gè)月的單獨(dú)的sheet表,生成上面表的模板,包含兩個(gè)sheet ,一個(gè)綜合月份的sheet和一個(gè)單獨(dú)月份的sheet,因?yàn)閱为?dú)

36、月份的sheet表現(xiàn)形式都是一樣的,我們可以根據(jù)選擇的月份個(gè)數(shù)Copy幾個(gè)sheet就可以了1Workbooksworkbooks=app.Workbooks;23_Workbookworkbook=workbooks.Add(template_path+招標(biāo)單位年度招標(biāo)情況逐月統(tǒng)計(jì)表.xls);4Sheetssheets=workbook.Worksheets;5_WorksheetYearsheet=(_Worksheet)sheets.get_Item(1);6_Worksheetworksheet=(_Worksheet)sheets.get_Item(2);7if(worksheet

37、=null)89return;1011for(inti=1;imonthCount;i+)12worksheet.Copy(Missing.Value,workbook.Worksheets2);/月統(tǒng)計(jì)工作薄Yearsheet的操作就不說了,和前面幾個(gè)一樣操作,關(guān)鍵是月份的sheet的生成,其實(shí)就是循環(huán)操作get_Item(i),代碼如下1/每月詳細(xì)統(tǒng)計(jì)/23intitem_id=2;4rowNum=0;book_Amount=0;index=0;5bid_Amount=;bidser_Amount=;agent_Amount=0;/清空變量6_Worksheetws=null;7for(i

38、nti=0;itableMM.Rows.Count;i+)89rowNum+;10Month=tableMM.RowsindexDATE_MONTH.ToString();11if(tableMM.RowsiDATE_MONTH.ToString()=Month)1213ws=(_Worksheet)sheets.get_Item(item_id);14ws.Cells3+rowNum-1,1=rowNum;15ws.Cells3+rowNum-1,2=tableMM.RowsiPROJNO;16ws.Cells3+rowNum-1,3=tableMM.RowsiPROJNAME;17ws.C

39、ells3+rowNum-1,4=tableMM.RowsiBID_TYPE;18ws.Cells3+rowNum-1,5=tableMM.RowsiBID_MODE;19ws.Cells3+rowNum-1,6=tableMM.RowsiOPENDT;20ws.Cells3+rowNum-1,7=tableMM.RowsiOPENADDRESS;21ws.Cells3+rowNum-1,8=tableMM.RowsiBID_UNIT;22ws.Cells3+rowNum-1,9=tableMM.RowsiNOTICE_NO.ToString().Replace(神華國貿(mào),);23ws.Cel

40、ls3+rowNum-1,10=tableMM.RowsiBOOKAMOUNT;24ws.Cells3+rowNum-1,11=tableMM.RowsiBIDPRICE+(萬+tableMM.RowsiCURRENCY+);25ws.Cells3+rowNum-1,12=tableMM.RowsiBIDSER_AMOUNT+(萬+tableMM.RowsiCURRENCY+);26ws.Cells3+rowNum-1,13=tableMM.RowsiAGT_AMOUNT;27ws.Cells3+rowNum-1,14=;28ws.get_Range(ws.Cells3+rowNum-1,1,

41、ws.Cells3+rowNum-1,14).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);29continue;303132ws.Cells1,1=year+年+bidName+GetMonth(Month)+月份招標(biāo)項(xiàng)目情況一覽表;3334/每月合計(jì)35sql=SELECTCURRENCY,NVL(SUM(BIDPRICE),0)ASBIDPRICE,NVL(SUM(BOOKAMOUNT),0)ASBOOKAMOUNT,NVL(SUM(BIDSER_AMOUNT),0)ASBID

42、SER_AMOUNT,NVL(SUM(AGT_AMOUNT),0)ASAGT_AMOUNTFROMIBS_V_BID_MONTHLY_STAT+SqlFilter+36ANDDATE_YEAR=+year+ANDCOMPANY_ID=+biderID+ANDDATE_MONTH=+Month+37GROUPBYCURRENCY;38System.Data.DataTabledt1=OracleHelper.RetDataTable(sql);39for(intm=0;mdt1.Rows.Count;m+)4041bid_Amount+=dt1.RowsmBIDPRICE+(萬+dt1.Rows

43、mCURRENCY+)rt;42book_Amount+=float.Parse(dt1.RowsmBOOKAMOUNT.ToString();43bidser_Amount+=dt1.RowsmBIDSER_AMOUNT+(萬+dt1.RowsmCURRENCY+)rt;44agent_Amount+=float.Parse(dt1.RowsmAGT_AMOUNT.ToString();454647ws.Cells3+rowNum-1,3=合計(jì);48ws.Cells3+rowNum-1,10=book_Amount;49ws.Cells3+rowNum-1,11=bid_Amount;50w

44、s.Cells3+rowNum-1,12=bidser_Amount;51ws.Cells3+rowNum-1,13=agent_Amount;52ws.get_Range(ws.Cells3+rowNum-1,1,ws.Cells3+rowNum-1,14).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);53ws.Name=GetMM(Month);5455item_id+;56index=i;/匯總下一個(gè)月份的招標(biāo)項(xiàng)目57i-;58rowNum=0;book_Amount=0;5

45、9bid_Amount=;bidser_Amount=;agent_Amount=0;/清空變量606162/跳出循環(huán)時(shí)進(jìn)行最后一個(gè)月份的項(xiàng)目匯總用的是oracle數(shù)據(jù)庫,所以上面那個(gè)sql語句。 呵呵=上面大致說得就差不多了,因?yàn)槭遣粩嘌h(huán)的什么的,可能對(duì)于大的數(shù)據(jù)量讀寫來說,比較好性能,如果大家有什么更好的方法,可以指點(diǎn)下,為了彌補(bǔ)等待時(shí)間過長,所以才結(jié)合了AJAX來處理。最后我把做的一個(gè)小demo的鏈接帖出來給大家,還有一些空模板和對(duì)應(yīng)生成的數(shù)據(jù)表給大家對(duì)照看下,尤其相對(duì)復(fù)雜一些的表畫應(yīng)該是能畫出來的,主要看大家采用什么樣的方法,能少循環(huán)一次就盡量少循環(huán),呵呵EXCEL模板讀寫說明 (說明:最后彈出下載文件的一個(gè)頁面一直想讓其自動(dòng)關(guān)掉,但是不行,如果不關(guān)掉,再點(diǎn)導(dǎo)出,不會(huì)彈出下載框,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論