Как сохранить datagrid c в excel

This is a great question and I was surprised at how difficult it was to find a clear and complete answer, most of the answers I found were either sudo-code or not 100% complete.

I was able to create a complete solution to copy and save the data from my DataGridView to an excel file based on Jake’s answer so I’m posting my complete solution in the hopes that it can help other new comers to c# like myself :)

First off, you will need the Microsoft.Office.Interop.Excel reference in your project. See MSDN on how to add it.

My Code:

using Excel = Microsoft.Office.Interop.Excel;

private void btnExportToExcel_Click(object sender, EventArgs e)
{
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "Excel Documents (*.xls)|*.xls";
    sfd.FileName = "Inventory_Adjustment_Export.xls";
    if (sfd.ShowDialog() == DialogResult.OK)
    {
        // Copy DataGridView results to clipboard
        copyAlltoClipboard();

        object misValue = System.Reflection.Missing.Value;
        Excel.Application xlexcel = new Excel.Application();

        xlexcel.DisplayAlerts = false; // Without this you will get two confirm overwrite prompts
        Excel.Workbook xlWorkBook = xlexcel.Workbooks.Add(misValue);
        Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        // Format column D as text before pasting results, this was required for my data
        Excel.Range rng = xlWorkSheet.get_Range("D:D").Cells;
        rng.NumberFormat = "@";

        // Paste clipboard results to worksheet range
        Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[1, 1];
        CR.Select();
        xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);

        // For some reason column A is always blank in the worksheet. ¯_(ツ)_/¯
        // Delete blank column A and select cell A1
        Excel.Range delRng = xlWorkSheet.get_Range("A:A").Cells;
        delRng.Delete(Type.Missing);
        xlWorkSheet.get_Range("A1").Select();

        // Save the excel file under the captured location from the SaveFileDialog
        xlWorkBook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlexcel.DisplayAlerts = true;
        xlWorkBook.Close(true, misValue, misValue);
        xlexcel.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlexcel);

        // Clear Clipboard and DataGridView selection
        Clipboard.Clear();
        dgvItems.ClearSelection();

        // Open the newly saved excel file
        if (File.Exists(sfd.FileName))
            System.Diagnostics.Process.Start(sfd.FileName);
    }
}

private void copyAlltoClipboard()
{
    dgvItems.SelectAll();
    DataObject dataObj = dgvItems.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Exception Occurred while releasing object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}

Всем доброго времени суток!
Хотел бы поделиться своим практическим примером экспортирования данных из таблицы DataGridView в Microsoft Excel.
Потратив около пары часов на поиск нормального примера, такового не обнаружил… Немного поэкспериментировав с имеющимся кодом, получил нужный результат!
Итак, для использования Excel приложения необходимо подключить соответствующие references, а именно:

  1. «Microsoft Office 11.0 Object Library» расположенного во вкладке COM компонентов
  2. «Microsoft.Office.Interop.Excel» расположенного во вкладке .Net компонентов

Далее прописываем
using Microsoft.Office.Interop.Excel;
Теперь нам доступен класс для запуска Excel из нашей программы. Создадим объект класса:
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Создаем рабочую книгу:
ExcelApp.Application.Workbooks.Add(Type.Missing);
Нам доступно редактирование некоторых параметров, в качестве примера изменим ширину столбцов:
ExcelApp.Columns.ColumnWidth = 15;
Задать значение ячейки можно так:
ExcelApp.Cells[1, 1 ]= "№п/п";
Для переноса данных применил такой цикл (dgvHadTovar — это имя моего компонента DataGridView):
for (int i = 0; i < dgvHadTovar.ColumnCount; i++)
{
for (int j = 0; j < dgvHadTovar.RowCount; j++)
{
ExcelApp.Cells[j + 2, i + 1 ] = (dgvHadTovar[i,j].Value).ToString();
}
}

j + 2, потому что первая строка отведена для подписей столбцов!
И для отображения полученного результата, необходимо показать документ:
ExcelApp.Visible = true;

В итоге получилась такая функция:

private void button1_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Application.Workbooks.Add(Type.Missing);
ExcelApp.Columns.ColumnWidth = 15;

ExcelApp.Cells[1, 1 ]= "№п/п";
ExcelApp.Cells[1, 2 ]= "Число";
ExcelApp.Cells[1, 3 ]= "Название";
ExcelApp.Cells[1, 4 ]= "Количество";
ExcelApp.Cells[1, 5 ]= "Цена ОПТ";
ExcelApp.Cells[1, 6 ]= "Цена Розница";
ExcelApp.Cells[1, 7] = "Сумма";

for (int i = 0; i < dgvHadTovar.ColumnCount; i++)
{
for (int j = 0; j < dgvHadTovar.RowCount; j++)
{
ExcelApp.Cells[j + 2, i + 1 ] = (dgvHadTovar[i,j].Value).ToString();
}
}
ExcelApp.Visible = true;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#region */Вывод в EXCEL и печать/*
 
        //Вывод в EXCEL и печать
 
        Excel2.Application exApp_New1 = new Excel2.Application();
        Excel2.Workbook wb_New1 = null;
        Excel2.Worksheet ws_New1 = null;
        private void button5_Click(object sender, EventArgs e)
        {
            wb_New1 = exApp_New1.Workbooks.Add(System.Reflection.Missing.Value);
            ws_New1 = (Microsoft.Office.Interop.Excel.Worksheet)wb_New1.Worksheets.get_Item(1);
            ws_New1.Cells.Locked = false;
 
            //Объединение ячеек
            Excel2.Range rangeGroup1 = (Excel2.Range)ws_New1.get_Range("A1", "C2").Cells;
            rangeGroup1.Merge(Type.Missing);
            rangeGroup1.HorizontalAlignment = XlHAlign.xlHAlignLeft;
            rangeGroup1.VerticalAlignment = XlVAlign.xlVAlignCenter;
            rangeGroup1.Font.Name = "Times New Roman";
            rangeGroup1.Font.Size = 16;
            rangeGroup1.Locked = false;
            Excel2.Range rangeGroup2 = (Excel2.Range)ws_New1.get_Range("A3", "C3").Cells;
            rangeGroup2.Merge(Type.Missing);
            rangeGroup2.HorizontalAlignment = XlHAlign.xlHAlignCenter;
            rangeGroup2.VerticalAlignment = XlVAlign.xlVAlignCenter;
            rangeGroup2.Font.Name = "Times New Roman";
            rangeGroup2.Font.Size = 12;
 
            //Ширина столбцов
            Excel2.Range rangeWidth1 = ws_New1.Range["A1", System.Type.Missing];
            rangeWidth1.EntireColumn.ColumnWidth = 60;
            Excel2.Range rangeWidth2 = ws_New1.Range["B1", System.Type.Missing];
            rangeWidth2.EntireColumn.ColumnWidth = 16;
            Excel2.Range rangeWidth3 = ws_New1.Range["C1", System.Type.Missing];
            rangeWidth3.EntireColumn.ColumnWidth = 16;
            //Оформление листа + печать
            ws_New1.PageSetup.Orientation = XlPageOrientation.xlPortrait;
            ws_New1.PageSetup.PaperSize = XlPaperSize.xlPaperA4;
            ws_New1.PageSetup.TopMargin = 1;
            ws_New1.PageSetup.RightMargin = 0.75;
            ws_New1.PageSetup.LeftMargin = 0.75;
            ws_New1.PageSetup.BottomMargin = 1;
            ws_New1.PageSetup.CenterHorizontally = true;
            //Шапка таблицы
            Excel2.Range rangeHeader1 = ws_New1.get_Range("A5", "C5").Cells;
            rangeHeader1.Font.Name = "Times New Roman";
            rangeHeader1.Font.Size = 10;
            rangeHeader1.HorizontalAlignment = XlHAlign.xlHAlignCenter;
            rangeHeader1.VerticalAlignment = XlVAlign.xlVAlignCenter;
            rangeHeader1.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
            rangeHeader1.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
            ws_New1.Cells[1, 1] = "КГБУЗ Богучанская РБ";
            ws_New1.Cells[3, 1] = "Заправка и ремонт картриджей";
            ws_New1.Cells[5, 1] = "Наименование картриджа";
            ws_New1.Cells[5, 2] = "Количество";
            ws_New1.Cells[5, 3] = "Дата";
            //Из dataGridView1 в Excel
            for (int i = 0; i < dataGridView1.ColumnCount; i++)
            {
                for (int j = 0; j < dataGridView1.RowCount; j++)
                {
                    ws_New1.Cells[j + 6, i + 1] = (dataGridView1[i, j].Value).ToString();
                    Excel2.Range rangeBord1 = ws_New1.Cells[j + 6, i + 1];
                    rangeBord1.Font.Name = "Times New Roman";
                    rangeBord1.Font.Size = 10;
                    rangeBord1.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                    rangeBord1.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                    Excel2.Range rangeBJ = ws_New1.Cells[j + 6, i + 2];
                    rangeBJ.HorizontalAlignment = XlHAlign.xlHAlignRight;
                    rangeBJ.VerticalAlignment = XlVAlign.xlVAlignCenter;
 
                }
            }
            int lastRow = ws_New1.Cells.SpecialCells(Excel2.XlCellType.xlCellTypeLastCell).Row;
            ws_New1.Cells[lastRow + 2, 1] = "ИТОГО:";
            ws_New1.Cells[lastRow + 2, 2] = label7.Text;
            Excel2.Range rangeTotal1 = ws_New1.Cells[lastRow + 2, 1];
            rangeTotal1.HorizontalAlignment = XlHAlign.xlHAlignRight;
            rangeTotal1.VerticalAlignment = XlVAlign.xlVAlignCenter;
            rangeTotal1.Font.Name = "Times New Roman";
            rangeTotal1.Font.Size = 10;
            Excel2.Range rangeTotal2 = ws_New1.Cells[lastRow + 2, 2];
            rangeTotal2.HorizontalAlignment = XlHAlign.xlHAlignRight;
            rangeTotal2.VerticalAlignment = XlVAlign.xlVAlignCenter;
            rangeTotal2.Font.Name = "Times New Roman";
            rangeTotal2.Font.Size = 10;
 
            exApp_New1.Visible = true;
            wb_New1.PrintOutEx();
            wb_New1.Close(false, missingO, missingO);
            exApp_New1.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(exApp_New1);
 
            exApp_New1 = null;
            wb_New1 = null;
            ws_New1 = null;
            System.GC.Collect();
        }
        #endregion
 
 
        //#region */Вывод в EXCEL и сохранение/*
 
        //Excel3.Application exApp_New3 = new Excel3.Application();
        //Excel3.Workbook wb_New3 = null;
        //Excel3.Worksheet ws_New3 = null;
 
        //private void button6_Click(object sender, EventArgs e)
        //{
        //    wb_New3 = exApp_New.Workbooks.Add(System.Reflection.Missing.Value);
        //    ws_New3 = (Microsoft.Office.Interop.Excel.Worksheet)wb_New3.Worksheets.get_Item(1);
        //    ws_New3.Cells.Locked = false;
 
        //    //Объединение ячеек
        //    Excel3.Range rangeGroup1 = (Excel3.Range)ws_New3.get_Range("A1", "C2").Cells;
        //    rangeGroup1.Merge(Type.Missing);
        //    rangeGroup1.HorizontalAlignment = XlHAlign.xlHAlignLeft;
        //    rangeGroup1.VerticalAlignment = XlVAlign.xlVAlignCenter;
        //    rangeGroup1.Font.Name = "Times New Roman";
        //    rangeGroup1.Font.Size = 16;
        //    rangeGroup1.Locked = false;
        //    Excel3.Range rangeGroup2 = (Excel3.Range)ws_New3.get_Range("A3", "C3").Cells;
        //    rangeGroup2.Merge(Type.Missing);
        //    rangeGroup2.HorizontalAlignment = XlHAlign.xlHAlignCenter;
        //    rangeGroup2.VerticalAlignment = XlVAlign.xlVAlignCenter;
        //    rangeGroup2.Font.Name = "Times New Roman";
        //    rangeGroup2.Font.Size = 12;
 
        //    //Ширина столбцов
        //    Excel3.Range rangeWidth1 = ws_New3.Range["A1", System.Type.Missing];
        //    rangeWidth1.EntireColumn.ColumnWidth = 60;
        //    Excel3.Range rangeWidth2 = ws_New3.Range["B1", System.Type.Missing];
        //    rangeWidth2.EntireColumn.ColumnWidth = 16;
        //    Excel3.Range rangeWidth3 = ws_New3.Range["C1", System.Type.Missing];
        //    rangeWidth3.EntireColumn.ColumnWidth = 16;
        //    //Оформление листа + печать
        //    ws_New3.PageSetup.Orientation = XlPageOrientation.xlPortrait;
        //    ws_New3.PageSetup.PaperSize = XlPaperSize.xlPaperA4;
        //    ws_New3.PageSetup.TopMargin = 1;
        //    ws_New3.PageSetup.RightMargin = 0.75;
        //    ws_New3.PageSetup.LeftMargin = 0.75;
        //    ws_New3.PageSetup.BottomMargin = 1;
        //    ws_New3.PageSetup.CenterHorizontally = true;
        //    //Шапка таблицы
        //    Excel3.Range rangeHeader1 = ws_New3.get_Range("A5", "C5").Cells;
        //    rangeHeader1.Font.Name = "Times New Roman";
        //    rangeHeader1.Font.Size = 10;
        //    rangeHeader1.HorizontalAlignment = XlHAlign.xlHAlignCenter;
        //    rangeHeader1.VerticalAlignment = XlVAlign.xlVAlignCenter;
        //    rangeHeader1.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
        //    rangeHeader1.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
        //    ws_New3.Cells[1, 1] = "КГБУЗ Богучанская РБ";
        //    ws_New3.Cells[3, 1] = "Заправка и ремонт картриджей";
        //    ws_New3.Cells[5, 1] = "Наименование картриджа";
        //    ws_New3.Cells[5, 2] = "Количество";
        //    ws_New3.Cells[5, 3] = "Дата";
        //    //Из dataGridView1 в Excel
        //    for (int i = 0; i < dataGridView1.ColumnCount; i++)
        //    {
        //        for (int j = 0; j < dataGridView1.RowCount; j++)
        //        {
        //            ws_New3.Cells[j + 6, i + 1] = (dataGridView1[i, j].Value).ToString();
        //            Excel3.Range rangeBord1 = ws_New3.Cells[j + 6, i + 1];
        //            rangeBord1.Font.Name = "Times New Roman";
        //            rangeBord1.Font.Size = 10;
        //            rangeBord1.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
        //            rangeBord1.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
        //            Excel3.Range rangeBJ = ws_New3.Cells[j + 6, i + 2];
        //            rangeBJ.HorizontalAlignment = XlHAlign.xlHAlignRight;
        //            rangeBJ.VerticalAlignment = XlVAlign.xlVAlignCenter;
 
        //        }
        //    }
        //    int lastRow = ws_New3.Cells.SpecialCells(Excel3.XlCellType.xlCellTypeLastCell).Row;
        //    ws_New3.Cells[lastRow + 2, 1] = "ИТОГО:";
        //    ws_New3.Cells[lastRow + 2, 2] = label7.Text;
        //    Excel3.Range rangeTotal1 = ws_New3.Cells[lastRow + 2, 1];
        //    rangeTotal1.HorizontalAlignment = XlHAlign.xlHAlignRight;
        //    rangeTotal1.VerticalAlignment = XlVAlign.xlVAlignCenter;
        //    rangeTotal1.Font.Name = "Times New Roman";
        //    rangeTotal1.Font.Size = 10;
        //    Excel3.Range rangeTotal2 = ws_New3.Cells[lastRow + 2, 2];
        //    rangeTotal2.HorizontalAlignment = XlHAlign.xlHAlignRight;
        //    rangeTotal2.VerticalAlignment = XlVAlign.xlVAlignCenter;
        //    rangeTotal2.Font.Name = "Times New Roman";
        //    rangeTotal2.Font.Size = 10;
 
        //    exApp_New3.Visible = true;
 
        //    wb_New3.SaveAs(@"D:" + label6.Text + "_TALON");
        //    wb_New3.Close(false, missingO2, missingO2);
        //    exApp_New3.Quit();
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(exApp_New3);
        //    exApp_New3 = null;
        //    wb_New3 = null;
        //    ws_New3 = null;
        //    System.GC.Collect();
 
        //    this.Hide();
 
        //    ////Надо сделать очистку элементов формы при сохранении и переподключение к БД
 
        //    //label6.Text = "";
        //    //textBox2.Text = "";
        //    //comboBox1.Text = null;
        //    //textBox1.Text = null;
        //    //dataGridView1.Rows.Clear();
 
        //    //DataSet ds = new DataSet();
        //    //SqlConnection cnS = new SqlConnection(connStr);
        //    //SqlCommand cmS = cnS.CreateCommand();
        //    //cmS.CommandText = "SELECT talon_ID FROM talon_List";
        //    //cnS.Open();
 
        //    //SqlDataReader rd = cmS.ExecuteReader();
        //    //while (rd.Read())
        //    //{
        //    //    int test = rd.GetOrdinal("talon_ID");
        //    //    label3.Text = Convert.ToString(rd.GetValue(test));
        //    //}
        //    //cnS.Close();
 
        //    //int oldNum;
        //    //int num;
        //    //oldNum = Int32.Parse(label3.Text);
        //    //num = 1;
        //    //label6.Text += (oldNum + num);
        //}
 
        //#endregion
 
 
        #region */Запись в БД и dataGridView1/*
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            SqlConnection conS = new SqlConnection(connStr);
            conS.Open();
            string comStr = "INSERT INTO talon_List (cart_Name_ID, talon_ID, cart_Name, cart_Count, curr_Date)" +
            "VALUES ('" + textBox2.Text + "', '" + label6.Text + "', '" + comboBox1.Text + "', '" + textBox1.Text + "', '" + dateTimePicker1.Value.ToString("dd/MM/yyyy") + "')";
            SqlCommand comS = new SqlCommand(comStr, conS);
            comS.ExecuteNonQuery();
            this.talon_ListTableAdapter.Fill(this.talonsDataSet1.talon_List);
            talon_ListTableAdapter.Update(this.talonsDataSet1.talon_List);
            this.talonsDataSet1.AcceptChanges();
            conS.Close();
            dataGridView1.Rows.Add(comboBox1.Text, textBox1.Text, dateTimePicker1.Value.ToString("dd/MM/yyyy"));
 
            double Totall = 0;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells[2].Value != null && row.Cells[2].Value.ToString() != "")
                    Totall += Convert.ToDouble(row.Cells[1].Value.ToString());
                else
                    Totall += 0;
            }
            label7.Text = Totall.ToString();
        }
        #endregion
 
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }
 
        
    }
}

what is DataGridView?
The control provides a powerful and flexible way to display data in a tabular format. You can use the DataGridView control to show read-only views of a small amount of data, or you can scale it to show editable views of very large sets of data. You can extend the DataGridView control in a number of ways to build custom behaviors into your applications.
For example, you can programmatically specify your own sorting algorithms, and you can create your own types of cells. You can easily customize the appearance of the DataGridView control by choosing among several properties. Many types of data stores can be used as a data source, or the DataGridView control can operate with no data source bound to it.
what is Excel?
Excel is a spreadsheet program from Microsoft and a component of its Office product group for business applications. Microsoft Excel enables users to format, organize and calculate data in a spreadsheet by organizing data using software like Excel, data analysts and other users can make information easier to view as data is added or changed.
Excel contains a large number of boxes called cells that are ordered in rows and columns. Data is placed in these cells. Excel is a part of the Microsoft Office and Office 365 suites and is compatible with other applications in the Office suite. The spreadsheet software is available for Windows, macOS, Android, and iOS platforms.
DataGridView to excel c#
in this article, I will explain with an example, how to export DataGridView data to an Excel file using C#.DataGridView cannot be exported directly to an Excel file and hence need to generate a DataTable dt and export the DataTable to an Excel file. The DataTable will be exported to a formatted Excel file using the ClosedXml library which is a wrapper of OpenXml.for this tutorial, I have already created the database and all the data is in datagridview.
Step # 1: Create Visual Studio Project:
Open Visual Studio. I am using Visual Studio 2019.
source code

Click on Create New Project.
Now, Select Windows Form App from Template, and Press Next, Following Window will appear. Write Project Name. I have written exporting datagridview to excel.
Now, Click Next, Following WIndow will appear.

Source Code
Select .Net Core 3.1 from Dropdown Menu. Click on the «Create» Button, Project will be created.
Step # 2: Install Nuget Package DocumentFormat.OpenXml and ClosedXml Libraries
for this, we need a document open XML sdk and closedXMl library. You can download the libraries using the following download locations.https://github.com/ClosedXML/ClosedXML
Step # 3: Design Window Forms and writes code

Source Code
The design form will look like this I have created a windows form and connected that form with the database and all the data is loaded into the windows forms application.
Importing data to datagridview.
You will need to import the following namespaces before starting the code.
Design form
DataGridView
Inside the Form Load event, the DataGridView is populated with records from the table.
DataGridview
Export DataGridView to Excel
Inside the Button Click event handler, first, a DataTable is created with columns same as that of the DataGridView, and a loop is executed over the DataGridView rows and all the data is added to the DataTable.Then a Workbook object is created to which the DataTable is added as Worksheet using the Add method which accepts DataTable and the name of the Sheet as parameters.
Once the DataTable is added as a Worksheet to the Workbook, the formatting is done by first setting the Header row background color and then applying background colors to the rows and the alternating rows of the Excel file.
Finally, the export data to and export data WorkBook is saved to the specified location on the disk. we can use that workbook as a normal excel documents or workbook. we can also create or fill and export large excel files and normal excel sheets and we can set the filename as well to set the name we have to set the name of the project and then save the name of the file as a string.
Before you write source code, you must add a reference to the Microsoft Excel object library. Right-click on your project and select Add Reference menu. After that go to the COM tab and select and add Microsoft Excel 12.0 object library. Now here is my Button click event handler where I create Excel object sender or object obj and documents, get data from DataGridView, and add rows and columns to the document.
Export data source code sample
Code Sample
sample code
Excel files
after writing the complete source code when we press the export data button the excel file will be generate and when we open the excel file we will get a look like this. all the data of database will be in excel file
Excel file
This is the completion of the guide. I hope it was easy for you to follow and understand. So, what are you waiting for? 30 Days Free Trial You can obtain the License here and begin straightaway. If you are not yet an IronPDF customer, you can try 30-day free trial to check out their available features. If you buy the complete Iron Suite, you will get all 5 Products for the Price of 2. For further details about the licensing, please follow this link to Purchase the complete Package.
You can download the software product from this link.

АЛЕКСАНДР
01.09.2015 в 03:37
как ни пытался ни получается на моем примере, возможна связь с вами чтобы показать свой пример?

ADMIN
02.09.2015 в 07:16
Что конкретно не получается?

АЛЕКСАНДР
03.09.2015 в 00:30
у меня была база на access и там была кнопка экспорта, работала она отлично , сейчас делаю похожую прогу с подключением к mysql бд , и было много ошибок, благодаря вашему примеру я все сделал ошибки не выскальзывают , но если запросить данные в datagridview то экпорт не случается но страничку excel открывает, я уже все что можно испробовал…

ADMIN
03.09.2015 в 16:59
Код отвечающий за экспорт изменяли? Если да, то добавьте его в комментарий.

АЛЕКСАНДР
05.09.2015 в 02:13
я уже сам разобрался), но у меня новый вопрос, мне нужны сделать поле поиска в таблице?

АЛЕКСАНДР
05.09.2015 в 23:39
блин нет, не разобрался, в той форме где datagridview получает данные с таблицы которая имеет связь со всеми таблицами никак не хочет работать, остальные работают почти так как и нужно

ADMIN
07.09.2015 в 09:00
Не понял: «сделать поле поиска в таблице?»… поиск в dataGridView или БД?

АЛЕКСАНДР
08.09.2015 в 08:58
да, блин может все поможешь с экспортом из бд? может быть беда в том, что таблица MyISAM? все остальные нормально экпортируются, а эта никак ваще не хочет…

ADMIN
08.09.2015 в 21:41
«никак ваще не хочет» — ; что значит? Появляются какие-то ошибки или что происходит?
Схема: БД -> DataTable -> DatagridView -> Excel файл?

АЛЕКСАНДР
09.09.2015 в 23:53
у меня 5 разных форм с подключением к таблиц, 4 из них работают так как мне и нужно, 5-ая никак не хочет, хотя там код тот же самый и на других формах он работает а на этой ошибки.
Необработанное исключение типа «System.ArgumentException» в mscorlib.dll
Дополнительные сведения: Сигнатура типа метода не совместима с Interop.

ADMIN
10.09.2015 в 11:42
Нужно убрать блоки try catch, если они конечно есть и посмотреть, где во время выполнения программы возникает исключение. И уже разбираться дальше, может быть там null, может быть там преобразование типов нельзя выполнить, причин может быть масса.
System.ArgumentException — «исключение выбрасывается, если один из передаваемых методу аргументов является недопустимым».
Как выглядит метод (сигнатура)? Что он должен принять (вход. параметры), и что он получает во время выполнения? Как выглядит строка, на которой происходит выброс исключения?

АЛЕКСАНДР
11.09.2015 в 19:05

Код:

Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Application.Workbooks.Add(Type.Missing);
ExcelApp.Columns.ColumnWidth = 20;
ExcelApp.Cells[1, 2] = "№п";
ExcelApp.Cells[1, 3] = "Пациент";
ExcelApp.Cells[1, 4] = "Врач";
ExcelApp.Cells[1, 5] = "Дата приема";
ExcelApp.Cells[1, 6] = "Время";
ExcelApp.Cells[1, 7] = "Услуга";
ExcelApp.Cells[1, 8] = "стоимость";
for (int j = 2; j <= dataGridView1.Rows.Count; j++)
{
for (int i = 2; i <= 7; i++)
{
ExcelApp.Cells[j, i] = dataGridView1.Rows[j - 2].Cells[i - 2].Value;
}
}
ExcelApp.Visible = true;

АЛЕКСАНДР
12.09.2015 в 23:18
try и catch есть только в подключении к бд. а программа ссылается на строку

Код:

ExcelApp.Cells[j, i] = dataGridView1.Rows[j - 2].Cells[i - 2].Value;

ADMIN
14.09.2015 в 04:41

Код:

for (int i = 2; i < = 7; i++)

– здесь точно 7, а не 8?
Выбрасывает исключение «System.ArgumentException»?

АЛЕКСАНДР
15.09.2015 в 04:12
да точно 7 должно быть, так как 7 столбцов и второй ответ тоже да, я не могу понять что не так то…

ADMIN
15.09.2015 в 22:34
7 столбцов в DatagridView — это да, но почему тогда в цикле обход начинается с ячейки (2,2), в которую записывается значение первого столбца DataGridView? В таком случаи «Стоимость» уже не выводится, потому что последнее значение ячейки, которое будет взято из строки в dgv, будет равно (0, 5), а не (0,6).

Код:

for (int j = 2; j < = dataGridView1.Rows.Count; j++)
{
for (int i=2; i
Dgv:
0 1 2 3 4 5 [6("Стоимость")] Count = 7
Excel:
2.1 (пропускаем) 2.2 (dgv.Rows[0].Cells[0]) 2.3(dgv[0][1]) Count=8

АЛЕКСАНДР
16.09.2015 в 20:11
я знал это, и делал так в других формах у себя чтобы где то код пациента не высвечивался (он не нужен) в данном примере дело не в количестве значений, он бы без определенных столбцов экспортировал, я если честно ваще не понимаю уже что ему не нравиться…

АЛЕКСАНДР
17.09.2015 в 18:24
вместо 7 поставил 8 и ничего не изменилось…

ADMIN
18.09.2015 в 23:47
У меня твой код экспорта работает без ошибок. Единственная проблема была только в том, что не заполнялась последняя ячейка в Excel файле.

АЛЕКСАНДР
19.09.2015 в 15:07
я нашел в чем причина, ввел блоки try и catch перед строкой с ошибкой, в общем он не может переместить столбец с временем, столбец имеет тип time, теперь он у меня все строки перекидывает а столбец со временем пустые… можешь подсказать почему он время не перекидывает в excel?

ADMIN
21.09.2015 в 06:23
Как выглядит значение в колонке time (формат какой)?

АЛЕКСАНДР
22.09.2015 в 08:32
00:00:00

АЛЕКСАНДР
22.09.2015 в 22:06
можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают,

Код:

string queryString = @"SELECT id_priema AS '№П', pacient.FIO AS 'Пациент', vrach.fio_vrach AS 'Врач',data_priema AS 'Дата', vremya AS 'Время', yslygi.opisanie AS 'Лечение', yslygi.stoimost AS  'Стоимость' FROM `priem` , `pacient`,`vrach` , `yslygi` WHERE fio_vrach LIKE '%" + textBox1.Text + "%';";

ADMIN
23.09.2015 в 16:58
Можно ToString после Value добавить.

Код:

ExcelApp.Cells[2,2] = dgv.Rows[0].Cells[ячейка с временем].Value.ToString();

«можешь помочь? есть у меня поля для поисков, но они заменяют значения а не выбирают…»
Приведенный тобой sql запрос ничего не меняет, он делает только выборку. Проблема в чём-то другом.

АЛЕКСАНДР
25.09.2015 в 06:46
Это все на этой же форме, так жэ взял рабочий код, но на этой форме он не работает… Делал я вместо ввода фамилии конкретно поиск по id , но отображал 2 строки которые явно не те которые с этим id причем что работал при 1 и 3 на остальных никак

ADMIN
25.09.2015 в 23:58
Значит либо sql запрос составлен не верно, либо что-то другое.

АЛЕКСАНДР
26.09.2015 в 14:14
Спасибо, со временем теперь все норм), жаль что я так и не успел разобрать с выборкой…

OLEG
27.09.2015 в 11:23
Если посмотреть в диспетчере задач exel не выключается а если снова нажать в нем появляется новый excel

OLEG
29.09.2015 в 07:34
exapp.quit(); написано

ADMIN
29.09.2015 в 20:09
Да, есть такая проблема.
Можно закрыть все открытые процессы (Excel) после выхода из приложения, например так:

Код:

Workbook wb = exApp.Workbooks.Add();
excelBook.Close(0);
excelApp.Quit();

Либо можно завершить процесс не закрывая приложение:

Код:

using System.Runtime.InteropServices; //добавить
exApp.Quit();
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(workSheet);
Marshal.ReleaseComObject(exApp);

Сохраняет и завершает процесс.

СЕРГЕЙ
01.10.2015 в 00:51
Что делать, если в ссылке при добавлении нет Microsoft. Office. Interop.Excel…?

РУСЛАН
01.12.2016 в 02:15
Подобная ситуация, не подскажете что сделали, а то при регистрации Microsoft.Office.Interop.Excel.dll, возникала ошибка что не зарегистрирован класс, при регистрации через regsvr32.exe /i Microsoft.Office.Interop.Excel.dll пишет что зарегистрирована, но точка входа в DllRegisterServer не найдена, что делать не пойму, через реестр руками добавлять??

СЕРГЕЙ
02.10.2015 в 10:14
Уже скачал и разобрался

МАРАТ
03.10.2015 в 07:48
Здравствуйте, попытался ваш пример использовать , но у меня выделяет красным «Worksheet» вот в этом месте…

Код:

Worksheet workSheet=(Worksheet)exApp.ActiveSheet;

что мне делать?

ADMIN
03.10.2015 в 14:45

Код:

using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using SD = System.Data;

Все добавлены?

ALEX
04.10.2015 в 22:42
У меня программа с БД Microsoft Office Access 2007 клиент с запросами на C#.
экспорт данных из DataGridView в Excel использовал ваш код .
есть одно но таблица в Excel вся растянута и читать ни читаема
под скажите как сделать желательно пример

НИКОЛАЙ
06.10.2015 в 23:20
На этой строчке вылетает workSheet.SaveAs(pathToXmlFile);
Ошибка:
Нет доступа к ‘MyFile.xls’.
Как быть?

ADMIN
07.10.2015 в 22:15
Возможно файл уже открыт и в него происходит запись или, например файл не был создан, а в него пытаются что-то записать.
Он существует по указанному пути?
Если этот файл открыть, внести изменения (любые) и нажать кнопку сохранить, то всё нормально или возникают ошибки?

НУРКАСЫМ
08.10.2015 в 12:18
у меня вопрос. Как можно(открыть) уже созданный excel документ, после редактирования которого просто сохранить его и записать в БД. С открытием файла(перенос в DTGridView) разобрался, а дальше нет

ADMIN
10.10.2015 в 02:53

Код:

//открываем
Excel.Application exApp = new Excel.Application();
Excel.Workbook workbook = exApp.Workbooks.Open(@"C:имя_файла.xlsx");
//выбираем активный лист
Excel.Worksheet worksheet = workbook.ActiveSheet;
//например, в ячейке первой строки было значение 2, а его нужно заменить на 5
workSheet.Cells[1, "A"] = 5;
//сохраняем изменения
workbook.Save();
//выход
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(workSheet);
Marshal.ReleaseComObject(exApp);

ВИКТОРИЯ
10.10.2015 в 19:44
Во время заполнения таблицы Excel на строке

Код:

workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_факультатив"].Value;
выдает ошибку: Не удается найти столбец с именем ID_факультатив. Имя параметра: columnName
private void ExportToExcel()
{
Excel.Application exApp = new Excel.Application();
exApp.Visible = true;
exApp.Workbooks.Add();
Worksheet workSheet = (Worksheet)exApp.ActiveSheet;
workSheet.Cells[1, 1] = "ID_факультатив";
workSheet.Cells[1, 2] = "Название";
workSheet.Cells[1, 3] = "Класс";
workSheet.Cells[1, 4] = "День";
workSheet.Cells[1, 5] = "Урок";
workSheet.Cells[1, 6] = "Учитель";
int rowExcel = 2; //начать со второй строки.
for (int i = 0; i <dataGridView1.Rows.Count; i++)
{
//заполняем строку
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_факультатив"].Value;  //вот здесь
workSheet.Cells[rowExcel, "B"] = dataGridView1.Rows.Cells["Название"].Value;
workSheet.Cells[rowExcel, "C"] = dataGridView1.Rows.Cells["Класс"].Value;
workSheet.Cells[rowExcel, "D"] = dataGridView1.Rows.Cells["День"].Value;
workSheet.Cells[rowExcel, "E"] = dataGridView1.Rows.Cells["Урок"].Value;
workSheet.Cells[rowExcel, "F"] = dataGridView1.Rows.Cells["Учитель"].Value;
++rowExcel;

ВИКТОРИЯ
12.10.2015 в 07:14
при этом шапку таблицы создает

ADMIN
12.10.2015 в 18:03
при этом шапку таблицы создает
Ошибка не связана с Excel, поэтому шапка и выводится.
выдает ошибку: Не удается найти столбец с именем ID_факультатив. Имя параметра: columnName
Вместо «ID_факультатив» нужно указать свойство столбца ColumnName в DataGridView, а не HeaderText — текст заголовка колонки, который будет отображаться в DataGridView. Например:

Код:

dataGridView1.Columns.Add("ID", "ID_Факультатив");
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID"].Value //OK;
workSheet.Cells[rowExcel, "A"] = dataGridView1.Rows.Cells["ID_Факультатив"].Value //Exception;

ВИКТОРИЯ
14.10.2015 в 06:15
Спасибо большое за ответ!!!!!! Тем более такой быстрый)
Уже разобралась)))))

АЛЕКСАНДР
14.10.2015 в 13:51
Уважаемые товарищи!
Если таблица 2х3, то заполнять ручками каждую ячейку вот так:

Код:

//Visual Basic
Public Sub export2excel(ByRef t As DataTable)
Dim xls = New Excel.Application
xls.Visible = False
xls.Workbooks.Add()
Dim Sheet As Excel.Worksheet = xls.Workbooks(1).ActiveSheet
Dim row As Integer, col As Integer
For row = 0 To t.Rows.Count - 1
For col = 0 To t.Columns.Count - 1
Sheet.Cells(row + 1, col + 1) = t(row)(col)
Next
Next
xls.Visible = True
End Sub

— это приемлемо.
А если у меня (в результате выполнения sql запроса к БД) получается таблица 20 колонок на 4000 строк, то это уже очень долго — минут 10 на Core i5. Может, есть какой-то способ передавать данные из DataTable в Worksheet оптом?

ADMIN
16.10.2015 в 00:23
В конце статьи есть один из способов.

АЛЕКСАНДР
17.10.2015 в 09:17
Как то я проглядел этот способ, через xml.
В итоге остановился на таком варианте:

Код:

//Visual Basic
Public Sub export2excel(ByRef t As DataTable, ByRef pgb As ProgressBar, ByVal b As Integer, ByVal e As Integer)
If pgb IsNot Nothing Then
pgb.Value = b
End If
Dim xls = New Excel.Application
xls.Visible = False
xls.Workbooks.Add()
Dim ws As Excel.Worksheet = xls.Workbooks(1).ActiveSheet
Dim arr(t.Rows.Count, t.Columns.Count) As Object
Dim row As DataRow, r As Integer = 0, col As Integer
Dim scale As Double = e - b
scale = 0.8 * scale / t.Rows.Count
For Each row In t.Rows
If pgb IsNot Nothing Then
pgb.Value = b + scale * r
End If
If r Mod 100 = 0 Then
Update() ' это чтобы приложение не "подвисало" во время работы длинного цикла
End If
For col = 0 To t.Columns.Count - 1
arr(r, col) = row(col)
Next
r = r + 1
Next
For col = 0 To t.Columns.Count - 1
ws.Cells(1, col + 1) = t.Columns(col).Caption
Next
ws.Range("A1").Resize(1, t.Columns.Count).Font.Bold = True
If pgb IsNot Nothing Then
pgb.Value = b + (e - b) * 0.9
End If
ws.Range("A2").Resize(t.Rows.Count + 1, t.Columns.Count).Value = arr
ws.Columns("A:ZZ").AutoFit()
If pgb IsNot Nothing Then
pgb.Value = e
End If
xls.Visible = True
End Sub

Тоже цикл, тоже перебирает ячейки по одной, но заполняет простой массив, а не worksheet.
Второй момент, важно использовать for each row in …, а не for row = 0… — это тоже значительно ускоряет копирование. В итоге таблица 20х4000 передаётся за несколько секунд. Вполне wиндовая скорость.
Прогрессбар можно не подавать, можно вместо него подать Nothing, тогда b и e (begin и end) — любые. Если используем ProgressBar, то подаём b>=pgb.Minimum e<=pgb.Maximum.
В теле функции я pgb.Minimum и pgb.Maximum не трогаю намеренно, потому что подразумевается, что работа функции export2excel выполняет только часть процесса, например

Код:

pgb.Minimum = 0
pgb.Maximum = 100
pgb.Value = 0
получаем таблицу DataTable t — и пусть это будет 30%
pgb.Value = 30
export2excel(t, pgb, 30, 100) — 'экспорт в эксель займёт оставшиеся 30-70%

ЭЛЬВИРА
17.10.2015 в 19:11
Не удалось получить фабрику класса COM для компонента с CLSID {00024500-0000-0000-C000-000000000046} из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Ругается на первой же строчке

ЭЛЬВИРА
19.10.2015 в 08:14
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон. Т.е. у меня в exel есть формулы и мне только нужно, чтобы программа обновляла поля, загруженные из DataGridView.

ЭЛЬВИРА
19.10.2015 в 17:24
Извините, все проблемы решила

ADMIN
21.10.2015 в 05:50
Подскажите пожалуйста, можно ли не создавать новый файл, а записывать данные уже в заранее подготовленный шаблон
Можно — это ведь обычный файл.

СЕРЖ
27.12.2016 в 22:07
Есть проблемы при экспорте из датагрид в екзель.
Вот код

Код:

private void ExportToExcel()
{
Microsoft.Office.Interop.Excel.Application exApp = new Microsoft.Office.Interop.Excel.Application();
// Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
//Книга.
ObjWorkBook = exApp.Workbooks.Add(System.Reflection.Missing.Value);
//Таблица.
ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
exApp.Workbooks.Add();
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)exApp.ActiveSheet;
workSheet.Cells.NumberFormat = “0.00”;
workSheet.Cells.Replace(‘,’, ‘.’);
workSheet.Cells[1, 1] = “x”;
workSheet.Cells[1, 2] = “Prls”;
workSheet.Cells[1, 3] = “Prlspv”;
workSheet.Cells[1, 4] = “Pvihrls”;
int rowExcel = 2; //начать со второй строки.
for (int i = 0; i < result_grid.Rows.Count; i++)
{
//заполняем строку
workSheet.Cells[rowExcel, "A"] = result_grid.Rows.Cells["x"].Value;
workSheet.Cells[rowExcel, "B"] = result_grid.Rows.Cells["Prls"].Value;
workSheet.Cells[rowExcel, "C"] = result_grid.Rows.Cells["Prlspv"].Value;
workSheet.Cells[rowExcel, "D"] = result_grid.Rows.Cells["Pvihrls"].Value;
++rowExcel;
}
string pathToXmlFile;
pathToXmlFile = Environment.CurrentDirectory + "" + "MyFile.xls";
pathToXmlFile.Replace(',', '.');
workSheet.SaveAs(pathToXmlFile);
// exApp.Quit();
exApp.Visible = true;
exApp.UserControl = true;
// GC.Collect();
// GC.WaitForPendingFinalizers();
// Marshal.ReleaseComObject(workSheet);
// Marshal.ReleaseComObject(exApp);
// Microsoft.Office.Interop.Excel.Workbook wb = exApp.Workbooks.Add();
// Microsoft.Office.Interop.Excel.Workbook.Close(0);
// exApp.Quit();
}

1. Проблема в ячейках екзель числа представлены как текст. Как это исправить?
2. Открывается не только мой файл но и еще пустая книга. Как ее убрать?

Понравилась статья? Поделить с друзьями:
  • Как сохранить dataframe в excel python
  • Как сохранит word документы в формате rtf
  • Как сосчитать ячейки в excel с текстом
  • Как сосчитать сумму столбца в excel
  • Как сосчитать строки в excel