2012-03-13 10 views
0

im, пытающийся экспортировать datagridview в excel (.xls) в приложении winforms с использованием visual studio 2010 в C#, проблема заключается в том, что он берет навсегда сохранение, до сих пор у меня есть 4220 строк и 20 столбцов , Есть ли более быстрый способ сделать это. ПРИМЕЧАНИЕ. Я заполняю datagridview из сохраненного файла excel. Я ценю вашу помощь .... мой сохранить код выглядит следующим образом:большой экспорт datagridview в excel

private void btnSave_Click(object sender, EventArgs e) 
    { 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     object misValue = System.Reflection.Missing.Value; 

     xlApp = new Excel.Application(); 
     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     // Get the Header from dataGridView 
     for (int h = 1; h < dataGridView1.Columns.Count + 1; h++) 
     { 
      xlWorkSheet.Cells[1, h] = dataGridView1.Columns[h - 1].HeaderText; 
     } 

     // Get the Cell Values 
     for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      for (int j = 0; j < dataGridView1.Columns.Count; j++) 
      { 
       DataGridViewCell cell = dataGridView1[j, i]; 
       xlWorkSheet.Cells[i + 2, j + 1] = cell.Value; 
      } 
     } 

     //xlWorkBook.SaveCopyAs("\\FORM TEST.xlsx"); 
     xlWorkBook.SaveAs("\\GB STOCK.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     xlApp = null; 
     xlWorkBook = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect();  
    } 

ответ

2

После ознакомления с различными поисками и ответами выше, я натолкнулся на этот код, он работает очень быстро (почти мгновенно) по сравнению с моим оригиналом, где потребовалось менее 2 минут. Я очень благодарен за ваши ответы выше, и я рассмотрю их, особенно метод копирования и вставки, который был интересным для чтения. Я относительно новичок в этом (новое хобби) и только начинаю понимать некоторые понятия относительно экспорта наборов данных и т. Д. Я знаю, что это далеко не лучший способ добиться того, что я намеревался, но он делает то, что я хочу это на данный момент. Еще раз спасибо всем, кто помог, я многому учусь.

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

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

      //write rows to excel file 
      for (int i = 0; i < (dgvStock.Rows.Count); 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(); 
1

Вы хотите, чтобы попытаться свести к минимуму количество звонков вы делаете между кодом .NET и процесс Excel - те очень медленно, чтобы выполнить , поэтому заселение ячейки за ячейкой занимает много времени.

Лучше поместить содержимое вашей сетки в массив: вы можете сбрасывать это на лист Excel за одну операцию.

Write Array to Excel Range

0

Использование Interop для копирования по ячейкам очень медленно. Вместо этого я бы предложил использовать копию. См. this msdn article для примера того, как копировать данные в буфер обмена; вы можете использовать interop для вставки значений в электронную таблицу.

0

Попробуйте ExcelLibrary.

«Цель этого проекта - создать собственное .NET-решение для создания, чтения и изменения файлов Excel без использования COM-взаимодействия или соединения OLEDB».

COM-объекты обычно медленнее сравниваются с родными библиотеками .NET.

Вы также должны взглянуть на this thread.

Смежные вопросы