版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
年4月19日在ASPNET中讀寫Excel文件有四種解決方案文檔僅供參考在ASP.NET中讀寫Excel文件有四種解決方案在ASP.NET應(yīng)用程序常常會遇到需要從Excel文件中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入Excel的需求。一般來講,在ASP.NET中讀寫Excel文件有四種解決方案。1.1.1使用OLEDB使用OLEDB能夠以查詢數(shù)據(jù)庫的方式來讀取Excel文件,因為在某種程度上Excel表格能夠看成是一張一張的數(shù)據(jù)表。其二者的主要區(qū)別在于所使用的數(shù)據(jù)引擎不一樣。使用OLEDB訪問Excel的要點是計算機上必須具有MicrosoftAccessDataComponent2.6(MADC2.6)以上版本,同時在連接字符串上必須聲明“ExtendedProperties=Excel8.0”然后其它的寫法就和一般的訪問數(shù)據(jù)庫一樣了,打開連接,填充數(shù)據(jù)集,再關(guān)閉連接即可。例如下面的實現(xiàn)代碼://創(chuàng)立一個數(shù)據(jù)鏈接stringstrCon="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\\sample.xls;ExtendedProperties=Excel8.0";OleDbConnectionmyConn=newOleDbConnection(strCon);stringstrCom="SELECT*FROM[Sheet1$]";myConn.Open();//打開數(shù)據(jù)鏈接,得到一個數(shù)據(jù)集OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);//創(chuàng)立一個DataSet對象myDataSet=newDataSet();//得到自己的DataSet對象myCommand.Fill(myDataSet,"[Sheet1$]");//關(guān)閉此數(shù)據(jù)鏈接myConn.Close();代碼7-1使用這種解決方案的優(yōu)點是不需要其它的服務(wù)器組件,部署非常方便,可是其缺點也是明顯的,用它來讀取Excel格式以上的文件會存在數(shù)據(jù)丟失的情況,而且也無法生成Excel文件。1.1.2使用Office主互操作程序集另外一種解決方案是使用Office主互操作程序集,采用這種方式需要在服務(wù)器上安裝Office??墒悄軌虮容^精細的控制Excel文件的方方面面,包括格式、字體、顏色等等。下面的代碼演示了如何讀取Excel文件中某個單元格的值:stringexcelFilePath=@"D:\Book1.xls";Excel.ApplicationmyExcel=newExcel.ApplicationClass();objectoMissing=System.Reflection.Missing.Value;myExcel.Application.Workbooks.Open(excelFilePath,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing);Excel.WorkbookmyBook=myExcel.Workbooks[1];Excel.WorksheetmySheet=(Excel.Worksheet)myBook.Worksheets[1];System.Data.DataTabledt=newSystem.Data.DataTable("mytable");dt.Columns.Add("F1",System.Type.GetType("System.String"));dt.Columns.Add("F2",System.Type.GetType("System.String"));dt.Columns.Add("F3",System.Type.GetType("System.String"));dt.Columns.Add("F4",System.Type.GetType("System.String"));dt.Columns.Add("F5",System.Type.GetType("System.String"));DataSetmyDs=newDataSet();myDs.Tables.Add(dt);DataRowmyRow;myDs.Clear();for(inti=2;i<=4;i++)//第一行為標(biāo)題,不讀取{myRow=myDs.Tables["mytable"].NewRow();for(intj=1;j<=5;j++){Excel.Ranger=(Excel.Range)mySheet.Cells[i,j];stringstrValue=r.Text.ToString();stringaa=strValue;stringcolumnname="F"+j.ToString();myRow[columnname]=strValue;}myDs.Tables["mytable"].Rows.Add(myRow);}DataGrid1.DataSource=myDs.Tables["mytable"].DefaultView;DataGrid1.DataBind();代碼7-2而下面的代碼則演示了如何生成Excel文件并向其中寫入值:stringfilename="";Excel.ApplicationClassoExcel;oExcel=newExcel.ApplicationClass();oExcel.UserControl=false;Excel.WorkbookClasswb=(Excel.WorkbookClass)oExcel.Workbooks.Add(System.Reflection.Missing.Value);for(inti=1;i<=5;i++){oExcel.Cells[i,1]=i.ToString();oExcel.Cells[i,2]="'第2列";oExcel.Cells[i,3]="'第3列";oExcel.Cells[i,4]="'第4列";}wb.Saved=true;filename=Request.PhysicalApplicationPath+"test.xls";oExcel.ActiveWorkbook.SaveCopyAs(filename);oExcel.Quit();System.GC.Collect();Response.Redirect(Request.ApplicationPath+"/test.xls");代碼7-3實際上對于ASP.NET來講,這并不是一個很好的解決方案,其原因是這個解決方案將客戶端的組件用到了服務(wù)器上,這往往會帶來一些一向不到的問題,如果在處理一個Excel文件的時候出錯,那么整個線程就會死在那里,服務(wù)器上的Excel進程無法重啟動,Excel文件無法刪除,后面的Excel文件也無法處理,只能重啟服務(wù)器,因此這是一個很大的問題。1.1.3使用ServerDocument在上一個解決方案中,使用Office主互操作程序集存在很大的問題,究其原因是因為將本應(yīng)在客戶端使用的Office組件用在了服務(wù)器上導(dǎo)致的,因為這些Office組件在設(shè)計之初就沒有考慮在服務(wù)中調(diào)用的情況。對于在服務(wù)器上使用Excel文件,微軟推薦的解決方案是使用ServerDocument。在具有MicrosoftVisualStudioToolsfortheMicrosoftOfficeSystem自定義的MicrosoftOfficeWord文檔或MicrosoftOfficeExcel工作簿中,能夠?qū)?shù)據(jù)存儲在嵌入的數(shù)據(jù)島中,無需啟動Excel或Word即可訪問數(shù)據(jù)島。數(shù)據(jù)島是一個XML文檔,其中包含Office文檔中嵌入的數(shù)據(jù);無需實例化Office文檔即可訪問該XML文檔。數(shù)據(jù)實際存在于兩個地方,即文檔和單獨的嵌入數(shù)據(jù)島中。在數(shù)據(jù)島與文檔之間使用了數(shù)據(jù)綁定以使它們保持同步。如果服務(wù)器上運行的代碼修改了數(shù)據(jù)島,則在文檔打開而且文檔中的代碼運行時,Office文檔會與數(shù)據(jù)島進行同步。此模型具有以下幾項優(yōu)勢:l能夠?qū)Ⅱ炞C代碼添加到獨立于文檔的數(shù)據(jù)中。經(jīng)過將驗證與文檔分離,能夠?qū)?shù)據(jù)驗證代碼移植到其它文檔中。l數(shù)據(jù)島使用可脫機使用的數(shù)據(jù)填充。當(dāng)文檔中的緩存數(shù)據(jù)項包含數(shù)據(jù)時,該文檔將與數(shù)據(jù)島進行交互。l由于能夠從外部訪問數(shù)據(jù)島,因此無需實例化Office就能夠修改文檔中嵌入的數(shù)據(jù),從而支持服務(wù)器上文檔的快速批處理。可是,只能訪問緩存中的數(shù)據(jù),而不是文檔中的所有數(shù)據(jù)。下面的代碼分別演示了如何使用ServerDocument訪問數(shù)據(jù)和從數(shù)據(jù)生成Excel文檔:stringexpenseDoc=@"C:\ExpenseDocuments\Expenses0105.xls";ServerDocumentsd1=null;try{sd1=newServerDocument(expenseDoc);CachedDataHostItemdataHostItem1=sd1.CachedData.HostItems["DataNamespace.DataWorksheet"];CachedDataItemdataItem1=dataHostItem1.CachedData["DataCache"];System.IO.StringReaderschemaReader=newSystem.IO.StringReader(dataItem1.Schema);System.IO.StringReaderxmlReader=newSystem.IO.StringReader(dataItem1.Xml);ExpenseData.ReadXmlSchema(schemaReader);ExpenseData.ReadXml(xmlReader);}finally{if(sd1!=null){sd1.Close();}}代碼7-4stringname=@"C:\Documents\WordApplication3.doc";System.IO.FileStreamfileStream=null;byte[]bytes=null;try{fileStream=newSystem.IO.FileStream(name,System.IO.FileMode.Open,System.IO.FileAccess.Read);bytes=newbyte[(int)fileStream.Length];fileStream.Read(bytes,0,(int)fileStream.Length);}finally{if(fileStream!=null){fileStream.Close();}}ServerDocumentsd1=null;try{sd1=newServerDocument(bytes,name);//Yourdatamanipulationcodegoeshere.sd1.Save();bytes=sd1.Document;//IfyouhaveaWorddocument,usetheMIMEstring:Response.ContentType="application/msword";//IfyouhaveanExcelworkbook,usetheMIMEstring://Response.ContentType="application/vnd.ms-excel";Response.AddHeader("Content-disposition","filename="+name);Response.Write(sd1);}finally{if(sd1!=null){sd1.Close();}}代碼7-5相對來說,這是一個比較理想的解決方案,可是使用該方案有如下幾個限制:l客戶端必須安裝.NETFramework2.0、OfficeToolsforVisualStudio運行時和Office。l開發(fā)嵌入于文檔中的程序集,用于同步視圖和數(shù)據(jù)島中的數(shù)據(jù),例如用數(shù)據(jù)島數(shù)據(jù)中的某個值更新某單元格中的值,或者用某單元格中的值更新數(shù)據(jù)島中的值。l使用專用的Excel模板。1.1.4對于Office的OpenXML格式使用OpenXMLSDK如果決定ASP.NET應(yīng)用程序僅處理Office生成的OpenXML格式文檔,那么使用OpenXMLSDK是一個更好的主意,因為它不需要在服務(wù)器上安裝Office,對客戶端也沒有任何要求,只要用的是OpenXML格式的文檔就能夠了,因為OpenXML格式已提交國際標(biāo)準(zhǔn)化組織,因此,用戶能夠使用支持OpenXML的任何應(yīng)用程序讀取和編輯該文檔。使用該方案需要下載OpenXMLSDK并使用其進行開發(fā),當(dāng)前該SDK還只是一個CTP版本。下面的代碼演示了如何使用OpenXMLSDK讀寫OpenXML格式的Excel文件。//Howto:Getworksheetinformation.publicList<string>XLGetSheetInfo(stringfileName){//FillthiscollectionwithalistofallthesheetsList<string>sheets=newList<string>();using(SpreadsheetDocumentxlPackage=SpreadsheetDocument.Open(fileName,false)){WorkbookPartworkbook=xlPackage.WorkbookPart;Streamworkbookstr=workbook.GetStream();XmlDocumentdoc=newXmlDocument();doc.Load(workbookstr);XmlNamespaceManagernsManager=newXmlNamespaceManager(doc.NameTable);nsManager.AddNamespace("default",doc.DocumentElement.NamespaceURI);XmlNodeListnodelist=doc.SelectNodes("http://default:sheets/default:sheet",nsManager);foreach(XmlNodenodeinnodelist){stringsheetName=string.Empty;sheetName=node.Attributes["name"].Value;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 磁選工安全技能評優(yōu)考核試卷含答案
- 戲服制作工達標(biāo)強化考核試卷含答案
- 電鳴樂器調(diào)試工操作安全強化考核試卷含答案
- 溶解乙炔生產(chǎn)工安全專項考核試卷含答案
- 漆器制漆工崗前設(shè)備巡檢考核試卷含答案
- 坯布縫接工崗前技術(shù)操作考核試卷含答案
- 創(chuàng)投基金合同范本
- 采購合同封賬協(xié)議
- 寫網(wǎng)合同范本模板
- 鋼模銷售合同范本
- 泵站運行維護培訓(xùn)課件
- 2025年發(fā)動機尾氣后處理行業(yè)當(dāng)前市場規(guī)模及未來五到十年發(fā)展趨勢報告
- 機動車駕駛培訓(xùn)教學(xué)與考試大綱
- 國開電大 可編程控制器應(yīng)用實訓(xùn) 形考任務(wù)1-7全
- 醫(yī)院后勤愛國衛(wèi)生工作體系構(gòu)建與實施
- 托盤貨架培訓(xùn)課件
- 胎兒右位主動脈弓伴鏡像分支超聲診斷
- 小兒急性喉炎健康教育與護理指南
- PVP與PKP術(shù)后護理指南
- 【覓途咨詢】2025人形機器人應(yīng)用場景洞察白皮書
- 消防設(shè)施講解課件大全
評論
0/150
提交評論