2012-11-26 13 views
5

sto cercando di copiare i dati DataGridView per Excel e sto usando questo codice:modo semplice per esportare DataGridView a Excel

public static void ExportToExcel(DataGridView dgView) 
{ 
    Microsoft.Office.Interop.Excel.Application excelApp = null; 

    try 
    { 
     // instantiating the excel application class 
     object misValue = System.Reflection.Missing.Value; 
     excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Microsoft.Office.Interop.Excel.Workbook currentWorkbook = excelApp.Workbooks.Add(Type.Missing); 
     Microsoft.Office.Interop.Excel.Worksheet currentWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)currentWorkbook.ActiveSheet; 

     currentWorksheet.Columns.ColumnWidth = 18; 

     if (dgView.Rows.Count > 0) 
     { 
      currentWorksheet.Cells[1, 1] = DateTime.Now.ToString("s"); 
      int i = 1; 

      foreach (DataGridViewColumn dgviewColumn in dgView.Columns) 
      { 
       // Excel work sheet indexing starts with 1 
       currentWorksheet.Cells[2, i] = dgviewColumn.Name; 
       ++i; 
      } 

      Microsoft.Office.Interop.Excel.Range headerColumnRange = currentWorksheet.get_Range("A2", "G2"); 
      headerColumnRange.Font.Bold = true; 
      headerColumnRange.Font.Color = 0xFF0000; 

      //headerColumnRange.EntireColumn.AutoFit(); 
      int rowIndex = 0; 

      for (rowIndex = 0; rowIndex < dgView.Rows.Count; rowIndex++) 
      { 
       DataGridViewRow dgRow = dgView.Rows[rowIndex]; 

       for (int cellIndex = 0; cellIndex < dgRow.Cells.Count; cellIndex++) 
       { 
        currentWorksheet.Cells[rowIndex + 3, cellIndex + 1] = dgRow.Cells[cellIndex].Value; 
       } 
      } 

      Microsoft.Office.Interop.Excel.Range fullTextRange = currentWorksheet.get_Range("A1", "G" + (rowIndex + 1).ToString()); 
      fullTextRange.WrapText = true; 
      fullTextRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft; 
     } 
     else 
     { 
      string timeStamp = DateTime.Now.ToString("s"); 
      timeStamp = timeStamp.Replace(':', '-'); 
      timeStamp = timeStamp.Replace("T", "__"); 
      currentWorksheet.Cells[1, 1] = timeStamp; 
      currentWorksheet.Cells[1, 2] = "No error occured"; 
     } 

     using (SaveFileDialog exportSaveFileDialog = new SaveFileDialog()) 
     { 
      exportSaveFileDialog.Title = "Select Excel File"; 
      exportSaveFileDialog.Filter = "Microsoft Office Excel Workbook(*.xlsx)|*.xlsx"; 

      if (DialogResult.OK == exportSaveFileDialog.ShowDialog()) 
      { 
       string fullFileName = exportSaveFileDialog.FileName; 
       // currentWorkbook.SaveCopyAs(fullFileName); 
       // indicating that we already saved the workbook, otherwise call to Quit() will pop up 
       // the save file dialogue box 

       currentWorkbook.SaveAs(fullFileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, System.Reflection.Missing.Value, misValue, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue); 
       currentWorkbook.Saved = true; 
       MessageBox.Show("Exported successfully", "Exported to Excel", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     if (excelApp != null) 
     { 
      excelApp.Quit(); 
     } 
    } 
} 

Ma quanto v'è più di 200 000 record, il suo prendere un lungo periodo di tempo per l'esportazione. C'è un modo più veloce per farlo?

+0

questi collegamenti potrebbero aiutarti: [link1] (http://stackoverflow.com/a/11742908/1135581) e [link2] (http://www.codeproject.com/Articles/19284/ Export-large-data-from-Gridview-and-Datareader-to) – Rahul

risposta

7

Prova questo codice. È più veloce dei normali metodi di interoperabilità, inoltre converte in CSV che può essere letto facilmente da Excel.

int cols; 
//open file 
StreamWriter wr = new StreamWriter("GB STOCK.csv"); 

//determine the number of columns and write columns to file 
cols = dgvStock.Columns.Count; 
for (int i = 0; i < cols - 1; i++) 
{ 
    wr.Write(dgvStock.Columns[i].Name.ToString().ToUpper() + ","); 
} 
wr.WriteLine(); 

//write rows to excel file 
for (int i = 0; i < (dgvStock.Rows.Count - 1); i++) 
{ 
    for (int j = 0; j < cols; j++) 
    { 
     if (dgvStock.Rows[i].Cells[j].Value != null) 
     { 
      wr.Write(dgvStock.Rows[i].Cells[j].Value + ","); 
     } 
     else 
     { 
      wr.Write(","); 
     } 
    } 

    wr.WriteLine(); 
} 

//close file 
wr.Close(); 
+0

Il codice inserisce ogni riga nella cella 1 excell (MSVS 2005, .net2). – Vadim

-2

Come esportare i dati GridView per eccellere in asp.net in C#. click here

+3

Nota che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate, pertanto le risposte dovrebbero essere il punto finale di una ricerca di una soluzione (vs. ancora un altro scalo di riferimenti, che tendono a diventare stantii nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

+0

ciao signore controlla questo link è la risposta di questa domanda – Jquery

+0

ciao signora, leggi il link nel mio ultimo commento :-) – kleopatra

Problemi correlati