2011-05-18 218 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