2012-03-05 4 views
0

私はしばらくの間これを苦労してきました。 私はMicrosoft.Office.Interop.Excelを使用しています。私は以下を実行しようとしています。空のワークシート - Microsoft.Office.Interop.Excel

私は4つのワークシートでExcelで作成したテンプレートを持っています。 ワークシートを埋めようとすると、デバッグ時に正しいワークシートが選択され、各Rangeオブジェクトにエラーが発生していないことがわかりますが、常に空のワークシートが1つあります。

この方法には2回の反復があります。私が反復の1つをコメントアウトすると、他の反復は完全に機能します。だから、基本的に私は常に1つの空のワークシートで終わります。

私が間違っているアイデアは何ですか?

ありがとうございます!

public void generateReport() 
    { 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     object misValue = System.Reflection.Missing.Value; 
     Excel.Range range; 
     int row = 3; 
     xlApp = new Excel.Application(); 
     if (xlApp == null) 
     { 
      MessageBox.Show("Kon Excel niet starten, kijk uw softwareinstelling na !"); 
      return; 
     } 

     string workbookPath = Path.Combine(Environment.CurrentDirectory, @"..\report.xlsx"); 
     xlWorkBook = xlApp.Workbooks.Open(workbookPath, 
      0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", 
      true, false, 0, true, false, false); 


     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 
     ArrayList dossiers = DossierDao.Instance.getDossiers("SELECT * FROM dossier ORDER BY referentie;"); 
     foreach (Object o in dossiers) 
     { 
      File f = (File)o; 
      range = xlWorkSheet.get_Range("A" + row); 
      range.Value = d.Reference; 
      range = xlWorkSheet.get_Range("B" + row); 
      range.Value = d.Info; 
      row++; 
     } 

     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(3); 
     ArrayList facturen = FactuurDao.Instance.getAllFacturen(); 
     foreach (Object o in facturen) 
     { 
      Invoice i = (Invoice)o; 
      range = xlWorkSheet.get_Range("A" + row); 
      range.Value = f.InvoiceNumber; 
      range = xlWorkSheet.get_Range("B" + row); 
      range.Value = f.Amount; 
      row++; 
     } 
     try 
     { 
      xlApp.Visible = true; 
     } 
     catch 

      //... 
     } 

     releaseObject(xlApp); 
     releaseObject(xlWorkBook); 
     releaseObject(xlWorkSheet); 
     releaseObject(xlWorkSheet); 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show("Unable to release the Object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
} 

答えて

1

あなたは書類やfacturenを処理する間rowを再初期化していません。したがって、3行から52行に50の書類があれば、コードは次のワークシートの53行目にfacturenを入れることになります。

+0

私のShameeeee! –