喬治強(qiáng)
摘要:對(duì)軟件設(shè)計(jì)中常涉及的動(dòng)態(tài)報(bào)表輸出問(wèn)題,NPOI是一個(gè)開源的讀寫excel文件的組件,通過(guò)在軟件中調(diào)用NPOI組件、設(shè)計(jì)報(bào)表模版,并將數(shù)據(jù)填充到Excel文件中,解決了軟件設(shè)計(jì)中報(bào)表定制輸出的問(wèn)題,并在應(yīng)用軟件的開發(fā)中得到應(yīng)用。并在基于c#開發(fā)的系統(tǒng)中實(shí)現(xiàn)了Excel動(dòng)態(tài)報(bào)表制作技術(shù)。
關(guān)鍵詞:NOPI;動(dòng)態(tài)報(bào)表;報(bào)表輸出
文獻(xiàn)編號(hào):TP317 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(201 6129-0101-02
1背景
在管理類軟件應(yīng)用中,用戶需要生成各種復(fù)雜報(bào)表,還要求報(bào)表在使用期可以更改格式。以delphi、c#為代表的編程語(yǔ)言中普遍提供報(bào)表設(shè)計(jì)器,但大都是在軟件設(shè)計(jì)期指定報(bào)表格式,編譯后用戶不能不能變更或增加報(bào)表。為了解決這些問(wèn)題,本文采用NPOI組件,NPOI是一款開源免費(fèi)的組件,不依賴Microsoft Office環(huán)境,NPOI還可以應(yīng)用Microsoft Office本身的公式及格式,在軟件中實(shí)現(xiàn)客戶自定義報(bào)表格式,軟件填充數(shù)據(jù),從而很好的解決了這一問(wèn)題。
2實(shí)現(xiàn)原理
用戶使用時(shí)自定義Excel模版,Excel模版存入數(shù)據(jù)庫(kù),并制定用戶打印數(shù)據(jù)對(duì)應(yīng)Excel單元格的坐標(biāo)(row和col)。用戶打印時(shí),從數(shù)據(jù)庫(kù)下載對(duì)應(yīng)的Excel模版生成響應(yīng)的Excel文件,生成需要打印的數(shù)據(jù),并輸入響應(yīng)的Excel單元格中。
3實(shí)現(xiàn)過(guò)程
3.1報(bào)表信息
系統(tǒng)采用access數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中存放一個(gè)模版信息表和多個(gè)數(shù)據(jù)源信息表。每份報(bào)表的數(shù)據(jù)由一個(gè)模版信息表加若干個(gè)數(shù)據(jù)源組成。
模版信息表:模版編號(hào)(主鍵,自動(dòng)生成)、模版名稱、模版內(nèi)容(OLE對(duì)象,即二進(jìn)制數(shù)據(jù))。模版內(nèi)容自段是要存儲(chǔ)xsl模版的文件,該文件定義了格式信息。模版信息表存儲(chǔ)對(duì)模版的定義,是一個(gè)excel文件及報(bào)表名。軟件生成報(bào)表時(shí)需要將模版下載并保存用戶目錄上,然后對(duì)模版(excel文件)賦值。
數(shù)據(jù)源:模版編號(hào)、字段名、記錄類型、開始行號(hào)、列號(hào),行數(shù),每頁(yè)重復(fù)。
每一份報(bào)表由表頭、報(bào)表主體、表尾組成;表頭和表尾可以選擇每頁(yè)重復(fù);報(bào)表主體是多條記錄,由多行構(gòu)成。表頭、報(bào)表主體、表尾可以分別由不同的數(shù)據(jù)源構(gòu)成,整個(gè)數(shù)據(jù)填充過(guò)程分三步完成。
3.2保存excel模版
將excel模版作為access數(shù)據(jù)庫(kù)的字段存入數(shù)據(jù)庫(kù)。生成報(bào)表時(shí)則將模版取出保存為本地文件,然后將數(shù)據(jù)輸出到模版中。
Filelnfo fi=new Filelnfo(fileName);//讀取文件
FileStream fs=fi.OpenRead();
bytel]bytes=new byte[fs.Length];
fs.Read(bytes,0,Convert.ToInt32(fs.Length));//將文件轉(zhuǎn)換為二進(jìn)制流
string eonnstr="Provider=Mierosoft.Jet.OLEDB.4.0;Da-ta Souree=C:\\Lrpt.mdb":
OleDbConnection cn=new OleDbConnection(connstr);
OleDbCommand cm=new OleDbCommand();
cm.Connection=cn;
cm.CommandType=CommandType.Text;
if(cn.State==0)cn.Open();
3.3讀取excel模版
從數(shù)據(jù)庫(kù)讀出數(shù)據(jù),并將二進(jìn)制數(shù)據(jù)轉(zhuǎn)儲(chǔ)為本地文件
OleDbDataReader dT=null;
//中間有關(guān)數(shù)據(jù)庫(kù)操作代碼省略,am是OleDbCom-mand對(duì)象
3.3基于nopi組件實(shí)現(xiàn)報(bào)表輸出
在實(shí)現(xiàn)將數(shù)據(jù)輸入到excel模版過(guò)程中,需要解決讀寫ex-cel文件的問(wèn)題。通過(guò)編程方式讀寫excel文件的方式有三種:
1)OleDb方式,將excel文件當(dāng)作一個(gè)DataBase,而excel工作表作為一個(gè)table,是將excel的列名當(dāng)作字段名,excel行當(dāng)作table的一條記錄,通過(guò)sql語(yǔ)言實(shí)現(xiàn)讀寫。用這種方法讀取Excel速度還是非常的快的,但這種方式讀取數(shù)據(jù)的時(shí)候不太靈活。
2)Com組件的方式讀取Excel,這種方式需要先引用Micro-soft.Office.Interop.Excel。web方式實(shí)現(xiàn)時(shí)需要服務(wù)器安裝excel和配置網(wǎng)絡(luò)安全選項(xiàng)??梢苑浅l`活的讀取Excel中的數(shù)據(jù),基于單元格方式讀取的,所以讀寫數(shù)據(jù)很慢,太大時(shí)不建議使用。
3)NPOI方式讀取Excel,NPOI是POI項(xiàng)目的.NET版本。POI是一個(gè)Apache軟件基金會(huì)開源的Java讀寫Excel、WORD等微軟文檔的項(xiàng)目。Nopi模式可以脫離excel讀寫excd文檔,可適用于c/s和b/s模式。
本文就采用nopi模式實(shí)現(xiàn)excel中數(shù)據(jù)的寫入。