版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在C#中利用Excel做高級(jí)報(bào)表浙江省麗水市汽車運(yùn)輸集團(tuán)有限公司信息中心 茍安廷 Visual Studio.Net 自2001年2月問世以來,受到越來越多人的喜愛,C#做為主力軍,集VB、Delphi的簡(jiǎn)單和VC的簡(jiǎn)煉與強(qiáng)大于一體,更是讓許多人愛不釋手,紛紛倒向它的懷抱。通常的軟件都要用到數(shù)據(jù)庫,數(shù)據(jù)庫中必然要用到報(bào)表,在Visual Studio.Net中自帶了一個(gè)水晶報(bào)表,雖然功能十分強(qiáng)大,但市面上相關(guān)資料非常缺乏,網(wǎng)上全面介紹其使用的文章也屈指可數(shù)。Excel是微軟公司辦公自動(dòng)化套件中的一個(gè)軟件,主要是用來處理電子表格。Excel以其功能強(qiáng)大,界面友好等受到了許多用戶的歡迎,幾乎每一臺(tái)
2、機(jī)器都安裝了它,因此,我們可以將數(shù)據(jù)導(dǎo)入Excel進(jìn)行排版。由于Excel的格式是封閉的,無法直接創(chuàng)建一個(gè)Excel文件然后來排版,只有借助Com組件來完成,同樣,介紹用C#操作Excel的文章也就那么幾篇,基本上都是告訴你如何新建一個(gè)Excel文件,然后,將數(shù)據(jù)寫入某單元格,最多再零星告訴你如何合并單元格,真正使用起來根本無法用C#做出漂亮報(bào)表。本文巧妙利用Excel的宏來自動(dòng)排版,大大減少了工作量,而且可以隨時(shí)修改模板而無須修改程序,非常實(shí)用。本人使用的是Office 2000,操作系統(tǒng)為windows 2000 professinal,為使問題簡(jiǎn)單化,這里不介紹數(shù)據(jù)庫的知識(shí),我一個(gè)二維數(shù)
3、組來代表一個(gè)數(shù)據(jù)庫中的表,我們的目的是將該數(shù)組放到Excel中,并排版成需要的格式,數(shù)組如下:車牌號(hào)類 型品 牌型 號(hào)顏 色附加費(fèi)證號(hào)車架號(hào)浙KA3676危險(xiǎn)品貨車鐵風(fēng)SZG9220YY白1110708900022836浙KA4109危險(xiǎn)品貨車解放CA4110P1K2白223132010898浙KA0001A危險(xiǎn)品貨車南明LSY9190WS白1110205458浙KA0493上普貨貨車解放LSY9190WS白1110255971浙KA1045普貨貨車解放LSY9171WCD藍(lán)1110391226浙KA1313普貨貨車解放9190WCD藍(lán)1110315027浙KA1322普貨貨車解放LSY919
4、0WS藍(lán)浙KA1575普貨貨車解放LSY9181WCD藍(lán)1110314149浙KA1925普貨貨車解放LSY9220WCD藍(lán)1110390626浙KA2258普貨貨車解放LSY9220WSP藍(lán)111048154200320為了在C#中使用Excel,我們要先做一點(diǎn)準(zhǔn)備工作,通過查找(前提是你安裝Visual Studio.Net和Excel 2000),在你的計(jì)算機(jī)中找到TlbImp和Excel9.olb,將他們復(fù)制到一個(gè)文件夾中,在DOS窗口中執(zhí)行 TlbImp Excel9.olb,這時(shí)會(huì)產(chǎn)生以下三個(gè)文件:Excel.dll、Office.dll和VBIDE.dll。我們來完成兩項(xiàng)任務(wù),一
5、是按網(wǎng)上文章介紹的方法,增加將數(shù)據(jù)寫入一個(gè)Excel文件,也就是做一個(gè)簡(jiǎn)單報(bào)表,二是用Excel創(chuàng)建一個(gè)文件,然后以此文件為模板生成高級(jí)報(bào)表。打開Visual Studio.Net,新建一個(gè)C#的windows應(yīng)用程序,取名為MyExcel。根據(jù)個(gè)人愛好,對(duì)窗口做一些美化工作,然后放兩個(gè)按鈕:btnNormal和btnAdvance,Caption分別為“普通報(bào)表”和“高級(jí)報(bào)表”。從菜單中選擇“項(xiàng)目”“添加應(yīng)用”,在彈出的對(duì)話框中選com頁,再點(diǎn)瀏覽按鈕,選擇剛才生成的三個(gè)文件,如下:點(diǎn)“打開”按鈕,再點(diǎn)“確定”按鈕。切換到代碼窗口中,在文件頭添加下面兩個(gè)引用:using System.IO;
6、using System.Reflection;再添加一個(gè)二維數(shù)組來表示數(shù)據(jù)表:private string , myData= "車牌號(hào)","類 型","品 牌","型 號(hào)","顏 色","附加費(fèi)證號(hào)","車架號(hào)","浙KA3676","危險(xiǎn)品","貨車","鐵風(fēng)SZG9220YY","白","1110708900","022
7、836","浙KA4109","危險(xiǎn)品","貨車","解放CA4110P1K2","白","223132","010898","浙KA0001A","危險(xiǎn)品","貨車","南明LSY9190WS","白","1110205458","0474636","浙KA0493","上普貨
8、","貨車","解放LSY9190WS","白","1110255971","0094327","浙KA1045","普貨","貨車","解放LSY9171WCD","藍(lán)","1110391226","0516003","浙KA1313","普貨","貨車","解放9190WCD
9、","藍(lán)","1110315027","0538701","浙KA1322","普貨","貨車","解放LSY9190WS","藍(lán)","24323332","0538716","浙KA1575","普貨","貨車","解放LSY9181WCD","藍(lán)","1110314149&q
10、uot;,"0113018","浙KA1925","普貨","貨車","解放LSY9220WCD","藍(lán)","1110390626","00268729","浙KA2258","普貨","貨車","解放LSY9220WSP","藍(lán)","111048152","00320"切換回設(shè)計(jì)窗口,雙擊“普通報(bào)
11、表”按鈕,設(shè)計(jì)普通報(bào)表,代碼如下:private void btnNormal_Click(object sender, System.EventArgs e)/創(chuàng)建一個(gè)Excel文件Excel.Application myExcel = new Excel.Application ( ) ;myExcel.Application.Workbooks.Add ( true ) ;/讓Excel文件可見myExcel.Visible=true;/第一行為報(bào)表名稱myExcel.Cells1,4="普通報(bào)表"/逐行寫入數(shù)據(jù),for(int i=0;i<11;i+)for(
12、int j=0;j<7;j+)/以單引號(hào)開頭,表示該單元格為純文本myExcel.Cells2+i,1+j="'"+myDatai,j;說明一下,Cells2,1指第2行第1個(gè)單元格,是以1為基準(zhǔn)的,而在C#中的數(shù)組是以0為基準(zhǔn)的,另外,我們還發(fā)現(xiàn),對(duì)于編號(hào)之類的數(shù)據(jù),實(shí)際是文本,而Excel將它認(rèn)成了數(shù)字,由于太長,自動(dòng)換成了科學(xué)計(jì)數(shù),這不是我們要求的,在Excel中,如果某單元格以單引號(hào)“”開頭,表示該單元格為純文本,因此,我們?cè)诿總€(gè)單元格前面加單引號(hào)。運(yùn)行結(jié)果如下:可以看出,該報(bào)表非常簡(jiǎn)陋,標(biāo)題行沒有合并局,字體大小也不合適,連表格線都沒有。當(dāng)然,我們可
13、以寫代碼來設(shè)置單元格字體、大小等等工作,這類技巧網(wǎng)上很多,但如果真要用C#來完成,是一件非常難的事情,還有個(gè)辦法就是將想要的操作錄制成宏,研究一下宏代碼,但宏是用VBA寫的,要轉(zhuǎn)換成果C#可不是件容易的事情。第一種辦法不是本文的重點(diǎn),就到此為止。下面進(jìn)行高級(jí)報(bào)表設(shè)計(jì),該方法的原理為:首先打開Excel,按照要求排好版,保存為一個(gè)文件做為模板,然后在C中將該文件復(fù)制為一個(gè)新文件,在指定位置填入數(shù)據(jù)就可以了,為了添加表格線,我們錄制了一個(gè)宏,在C#中執(zhí)行該宏即可。參考模板如下:當(dāng)然,你還可以排得更漂亮,因?yàn)槭菃渭兊腅xcel操作,不需要特殊說明。如果記錄很多,往往一頁無法打印完成,我們要求在每一頁
14、都顯示報(bào)表標(biāo)題和小標(biāo)題,也就是上圖中的第1、2行,這里有一個(gè)技巧:選擇Excel的菜單“文件”“頁面設(shè)置”,選擇“工作表”,在“頂端標(biāo)題行”后的框中輸入“$1:$2”,也就是12行,當(dāng)然,你也點(diǎn)右邊的紅箭頭,然后用鼠標(biāo)選擇。當(dāng)你的記錄超過一頁時(shí),會(huì)自動(dòng)在下一頁加入標(biāo)題,非常方便。表格中目前還沒有表格線,因?yàn)槲覀儾恢赖降子卸嗌贁?shù)據(jù),因此,也無法知道為多少單元格設(shè)置邊框,我們借助宏來完成。按下面步驟錄制一個(gè)宏:1、 隨便選擇幾個(gè)單元格;2、 選擇菜單“工具”“宏”“錄制新宏”,輸入宏的名稱,就用默認(rèn)的“宏1”吧,點(diǎn)確定;3、 選擇菜單“格式”“單元格”,在對(duì)話框中選擇“邊框”,將內(nèi)邊框和外邊框均
15、選中,按確定;4、 此時(shí),剛才選擇的單元格就有了邊框,再點(diǎn)工具欄中的“停止錄制宏”按鈕來結(jié)束宏錄制。剛才的操作目的是錄制宏而不是加邊框,因此,我們按“Ctrl+Z”來撤消剛才的操作,通過按Alt+F8來調(diào)出宏,選擇“宏1”,選擇編輯,看到的代碼應(yīng)該如下:Sub 宏1()'' 宏1 Macro' 茍安廷 記錄的宏 2003-5-7'' Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Sel
16、ection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .Co
17、lorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHori
18、zontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End WithEnd Sub圖中表的數(shù)據(jù)都是供排版參考用的,結(jié)束前將實(shí)際內(nèi)容刪除掉,即只留下排好版的格式,包括標(biāo)題、列標(biāo)題等,將實(shí)際內(nèi)容去掉。將文件保存到一個(gè)地方,如D:Normal.xls,當(dāng)然,實(shí)際開發(fā)時(shí),可以放到執(zhí)行文件所在目錄下,為了防止用戶隨便修改,可以將文件名改為normal.rpt之類。有了上面的準(zhǔn)備,我們就可以在C#中使用了,添加“高級(jí)報(bào)表”按鈕的響應(yīng)代碼。下面是全部代碼清單。using System;using Syste
19、m.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.IO;using System.Reflection;namespace MyExcel/ <summary>/ Form1 的摘要說明。/ </summary>public class Form1 : System.Windows.Forms.Formprivate System.Windows.Forms.Button btnN
20、ormal;private System.Windows.Forms.Button btnAdvace;/ <summary>/ 必需的設(shè)計(jì)器變量。/ </summary>private System.ComponentModel.Container components = null;public Form1()/ Windows 窗體設(shè)計(jì)器支持所必需的/InitializeComponent();/ TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼/ <summary>/ 清理所有正在使用的資源。/ </summa
21、ry>protected override void Dispose( bool disposing )if( disposing )if (components != null) components.Dispose();base.Dispose( disposing );#region Windows Form Designer generated code/ <summary>/ 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改/ 此方法的內(nèi)容。/ </summary>private void InitializeComponent()this.btnNor
22、mal = new System.Windows.Forms.Button();this.btnAdvace = new System.Windows.Forms.Button();this.SuspendLayout();/ / btnNormal/ this.btnNormal.Location = new System.Drawing.Point(49, 55);this.btnNormal.Name = "btnNormal"this.btnNormal.TabIndex = 0;this.btnNormal.Text = "普通報(bào)表"this.
23、btnNormal.Click += new System.EventHandler(this.btnNormal_Click);/ / btnAdvace/ this.btnAdvace.Location = new System.Drawing.Point(169, 55);this.btnAdvace.Name = "btnAdvace"this.btnAdvace.TabIndex = 1;this.btnAdvace.Text = "高級(jí)報(bào)表"this.btnAdvace.Click += new System.EventHandler(thi
24、s.btnAdvace_Click);/ / Form1/ this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);this.ClientSize = new System.Drawing.Size(292, 133);this.Controls.AddRange(new System.Windows.Forms.Control this.btnAdvace, this.btnNormal);this.Name = "Form1"this.StartPosition = System.Windows.Forms.For
25、mStartPosition.CenterScreen;this.Text = "Form1"this.ResumeLayout(false);#endregion/ <summary>/ 應(yīng)用程序的主入口點(diǎn)。/ </summary>STAThreadstatic void Main() Application.Run(new Form1();private string , myData= "車牌號(hào)","類 型","品 牌","型 號(hào)","顏 色",
26、"附加費(fèi)證號(hào)","車架號(hào)","浙KA3676","危險(xiǎn)品","貨車","鐵風(fēng)SZG9220YY","白","1110708900","022836","浙KA4109","危險(xiǎn)品","貨車","解放CA4110P1K2","白","223132","010898","浙
27、KA0001A","危險(xiǎn)品","貨車","南明LSY9190WS","白","1110205458","0474636","浙KA0493","上普貨","貨車","解放LSY9190WS","白","1110255971","0094327","浙KA1045","普貨","貨
28、車","解放LSY9171WCD","藍(lán)","1110391226","0516003","浙KA1313","普貨","貨車","解放9190WCD","藍(lán)","1110315027","0538701","浙KA1322","普貨","貨車","解放LSY9190WS","藍(lán)
29、","24323332","0538716","浙KA1575","普貨","貨車","解放LSY9181WCD","藍(lán)","1110314149","0113018","浙KA1925","普貨","貨車","解放LSY9220WCD","藍(lán)","1110390626","00
30、268729","浙KA2258","普貨","貨車","解放LSY9220WSP","藍(lán)","111048152","00320"/普通報(bào)表,即單純的文件導(dǎo)出功能private void btnNormal_Click(object sender, System.EventArgs e)/創(chuàng)建一個(gè)Excel文件Excel.Application myExcel = new Excel.Application ( ) ;myExcel.Appli
31、cation.Workbooks.Add ( true ) ;/讓Excel文件可見myExcel.Visible=true;/第一行為報(bào)表名稱myExcel.Cells1,4="普通報(bào)表"/逐行寫入數(shù)據(jù),for(int i=0;i<11;i+)for(int j=0;j<7;j+)/以單引號(hào)開頭,表示該單元格為純文本myExcel.Cells2+i,1+j="'"+myDatai,j;/高級(jí)報(bào)表,根據(jù)模板生成的報(bào)表private void btnAdvace_Click(object sender, System.EventArgs
32、 e)string ""/將模板文件復(fù)制到一個(gè)新文件中Save mySave=new Save();mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*"if(mySave.ShowDialog()!=DialogResult.OK)return;else;/將模板文件copy到新位置,建議實(shí)際開發(fā)時(shí)用相對(duì)路徑,如Application.StartupPath.Trim()+"reportnormal.xls"string ; mode=new ("d:normal.xls&qu
33、ot;);trymode.CopyTo(,true);catch(Exception ee)MessageBox.Show(ee.Message);return;/打開復(fù)制后的文件object missing=Missing.Value;Excel.Application myExcel=new Excel.Application ( );/打開新文件myExcel.Application.Workbooks.Open(,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing); /將Excel顯示出來myExcel.Visible=true;/逐行寫入數(shù)據(jù),數(shù)組中第一行我列標(biāo)題,忽略for(int i=1;i<11;i+)for(int j=0;j<7;j+)/以單引號(hào)開頭,表示該單元格為純文本myExcel.Cells4+i,1+j="'"+myDatai,j;/將列標(biāo)題和實(shí)際內(nèi)容選中Excel.Workbook myBook=myExcel.Workbooks1;Excel.Wo
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級(jí)下冊(cè)數(shù)學(xué)口算綜合練習(xí)題 (每頁100題)
- 《買玩具》幼兒園大班數(shù)學(xué)教案
- 《人教版新課標(biāo)語文六年級(jí)上冊(cè)教案(表格式)》
- 五金安全承諾書
- 湘教版四年級(jí)下冊(cè)語文教案-《一單元-三單元》
- 旅游景區(qū)消防改造施工合同
- 供應(yīng)鏈管理項(xiàng)目招投標(biāo)授權(quán)書
- 國有企業(yè)市場(chǎng)營銷策略
- 建筑設(shè)備租賃勞務(wù)分包協(xié)議
- 森林生態(tài)效益評(píng)估手冊(cè)
- 干部人事檔案任前審核登記表范表
- 北京市道德與法治初一上學(xué)期期中試卷及答案指導(dǎo)(2024年)
- 高校實(shí)驗(yàn)室安全基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 四川省綿陽市高中2025屆高三一診考試物理試卷含解析
- DZ∕T 0283-2015 地面沉降調(diào)查與監(jiān)測(cè)規(guī)范(正式版)
- 朗致集團(tuán)邏輯測(cè)評(píng)試卷2024
- 懸吊技術(shù)的臨床應(yīng)
- 精益管理與精益服務(wù)
- 用友銀企聯(lián)云服務(wù)ppt課件
- 造價(jià)審核部崗位職責(zé)(共4篇)
- 世界機(jī)場(chǎng)四字代碼
評(píng)論
0/150
提交評(píng)論