2010-09-28 4 views
0

J'ai une table de deux, où je dois vider l'information dans le Excel. J'ai employé le code de follwing.But suis obtenant l'erreur "Index out of Bound".Quelqu'un peut-il trouver mon erreur lors du dumping des données dans Excel?

public void ConvertToTable() 
    { 
     DataSet ds = new DataSet(); 
     DataTable dt1 = new DataTable(); 
     DataTable dt2 = new DataTable(); 
     dt1 = ExportToExcel.ToDataTable<CMInfo>(CMInfo); 
     dt2 = ExportToExcel.ToDataTable<RefMInfo>(REFMINFO); 
     dt1.TableName = "Changed Method Information"; 
     dt2.TableName = "Referenced Method Information"; 
     ds.Tables.Add(dt1); 
     ds.Tables.Add(dt2); 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet[] xlWorkSheet = new Excel.Worksheet[ds.Tables.Count]; 
     int Sheet_Count = 0; 
     object misValue = System.Reflection.Missing.Value; 
     xlApp = new Excel.Application(); 
     xlApp.SheetsInNewWorkbook = ds.Tables.Count; 
     xlWorkBook = xlApp.Workbooks.Add(misValue); 

     foreach (DataTable dt in ds.Tables) 
     { 
      if (Sheet_Count < ds.Tables.Count) 
      { 
       xlWorkSheet[Sheet_Count] = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(Sheet_Count + 1); 
       xlWorkSheet[Sheet_Count].Name = dt.TableName; 
       int iCol = 0; 
       foreach (DataColumn c in dt.Columns) 
       { 
        iCol++; 
        xlWorkSheet[Sheet_Count].Cells[1, iCol] = c.ColumnName; 
        xlWorkSheet[Sheet_Count].Cells[1, iCol].Font.Bold = true; 
       } 
       // For each row of data 
       int iRow = 0; 
       foreach (DataRow r in dt.Rows) 
       { 
        iRow++; 
        // Add each row's cell data... 
        iCol = 0; 
        foreach (DataColumn c in dt.Columns) 
        { 
         iCol++; 
         xlWorkSheet[Sheet_Count].Cells[iRow + 1, iCol] = r[c.ColumnName]; 
         xlWorkSheet[Sheet_Count].Cells.ColumnWidth = (xlWorkSheet[Sheet_Count].Cells[iRow + 1, iCol].Count() * 50); 
        } 
       } 
       Sheet_Count++; 
      } 

     } 
     xlWorkBook.SaveAs("ReferenceMethodInfo.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 
     Marshal.ReleaseComObject(xlWorkSheet[Sheet_Count]); 
     Marshal.ReleaseComObject(xlWorkBook); 
     Marshal.ReleaseComObject(xlApp); 
     ds.Clear(); 
     System.Windows.Forms.MessageBox.Show("Exported Completed"); 
    } 

// Ce code pour convertir la liste en DataTable

public static class ExportToExcel 
{ 
    // remove "this" if not on C# 3.0/.NET 3.5 
    public static DataTable ToDataTable<T>(this IList<T> data) 
    { 
     PropertyDescriptorCollection props = 
      TypeDescriptor.GetProperties(typeof(T)); 
     DataTable table = new DataTable(); 

     for (int i = 0; i < props.Count; i++) 
     { 
      PropertyDescriptor prop = props[i]; 
      table.Columns.Add(prop.Name, prop.PropertyType); 
     } 
     object[] values = new object[props.Count]; 
     foreach (T item in data) 
     { 
      for (int i = 0; i < values.Length; i++) 
      { 
       values[i] = props[i].GetValue(item); 
      } 
      table.Rows.Add(values); 
     } 
     return table; 
    } 
} 
+0

avez-vous essayé d'utiliser le débogueur? –

+0

Oui, j'ai essayé –

+1

Une idée de l'endroit où l'erreur est lancée? Quelle indication obtenez-vous si exécuté en mode débogage? – ChrisBD

Répondre

0

Difficile à dire wexactly ce qui provoque l'erreur sans savoir quelle fonction ou bien quelle ligne provoque l'erreur.

Je dois admettre que je ne l'ai jamais exporté des données vers Excel, et donc je ne sais pas si les cellules sont indexées sur zéro ou de 1.

Je crains que vous initialisez iRow et iCol à zéro (0) et pourtant vous les incrémentez (à 1) avant utilisation.

+0

Merci pour votre suggestion précieux.J'ai eu la solution –

+0

En fait, j'ai fait une erreur ICI –

+0

 for (int j = 0; j < ds.Tables.Count; j++) { Marshal.ReleaseComObject(xlWorkSheet[j]); } 

Questions connexes