访问另一个c#项目中的excel资源

时间:2009-04-14 08:49:19

标签: c# excel resources

我正在使用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 - >将电子表格添加到项目中现有项目 - >然后选择.xls文件。然后我编辑了文件的属性,说它是一个嵌入式资源,并将它总是复制到输出目录。

我可以在项目中很好地访问电子表格。

但是,我想从项目外部运行DoIt方法,例如从Test Project运行,我得到以下异常:

“测试方法TestProject1.UnitTest1.TestMethod1抛出异常:System.Data.OleDb.OleDbException:Microsoft Jet数据库引擎找不到对象'SELECTION'。确保对象存在并且拼写其名称和路径名字正确..“

我确信我的问题与调用从另一个项目访问资源的类有关。

帮助!

2 个答案:

答案 0 :(得分:1)

在.NET中(特别是在C#中)最好“包装”在IDisposable语句中实现using的类:

using(OleDbConnection connection = new OleDbConnection(sConnection))
{
    // ...
}

您基本上要做的是从程序集中提取资源(请参阅Assembly.GetManifestResourceStream()),将其保留在磁盘上,然后相应地更改连接字符串。

答案 1 :(得分:0)

  

我使用Add - >将电子表格添加到项目中现有项目 - >然后选择.xls文件。然后我编辑了文件的属性,说它是一个嵌入式资源,并将它总是复制到输出目录。

     

我可以在项目中很好地访问电子表格。

您将另一个程序作为程序集打开,然后从中加载资源。

类似的东西:

Assembly other = Assembly.Load(name);
Stream xlsData = other.GetManifestResourceStream(resourceName);