2016-05-30 44 views
0

這似乎是我的邏輯錯誤。但是如何?這對我來說似乎是好的。我究竟做錯了什麼?表單已創建。但整個內容都在第一張紙上。 我甚至記得有一次硬編碼.get_Item(2),它寫在第二張紙上,爲什麼不現在呢?C#和Excel:寫在多張紙上,它總是寫在第一張?

public void createXls() 
    { 
     Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 

     if (xlApp == null) 
     { 
      Console.WriteLine("Excel is not properly installed!!"); 
      return; 
     } 

     object misValue = System.Reflection.Missing.Value; 
     Excel.Workbook xlWorkBook = xlApp.Workbooks.Add(misValue); 

     for (int z = 1; z <= Sheets.Count; z++) 
     { 
      if (z > 1) xlWorkBook.Worksheets.Add(misValue, misValue, 1, misValue); 
      Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(z); 
      Console.WriteLine("We are writing on sheet #" + z); // it says ...1, 2, 3, 4, 5 
      for (int y = 1; y <= Sheets[z - 1].Count; y++) 
      { 
       int x = 1; 
       foreach (var Column in Sheets[z - 1][y - 1]) 
       { 
        xlWorkSheet.Cells[y, x] = Column.Value; 
        x++; 
       } 
      } 
      releaseObject(xlWorkSheet); 
     } 


     xlWorkBook.SaveAs("\\\\psf\\Home\\Desktop\\csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     releaseObject(xlWorkBook); 
     releaseObject(xlApp); 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      Console.WriteLine("Exception Occured while releasing object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
+0

我可能是盲人,Sheets'定義在哪裏? –

回答

0

看來,什麼是錯與樣品 - Sheets不是變量,也不是一個類的範圍。

當我將發生的Sheets更改爲xlWorkBook.Sheets時,我得到一個未處理的COM異常,指出該索引無效。

我認爲你的問題最有可能的解釋是你在代碼中沒有粘貼樣本的地方分配了Sheets。您還應該仔細檢查您的索引是否正確,以及您是否在正確的對象上使用索引器。

無關提示:

您可以使用索引屬性,而不是get_Item例如[2]而不是get_Item(2)

局部變量應該以小寫字母開頭(例如column應該用來代替Column)。

+0

哦,這可能會讓人困惑,但Sheets是我公開聲明的變數。但謝謝你的提示 – Stringering

0

我認爲它應該是這樣的。

public class Tyburn1 
{ 
    object missing = Type.Missing; 
    public Tyburn1() 
    { 
     Excel.Application oXL = new Excel.Application(); 
     oXL.Visible = false; 
     Excel.Workbook oWB = oXL.Workbooks.Add(missing); 
     Excel.Worksheet oSheet = oWB.ActiveSheet as Excel.Worksheet; 
     oSheet.Name = "The first sheet"; 
     oSheet.Cells[1, 1] = "Something"; 
     Excel.Worksheet oSheet2 = oWB.Sheets.Add(missing, missing, 1, missing) 
         as Excel.Worksheet; 
     oSheet2.Name = "The second sheet"; 
     oSheet2.Cells[1, 1] = "Something completely different"; 
     string fileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)   
           + "\\SoSample.xlsx"; 
     oWB.SaveAs(fileName, Excel.XlFileFormat.xlOpenXMLWorkbook, 
      missing, missing, missing, missing, 
      Excel.XlSaveAsAccessMode.xlNoChange, 
      missing, missing, missing, missing, missing); 
     oWB.Close(missing, missing, missing); 
     oXL.UserControl = true; 
     oXL.Quit(); 
    } 
} 

,增加了第二片是語句...

Excel.Worksheet oSheet2 = oWB.Sheets.Add(missing, missing, 1, missing) 
          as Excel.Worksheet; 

「1」參數指定一張紙,它可以是更多,如果你想一次添加多個表。

最後說明:聲明oXL.Visible = false;告訴Excel以靜默模式啓動。