在ASPNET中读写Excel文件有四种解决方案.doc_第1页
在ASPNET中读写Excel文件有四种解决方案.doc_第2页
在ASPNET中读写Excel文件有四种解决方案.doc_第3页
在ASPNET中读写Excel文件有四种解决方案.doc_第4页
在ASPNET中读写Excel文件有四种解决方案.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在ASP.NET中读写Excel文件有四种解决方案在ASP.NET应用程序常常会遇到需要从Excel文件中读取数据或将数据写入Excel的需求。一般来讲,在ASP.NET中读写Excel文件有四种解决方案。1.1.1 使用OLE DB使用OLE DB可以以查询数据库的方式来读取Excel文件,因为在某种程度上Excel表格可以看成是一张一张的数据表。其二者的主要区别在于所使用的数据引擎不一样。使用OLE DB访问Excel的要点是计算机上必须具有Microsoft Access Data Component 2.6(MADC2.6)以上版本,同时在连接字符串上必须声明“Extended Properties=Excel 8.0”,这里的指定Excel 版本号如果高于8.0可能会出错,所以一般来讲必须使用Excel 8.0。然后其它的写法就和一般的访问数据库一样了,打开连接,填充数据集,再关闭连接即可。例如下面的实现代码:/创建一个数据链接string strCon = Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = c:sample.xls;Extended Properties=Excel 8.0 ;OleDbConnection myConn = new OleDbConnection ( strCon ) ;string strCom = SELECT * FROM Sheet1$ ;myConn.Open ( ) ;/打开数据链接,得到一个数据集OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;/创建一个 DataSet对象myDataSet = new DataSet ( ) ;/得到自己的DataSet对象myCommand.Fill ( myDataSet , Sheet1$ ) ;/关闭此数据链接myConn.Close ( ) ;代码 7-1 使用这种解决方案的优点是不需要其他的服务器组件,部署非常方便,但是其缺点也是明显的,用它来读取Excel 2003格式以上的文件会存在数据丢失的情况,而且也无法生成Excel文件。1.1.2 使用Office主互操作程序集另外一种解决方案是使用Office主互操作程序集,采用这种方式需要在服务器上安装Office 2003。但是能够比较精细的控制Excel文件的方方面面,包括格式、字体、颜色等等。下面的代码演示了如何读取Excel文件中某个单元格的值:string excelFilePath=D:Book1.xls; Excel.Application myExcel=new Excel.ApplicationClass( ) ; object oMissing = System.Reflection.Missing.Value ; myExcel.Application.Workbooks.Open(excelFilePath,oMissing,oMissing,oMissing,oMissing,oMissing, oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing) ; Excel.Workbook myBook = myExcel.Workbooks1 ; Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets1 ; System.Data.DataTable dt=new System.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); DataSet myDs = new DataSet(); myDs.Tables.Add(dt); DataRow myRow; myDs.Clear(); for( int i = 2 ; i = 4 ; i + ) /第一行为标题,不读取 myRow = myDs.Tablesmytable.NewRow(); for( int j = 1 ; j = 5 ; j + ) Excel.Range r=(Excel.Range)mySheet.Cellsi,j; string strValue=r.Text.ToString(); string aa=strValue; string columnname=F+j.ToString(); myRowcolumnname=strValue; myDs.Tablesmytable.Rows.Add(myRow); DataGrid1.DataSource=myDs.Tablesmytable.DefaultView; DataGrid1.DataBind();代码 7-2 而下面的代码则演示了如何生成Excel文件并向其中写入值:string filename=; Excel.ApplicationClass oExcel; oExcel = new Excel.ApplicationClass(); oExcel.UserControl = false; Excel.WorkbookClass wb = (Excel.WorkbookClass) oExcel.Workbooks.Add(System.Reflection.Missing.Value); for(int i = 1;i = 5; i+) oExcel.Cellsi,1=i.ToString(); oExcel.Cellsi,2=第2列; oExcel.Cellsi,3=第3列; oExcel.Cellsi,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来讲,这并不是一个很好的解决方案,其原因是这个解决方案将客户端的组件用到了服务器上,这往往会带来一些一向不到的问题,如果在处理一个Excel文件的时候出错,那么整个线程就会死在那里,服务器上的Excel进程无法重启动,Excel文件无法删除,后面的Excel文件也无法处理,只能重启服务器,所以这是一个很大的问题。1.1.3 使用ServerDocument在上一个解决方案中,使用Office主互操作程序集存在很大的问题,究其原因是因为将本应在客户端使用的Office组件用在了服务器上导致的,因为这些Office组件在设计之初就没有考虑在服务中调用的情况。对于在服务器上使用Excel文件,微软推荐的解决方案是使用ServerDocument。在具有 Microsoft Visual Studio 2005 Tools for the Microsoft Office System 自定义的 Microsoft Office Word 2003 文档或 Microsoft Office Excel 2003 工作簿中,可以将数据存储在嵌入的数据岛中,无需启动 Excel 或 Word 即可访问数据岛。数据岛是一个 XML 文档,其中包含 Office 文档中嵌入的数据;无需实例化 Office 文档即可访问该 XML 文档。数据实际存在于两个地方,即文档和单独的嵌入数据岛中。在数据岛与文档之间使用了数据绑定以使它们保持同步。如果服务器上运行的代码修改了数据岛,则在文档打开并且文档中的代码运行时,Office 文档会与数据岛进行同步。此模型具有以下几项优势:l 可以将验证代码添加到独立于文档的数据中。通过将验证与文档分离,可以将数据验证代码移植到其他文档中。l 数据岛使用可脱机使用的数据填充。当文档中的缓存数据项包含数据时,该文档将与数据岛进行交互。l 由于可以从外部访问数据岛,因此无需实例化 Office 就可以修改文档中嵌入的数据,从而支持服务器上文档的快速批处理。但是,只能访问缓存中的数据,而不是文档中的所有数据。下面的代码分别演示了如何使用ServerDocument访问数据和从数据生成Excel文档:string expenseDoc = C:ExpenseDocumentsExpenses0105.xls;ServerDocument sd1 = null; try sd1 = new ServerDocument(expenseDoc); CachedDataHostItem dataHostItem1 = sd1.CachedData.HostItemsDataNamespace.DataWorksheet; CachedDataItem dataItem1 = dataHostItem1.CachedDataDataCache; System.IO.StringReader schemaReader = new System.IO.StringReader(dataItem1.Schema); System.IO.StringReader xmlReader = new System.IO.StringReader(dataItem1.Xml); ExpenseData.ReadXmlSchema(schemaReader); ExpenseData.ReadXml(xmlReader);finally if (sd1 != null) sd1.Close(); 代码 7-4 string name = C:DocumentsWordApplication3.doc;System.IO.FileStream fileStream = null;byte bytes = null; try fileStream = new System.IO.FileStream( name, System.IO.FileMode.Open, System.IO.FileAccess.Read); bytes = new byte(int)fileStream.Length; fileStream.Read(bytes, 0, (int)fileStream.Length);finally if (fileStream != null) fileStream.Close(); ServerDocument sd1 = null;try sd1 = new ServerDocument(bytes, name); / Your data manipulation code goes here. sd1.Save(); bytes = sd1.Document; / If you have a Word document, use the MIME string: Response.ContentType = application/msword; / If you have an Excel workbook, use the MIME string: /Response.ContentType = application/vnd.ms-excel; Response.AddHeader(Content-disposition, filename= + name); Response.Write(sd1);finally if (sd1 != null) sd1.Close(); 代码 7-5 相对来说,这是一个比较理想的解决方案,但是使用该方案有如下几个限制:l 客户端必须安装.NET Framework 2.0、Office Tools for Visual Studio 运行时和Office 2003。l 开发嵌入于文档中的程序集,用于同步视图和数据岛中的数据,例如用数据岛数据中的某个值更新某单元格中的值,或者用某单元格中的值更新数据岛中的值。l 使用专用的Excel模板。 1.1.4 对于Office 2007的OpenXML格式使用OpenXML SDK如果决定ASP.NET 应用程序仅处理Office 2007生成的OpenXML格式文档,那么使用OpenXML SDK是一个更好的主意,因为它不需要在服务器上安装Office,对客户端也没有任何要求,只要用的是OpenXML格式的文档就可以了,因为OpenXML格式已提交国际标准化组织,所以,用户可以使用支持OpenXML的任何应用程序读取和编辑该文档。使用该方案需要下载OpenXML SDK并使用其进行开发,目前该SDK还只是一个CTP版本。下面的代码演示了如何使用OpenXML SDK读写OpenXML格式的Excel文件。/ How to: Get worksheet information.public List XLGetSheetInfo(string fileName) / Fill this collection with a list of all the sheets List sheets = new List(); using (SpreadsheetDocument xlPackage = SpreadsheetDocument.Open(fileName, false) WorkbookPart workbook = xlPackage.WorkbookPart; Stream workbookstr = workbook.GetStream(); XmlDocument doc = new XmlDocument(); doc.Load(workbookstr); XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace(default, doc.DocumentElement.NamespaceURI); XmlNodeList nodelist = doc.SelectNodes(/default:sheets/default:sheet, nsManager); foreach (XmlNode node in nodelist) string sheetName = string.Empty; sheetName = node.Attributesname.Value; sheets.Add(sheetName); return sheets;代码 7-6 / How to: Create a new packa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论