2012-11-26 12 views
5

usiłuję skopiować dane DataGridView do programu Excel i używam tego kodu:prosty sposób eksportować DataGridView do Excela

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(); 
     } 
    } 
} 

Ale ponieważ istnieje ponad 200 000 rekordów, jego trwa długo do eksportu. Czy jest to szybszy sposób?

+0

te linki mogą pomóc: [link1] (http://stackoverflow.com/a/11742908/1135581) i [link2] (http://www.codeproject.com/Articles/19284/ Eksportuj duże dane z Gridview-i-Datareader-to) – Rahul

Odpowiedz

7

Spróbuj tego kodu. Jest szybszy niż zwykłe metody współdziałania, również konwertuje na CSV, który można łatwo odczytać przez Excela.

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

Kod umieszcza każdy wiersz w komórce 1 excell (MSVS 2005, .net2). – Vadim

-2

Jak eksportować dane GridView do programu Excel w asp.net w języku C#. więcej szczegółów click here

+3

Należy zauważyć, że [odpowiedzi dotyczące tylko łącza] (http://meta.stackoverflow.com/tags/link-only-answers/info) są zniechęcane, odpowiedzi na pytania powinny być punktem końcowym wyszukiwania rozwiązania (w jeszcze jeden przystanek referencji, które z czasem zanikają). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

+0

cześć sir sprawdź ten link to jest odpowiedź na to pytanie – Jquery

+0

cześć, proszę pani, przeczytaj link w moim ostatnim komentarzu :-) – kleopatra