Выгрузка информации из dataGridView в Excel
Выгрузка информации из dataGridView в Excel

Выгрузка информации из 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;//параметры "обводки"

Тогда получим вот такой результат:

вариант 2