在另一个c#项目中访问excel资源
我正在使用C#(Visual Studio 2008)来尝试访问Excel电子表格中的业务逻辑。
我有下面的类..(随意批评,如果我这样做是错误的 – 我通常是java开发人员 – 这是我的第一个c#应用程序。)
public class SpreadSheetClass { // apologies for any typo's code written in place, not copied from an IDE... // public DataTable DoIt() { DataTable result; String sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MySpreadsheet.xls;Extended Properties=Excel 8.0;"; OleDbConnection connection = new OleDbConnection(sConnection); try { connection.Open(); OleDbCommand oleDbcCommand = new OleDbCommand("SELECT * FROM SELECTION", connection); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = oleDbcCommand; result = new DataTable(); dataAdapter.Fill(result); } finally { connection.Close(); } return result; } }
我使用Add – > Existing Item – >将电子表格添加到项目中,然后select.xls文件。 然后,我编辑文件的属性,说它是一个embedded式资源,并将其始终复制到输出目录。
我可以从项目中访问电子表格。
但是,我想从项目之外运行DoIt方法,例如从一个testing项目,我得到以下exception:
“testing方法TestProject1.UnitTest1.TestMethod1抛出exception:System.Data.OleDb.OleDbException:Microsoft Jet数据库引擎找不到对象”select“。请确保该对象存在,并且正确拼写其名称和path名称。 “。
我相信我的问题是调用一个从另一个项目访问资源的类。
帮帮我!
在.NET中(特别是在C#中)最好是using
语句“包装”实现IDisposable
类:
using(OleDbConnection connection = new OleDbConnection(sConnection)) { // ... }
你基本上必须做的是从程序集中提取资源(请参阅Assembly.GetManifestResourceStream()
),将其保存到磁盘上,然后适当地更改连接string。
我使用Add – > Existing Item – >将电子表格添加到项目中,然后select.xls文件。 然后,我编辑文件的属性,说它是一个embedded式资源,并将其始终复制到输出目录。
我可以从项目中访问电子表格。
您打开另一个程序作为程序集,然后从中加载资源。
就像是:
Assembly other = Assembly.Load(name); Stream xlsData = other.GetManifestResourceStream(resourceName);