Выгрузка информации из dataGridView в Excel
18 июля 2022 108 просмотров
Собственно, возьмем нашу залипуху отсюда и добавим сиськи интересующий нас функционал.
Для работы с ехелем нам понадобится кой-чего подключить:

Далее выбираем "COM" и ищем там ехель (будьте здоровы):

Ну, собственно, можно приступать к писанине (приведу тут код полностью, чтобы было):
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using Excel = Microsoft.Office.Interop.Excel;
namespace dgv_form
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static string connect = "Server=92.126.251.58;database=pdpdb;port=3306;Uid=" + Program.username + ";pwd=" + Program.password;//параметры подключения
MySqlConnection pconn = new MySqlConnection(connect);//создаем подключение
string sqlsel = "SELECT name, place FROM list;";//сочиняем какой запрос хотим передать базе
private void Form1_Activated(object sender, EventArgs e)
{
try
{
pconn.Open();//открываем соединение
MySqlCommand command = new MySqlCommand(sqlsel, pconn);//не забываем про параметры
command.CommandText = sqlsel;
MySqlDataReader reader = command.ExecuteReader();//читаем
DataTable table = new DataTable();//делаем табличку
table.Load(reader);//заполняем табличку из ридера
dataGridView1.DataSource = table;//указываем источник инфы для dataGridView
pconn.Close();//не забываем закрыть соединение
}
catch
{
MessageBox.Show("not OK");//что-то пошло не так
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();//да, при закрытии этой формы — приложение закрывается тоже
}
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.E && e.Control)//это типа Ctrl+E
{
try
{
Excel.Application exapp = new Excel.Application();//создаем приложение Excel
exapp.Workbooks.Add();//добавляем книгу
Excel.Worksheet wsheet = (Excel.Worksheet)exapp.ActiveSheet;//и лист
int line = 0, col = 0;//так надо, поверьте
for (line = 0; line <= dataGridView1.RowCount - 2; line++)
{
for (col = 0; col < dataGridView1.ColumnCount - 0; col++)
{
wsheet.Cells[1, col + 1] = dataGridView1.Columns[col].HeaderText.ToString();//заголовки
wsheet.Cells[line + 2, col + 1] = dataGridView1[col, line].Value.ToString();//содержимое
exapp.Columns.AutoFit();//автоширина ячеек
}
}
//и вот здесь уже можно было бы показывать окно экселя, но мы немножечко страдаем чувством прекрасного и хотим выделить то, что у нас заполнилось
int nline = line + 1;//в параметрах метода get_Range математика сосёт жопу, из-за того, что там тип string
string str = @"ABCDEFGHIJKLMNOP";//для наших целей этого более чем достаточно
char xchar = str.ElementAt(col-1);//забираем из строки выше 1 из элементов
Excel.Range _ln = (Excel.Range)wsheet.get_Range("A1", Char.ToString(xchar) + nline);//выделяем диапазон ячеек
_ln.Columns.BorderAround(Color: 3, LineStyle: 1, Weight: Excel.XlBorderWeight.xlThick);//рисуем границу
exapp.Visible = true;//показываем окно Excel
}
catch
{
MessageBox.Show("Установите Excel");//очевидно, что чтобы работать с Excel — на компе должен быть Excel =)
}
}
}
}
}
Ну и, конечно же, проверяем результат:

Загружается всякое:

А теперь мы коварно жмакаем Ctrl+E:
Что и требовалось доказать. Код, как всегда, откомментирован насмерть.
upd Если есть желание сделать границы для каждой ячейки, то убираем вот этот кусок кода:
int nline = line + 1;
string str = @"ABCDEFGHIJKLMNOP";
char xchar = str.ElementAt(col-1);
Excel.Range _ln = (Excel.Range)wsheet.get_Range("A1", Char.ToString(xchar) + nline);
_ln.Columns.BorderAround(Color: 3, LineStyle: 1, Weight: Excel.XlBorderWeight.xlThick);
А в цикл добавляем:
Excel.Range mrange = wsheet.UsedRange;//берем текущий "диапазон"
mrange.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;//и задаем
mrange.Borders.Weight = Excel.XlBorderWeight.xlThin;//параметры "обводки"
Тогда получим вот такой результат:

