Intereting Posts
401 Несанкционированная ошибка в доступе к URL SSRS … но она работает в Fiddler? Использование номера версии веб-приложения из сборки (ASP.NET/C#) загрузка изображения с помощью angular2 в asp.net core Как обновить список в одном окне, когда какой-либо триггер события в другом окне в WPF Абстракция базы данных C # для Microsoft SQL Server, Oracle, MySQL и DB2 Как настроить log4net для WCF Любая разница между File.ReadAllText () и использование StreamReader для чтения содержимого файла? Простая генерация гистограмм целочисленных данных в C # Как пройти аутентифицированный сеанс между доменами приложений решение для ошибки RPC_E_ATTEMPTED_MULTITHREAD, вызванной кешированием SPRequestContext SPSites? Приложение ASP.NET для нескольких арендаторов с конкретными ролями арендатора Создать уникальное ограничение для «истины» только в EF Core Самостоятельный хост приложения ASP.NET MVC В чем разница между XElement.Load и XDocument.Load? .NET xsd импортер создает неэриализуемый class

Какой самый быстрый способ экспортировать строки dataGridView в Excel или в базу данных SQL Server

Каков самый быстрый способ экспортировать строки DataGridView в диапазоне от 460328 до 800328 в Excel или в таблицу базы данных SQL Server без вмешательства Microsoft office interop, поскольку взаимодействие довольно медленное и тяжелое для системных ресурсов?

Для экспорта в Excel, если вы не используете XML на основе 2007 или 2010, Interop – это в значительной степени единственный путь. Это не так плохо, как и репутация. Я перечислил несколько решений.

1 В Excel

Сначала добавьте ссылку компонента Microsoft.Office.Interop.Excel в свой проект. Это должно быть на вкладке .NET в Project -> Add Reference. добавьте в форму формулу using:

используя Excel = Microsoft.Office.Interop.Excel;

добавьте кнопку управления и добавьте этот код в его тело:

private void btnExport_Click(object sender, EventArgs e) { Excel.Application app = new Excel.Application(); app.Visible = true; Excel.Workbook wb = app.Workbooks.Add(1); Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1]; // changing the name of active sheet ws.Name = "Exported from gridview"; ws.Rows.HorizontalAlignment = HorizontalAlignment.Center; // storing header part in Excel for (int i = 1; i < dataGridView1.Columns.Count + 1; i++) { ws.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText; } // storing Each row and column value to excel sheet for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { for (int j = 0; j < dataGridView1.Columns.Count; j++) { ws.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString(); } } // sizing the columns ws.Cells.EntireColumn.AutoFit(); // save the application wb.SaveAs("c:\\output.xls",Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive , Type.Missing, Type.Missing, Type.Missing, Type.Missing); // Exit from the application app.Quit(); } } 

2 - на SQL Server

Это не требует вмешательства. Для удобства использования передайте объект List в событие, выполняющее вставки. Если у вас есть таблицы, настроенные для соответствия столбцу вида сетки, это легко. Здесь я использую sproc.

  private void btnToSQL_Click(object sender, EventArgs e) { string connStr = @"Data Source=(local)\sqlexpress;Initial Catalog=rTALIS;Integrated Security=True"; var cn = new SqlConnection(connStr); var cm = new SqlCommand("exec usp_InsertRecord", cn); cm.CommandType = System.Data.CommandType.StoredProcedure; try { cn.Open(); foreach (Row r in rows) { cm.Parameters.Clear(); cm.Parameters.AddWithValue("@Number1", r.Number1); cm.Parameters.AddWithValue("@Number2", r.Number2); cm.Parameters.AddWithValue("@Number3", r.Number3); cm.Parameters.AddWithValue("@Number4", r.Number4); cm.Parameters.AddWithValue("@Number5", r.Number5); cm.Parameters.AddWithValue("@Number6", r.Number6); cm.Parameters.AddWithValue("@Number7", r.Number7); cm.Parameters.AddWithValue("@Date1", r.Date1); cm.ExecuteNonQuery(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { cn.Close(); } } 

Дайте мне знать, если мне нужно настроить это для вас. В исходном примере у меня был List rows = new List (); объявленный в методе form_Load. Это работало для этого решения, но его область теперь слишком ограничена. Я переместил его вверх / вниз в class, так что он может быть вызван в любом месте формы (в частности, btnToSQL_Click). Я прокомментировал это ниже:

  List rows = new List(); private void Form1_Load(object sender, EventArgs e) { //var rows = new List(); //limited scope var sr = new StreamReader(@"C:\so_test.txt"); while (!sr.EndOfStream) { string s = sr.ReadLine(); if (!String.IsNullOrEmpty(s.Trim())) { rows.Add(new Row(s)); } } sr.Close(); dataGridView1.DataSource = rows; } 

Для передачи в Excel это самый быстрый метод, который я нашел (хотя он использует Office InterOp). Пропустите каждую ячейку в DataGridView и назначьте ее массиву объектов. Затем присвойте весь массив диапазону Excel. Это намного быстрее, чем присвоение значения каждой ячейке Excel отдельно, поскольку она вызывает только один раз InterOp. Простите VB:

 Sub Export() Dim xlApp As New Excel.Application Dim wb As Excel.Workbook = xlApp.Workbooks.Add Dim ws As Excel.Worksheet = wb.Worksheets(1) Dim dgv as DataGridView = MyDataGridView Dim ExportArray(dgv.Rows.Count, dgv.Columns.Count - 1) As Object Dim j, i As Integer For j = 0 To dgv.Columns.Count - 1 ExportArray(0, j) = dgv.Columns(j).Name For i = 1 To dgv.Rows.Count ExportArray(i, j) = dgv(j, i - 1).Value Next Next Dim col As String = ColNumtoLetter(j) ws.Range("A1:" & col & i).Value = ExportArray End Sub Private Function ColNumtoLetter(ByVal iCol As Integer) As String Dim Result As String = "" Dim iAlpha As Integer = Int(iCol / 26.001) Dim iRemainder As Integer = iCol - (iAlpha * 26) If iAlpha > 0 Then Result = Chr(iAlpha + 64) End If If iRemainder > 0 Then Result = Result & Chr(iRemainder + 64) End If Return Result End Function 

Второй метод просто переводит номер последнего столбца в соответствующее имя столбца Excel.

Подробнее см. « Быстрый экспорт из DataSet в Excel » и « Экспорт данных в Excel намного быстрее ».

Проверьте создание файлов Excel с C # без офиса, так как это относится к использованию EPPlus, который работает очень хорошо – я смог создать данные CSV из таблицы данных и объемную загрузку в память файла Excel для streamовой передачи. Просто несколько строк кода. Разнообразная csvData – это строковое значение всех ваших csvData.

  using( ExcelPackage pck = new ExcelPackage( ) ) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add( "Sheet1" ); // set the delimiter etf.Delimiter = ','; etf.EOL = "\n"; etf.TextQualifier = "\""; //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 ws.Cells["A1"].LoadFromText( csvData, etf ); return pck.GetAsByteArray( ); } 

Один из вариантов – записать данные в CSV-файл вместо файла Excel. У Excel не возникнет проблем с чтением его после этого.

Если вы не знакомы, в файлах CSV (то есть Comma Separated) поля разделяются запятыми, а строки разделяются символами новой строки ( \n или \r\n ).

Что-то вроде (может не компилироваться!):

 private void WriteData() { using (var file = System.IO.StreamWriter(@"C:\Path\To\File.csv")) { foreach (var row in dataGrid.Rows) { foreach (var cell in row.Cells) { // Note that if some cells contain commas, // you'd need to wrap them in quotes. file.Write(cell.Value).Write(","); } } file.Write("\n"); } } 

Для более быстрой работы также может быть хорошей идеей собрать несколько сотен (или тысяч) строк в одну строку, а затем записать ее в файл вместо записи по ячейке.

Здесь я использовал DataTable для записи данных в файл excel. Я думаю, что данные Grid View также совпадают с DataTable.

Сначала получите данные из базы данных:

 db.GetData(sqlgetprint); 

Это вызов метода, который:

 class DataBaseConnection { private OdbcConnection conn1 = new OdbcConnection(@"FILEDSN=C:/OTPub/Ot.dsn;" + "Uid=sa;" + "Pwd=otdata@123;"); //"DSN=Ot_DataODBC;" + "Uid=sa;" + "Pwd=otdata@123;" //select public System.Data.DataTable GetData(string sql) { try { conn1.Open(); OdbcDataAdapter adpt = new OdbcDataAdapter(sql, conn1); DataTable dt = new DataTable(); adpt.Fill(dt); conn1.Close(); return dt; } catch (Exception ex) { conn1.Close(); throw ex; } } } 

После этого создайте Object for DataBaseConncetion Class в своей рабочей форме

  DataBaseConnection db = new DataBaseConnection(); 

В своем событии Click Button вы можете записать этот код для записи в файл Excel

 string sqlgetprint = "SELECT Service_No,Full_name, Acc_No, OP_date, On_time, Off_time, OP_hours, Payment FROM Print_Op ORDER BY Service_No , OP_date"; DataTable dtall = db.GetData(sqlgetprint); SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls"; saveFileDialog1.FileName = "Employee Details.xls"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { string fname = saveFileDialog1.FileName; StreamWriter wr = new StreamWriter(fname); for (int i = 0; i < dtall.Columns.Count; i++) { wr.Write(dtall.Columns[i].ToString().ToUpper() + "\t"); } wr.WriteLine(); //write rows to excel file for (int i = 0; i < (dtall.Rows.Count); i++) { for (int j = 0; j < dtall.Columns.Count; j++) { if (dtall.Rows[i][j] != null) { wr.Write(Convert.ToString(dtall.Rows[i][j]) + "\t"); } else { wr.Write("\t"); } } //go to next line wr.WriteLine(); } //close file wr.Close(); if (File.Exists(fname)) { System.Diagnostics.Process.Start(fname); } } } catch (Exception) { MessageBox.Show("Error Create Excel Sheet!"); }