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, а именно:
- «Microsoft Office 11.0 Object Library» расположенного во вкладке COM компонентов
- «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.
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.
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
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.
DataGridView
Inside the Form Load event, the DataGridView is populated with records from the table.
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
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
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. Открывается не только мой файл но и еще пустая книга. Как ее убрать?