2011-05-18 78 views
0

我在c#中的应用程序有写入excel表单的概率。 我的应用程序为其目的创建Excel表,并不写入它。 下面的代码仅提供参考..Excel表单打开并迭代写入

class a 
{ 
    void m() 
    { 
     b bee=new b();  
     Excel.Application oXL; 
     Excel._Workbook oWB; 
     b.write(oXL,oWB); //will be called multiple times 
    } 
} 

class b 
{ 
    static b() //declared static so that only once excel workbook with sheets will be  created 
    { 
     Excel._Application oXL = new Excel.Application(); 
     Excel._Workbook oWB = (Excel._Workbook)(oXL.Workbooks.Add(Type.Missing)); 
    } 

    write(Excel.Application oXL, Excel._Workbook oWB) 
    { 
     oXL.Visible = true; //Here its throwing, Object reference not set to an instance of an 
        //Object 
    } 
} 

帮助将不胜感激,谢谢提前!

+0

@Akshata:感谢乌拉圭回合的帮助,很新的SOF :) – Sriyad 2011-05-18 06:38:45

回答

0

我想你想沿着以下行有代码:

class a 
{ 
    b bee; 
    public a() 
    { 
     bee = new b(); 
    } 

    void m() 
    { 
     b.write(oXL,oWB); //will be called multiple times 
    } 
} 

class b 
{ 
    public b() 
    { 
     Excel._Application oXL = new Excel.Application(); 
     Excel._Workbook oWB = (Excel._Workbook)(oXL.Workbooks.Add(Type.Missing)); 
    } 

    write() 
    { 
     oXL.Visible = true; 
    } 
} 

然后,您需要做当然,您只需创建a的许多实例就像您想要的Excel工作表一样。

您可以使用它像这样:

a aa = new a(); 
for(...) 
    aa.m(); 
+0

感谢您的回复..但是a类将会被多个类从另一个类调用!所以thr是3个类invovled。因此,需要构造函数b(),使其仅被调用一次,即使类b被多次调用... – Sriyad 2011-05-19 04:54:32

+0

让我简单介绍一下我的应用程序。 MyApp基本上从列表框中提取数据(包含由用户选择的XML文件名列表)进行处理并将数据分析为Excel表。所以我只创建2个excel表格,所有的文件数据只能放在2张表格中。问题是,每次从列表框(foreach)中提取一个文件时,都会创建一个新的Excel表。因此,如果10个文件在列表框10中,将创建单独的Excel文件,这不是打算的。 – Sriyad 2011-05-19 04:56:05

+0

不按照我告诉过你的方式去做。我告诉你在循环之前声明一个'a'的实例并在循环中重用它。 – 2011-05-19 08:41:34

0
void m() 
{ 
    b bee=new b();  
    Excel.Application oXL; // not initialized here! 
    Excel._Workbook oWB; // not initialized here! 
    b.write(oXL,oWB);  // calling with uninitialized values! 
} 

// ...

class b 
{ 
    static b() 
    { 

     // here you declare two local variables not visible outside of your 
     // static constructor. 
     Excel._Application oXL = new Excel.Application(); 
     Excel._Workbook oWB = (Excel._Workbook)(oXL.Workbooks.Add(Type.Missing)); 
    } 

    // oXL here is a parameter, meaning it is completely different from 
    // the local oXL in your static constructor 
    void write(Excel.Application oXL, Excel._Workbook oWB) 
    { 
     oXL.Visible = true; 
    } 
} 

我想你想要的是申报OXL和OWB为B类的成员变量。尝试是这样的:

void m() 
{ 
    b bee=new b();  
    b.write(); 
} 

// ...

public class b 
{ 
    Excel._Application oXL; 
    Excel._Workbook oWB; 

    public b() 
    { 

     oXL = new Excel.Application(); 
     oWB = (Excel._Workbook)(oXL.Workbooks.Add(Type.Missing)); 
    } 

    public void write() 
    { 
     // do something with cXL and oWB here 
    } 
} 
+0

感谢您的回复,对不起,我忘了提,我有2个Excel表格,而我已经在m()之前初始化了,但是打开了excel表单(这不是打算的)。因此,只有当它在类b中输入write方法时才需要打开它,但参数需要从m() class a。如何去做? – Sriyad 2011-05-18 06:48:29

+0

在写入中省略参数会引发与代码中提到的相同的异常。 – Sriyad 2011-05-18 07:02:30