在另一个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);