在ASPNET中讀寫Excel文件有四種解決方案_第1頁
在ASPNET中讀寫Excel文件有四種解決方案_第2頁
在ASPNET中讀寫Excel文件有四種解決方案_第3頁
在ASPNET中讀寫Excel文件有四種解決方案_第4頁
在ASPNET中讀寫Excel文件有四種解決方案_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

年4月19日在ASPNET中讀寫Excel文件有四種解決方案文檔僅供參考在ASP.NET中讀寫Excel文件有四種解決方案在ASP.NET應(yīng)用程序常常會(huì)遇到需要從Excel文件中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入Excel的需求。一般來講,在ASP.NET中讀寫Excel文件有四種解決方案。1.1.1使用OLEDB使用OLEDB能夠以查詢數(shù)據(jù)庫的方式來讀取Excel文件,因?yàn)樵谀撤N程度上Excel表格能夠看成是一張一張的數(shù)據(jù)表。其二者的主要區(qū)別在于所使用的數(shù)據(jù)引擎不一樣。使用OLEDB訪問Excel的要點(diǎn)是計(jì)算機(jī)上必須具有MicrosoftAccessDataComponent2.6(MADC2.6)以上版本,同時(shí)在連接字符串上必須聲明“ExtendedProperties=Excel8.0”然后其它的寫法就和一般的訪問數(shù)據(jù)庫一樣了,打開連接,填充數(shù)據(jù)集,再關(guān)閉連接即可。例如下面的實(shí)現(xiàn)代碼://創(chuàng)立一個(gè)數(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ù)鏈接,得到一個(gè)數(shù)據(jù)集OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);//創(chuàng)立一個(gè)DataSet對(duì)象myDataSet=newDataSet();//得到自己的DataSet對(duì)象myCommand.Fill(myDataSet,"[Sheet1$]");//關(guān)閉此數(shù)據(jù)鏈接myConn.Close();代碼7-1使用這種解決方案的優(yōu)點(diǎn)是不需要其它的服務(wù)器組件,部署非常方便,可是其缺點(diǎn)也是明顯的,用它來讀取Excel格式以上的文件會(huì)存在數(shù)據(jù)丟失的情況,而且也無法生成Excel文件。1.1.2使用Office主互操作程序集另外一種解決方案是使用Office主互操作程序集,采用這種方式需要在服務(wù)器上安裝Office??墒悄軌虮容^精細(xì)的控制Excel文件的方方面面,包括格式、字體、顏色等等。下面的代碼演示了如何讀取Excel文件中某個(gè)單元格的值: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實(shí)際上對(duì)于ASP.NET來講,這并不是一個(gè)很好的解決方案,其原因是這個(gè)解決方案將客戶端的組件用到了服務(wù)器上,這往往會(huì)帶來一些一向不到的問題,如果在處理一個(gè)Excel文件的時(shí)候出錯(cuò),那么整個(gè)線程就會(huì)死在那里,服務(wù)器上的Excel進(jìn)程無法重啟動(dòng),Excel文件無法刪除,后面的Excel文件也無法處理,只能重啟服務(wù)器,因此這是一個(gè)很大的問題。1.1.3使用ServerDocument在上一個(gè)解決方案中,使用Office主互操作程序集存在很大的問題,究其原因是因?yàn)閷⒈緫?yīng)在客戶端使用的Office組件用在了服務(wù)器上導(dǎo)致的,因?yàn)檫@些Office組件在設(shè)計(jì)之初就沒有考慮在服務(wù)中調(diào)用的情況。對(duì)于在服務(wù)器上使用Excel文件,微軟推薦的解決方案是使用ServerDocument。在具有MicrosoftVisualStudioToolsfortheMicrosoftOfficeSystem自定義的MicrosoftOfficeWord文檔或MicrosoftOfficeExcel工作簿中,能夠?qū)?shù)據(jù)存儲(chǔ)在嵌入的數(shù)據(jù)島中,無需啟動(dòng)Excel或Word即可訪問數(shù)據(jù)島。數(shù)據(jù)島是一個(gè)XML文檔,其中包含Office文檔中嵌入的數(shù)據(jù);無需實(shí)例化Office文檔即可訪問該XML文檔。數(shù)據(jù)實(shí)際存在于兩個(gè)地方,即文檔和單獨(dú)的嵌入數(shù)據(jù)島中。在數(shù)據(jù)島與文檔之間使用了數(shù)據(jù)綁定以使它們保持同步。如果服務(wù)器上運(yùn)行的代碼修改了數(shù)據(jù)島,則在文檔打開而且文檔中的代碼運(yùn)行時(shí),Office文檔會(huì)與數(shù)據(jù)島進(jìn)行同步。此模型具有以下幾項(xiàng)優(yōu)勢:l能夠?qū)Ⅱ?yàn)證代碼添加到獨(dú)立于文檔的數(shù)據(jù)中。經(jīng)過將驗(yàn)證與文檔分離,能夠?qū)?shù)據(jù)驗(yàn)證代碼移植到其它文檔中。l數(shù)據(jù)島使用可脫機(jī)使用的數(shù)據(jù)填充。當(dāng)文檔中的緩存數(shù)據(jù)項(xiàng)包含數(shù)據(jù)時(shí),該文檔將與數(shù)據(jù)島進(jìn)行交互。l由于能夠從外部訪問數(shù)據(jù)島,因此無需實(shí)例化Office就能夠修改文檔中嵌入的數(shù)據(jù),從而支持服務(wù)器上文檔的快速批處理??墒牵荒茉L問緩存中的數(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相對(duì)來說,這是一個(gè)比較理想的解決方案,可是使用該方案有如下幾個(gè)限制:l客戶端必須安裝.NETFramework2.0、OfficeToolsforVisualStudio運(yùn)行時(shí)和Office。l開發(fā)嵌入于文檔中的程序集,用于同步視圖和數(shù)據(jù)島中的數(shù)據(jù),例如用數(shù)據(jù)島數(shù)據(jù)中的某個(gè)值更新某單元格中的值,或者用某單元格中的值更新數(shù)據(jù)島中的值。l使用專用的Excel模板。1.1.4對(duì)于Office的OpenXML格式使用OpenXMLSDK如果決定ASP.NET應(yīng)用程序僅處理Office生成的OpenXML格式文檔,那么使用OpenXMLSDK是一個(gè)更好的主意,因?yàn)樗恍枰诜?wù)器上安裝Office,對(duì)客戶端也沒有任何要求,只要用的是OpenXML格式的文檔就能夠了,因?yàn)镺penXML格式已提交國際標(biāo)準(zhǔn)化組織,因此,用戶能夠使用支持OpenXML的任何應(yīng)用程序讀取和編輯該文檔。使用該方案需要下載OpenXMLSDK并使用其進(jìn)行開發(fā),當(dāng)前該SDK還只是一個(gè)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等.壓縮文件請(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)論