Satyabrata Samantaray Ответов: 1

Экспорт данных из datagridview в excel очень медленный


Привет, я здесь новенькая .Также новичок в .net . Когда я экспортирую данные из DataGridview в Excel с помощью события нажатия кнопки ,это очень медленно и занимает много времени.В будущем я буду хранить пылинки более 3000 записей . так что, пожалуйста, предложите мне более толстый путь. Я использую форму windows.

Что я уже пробовал:

{
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
            worksheet = workbook.Sheets["Sheet1"];
            worksheet = workbook.ActiveSheet;
            worksheet.Name = "AssetAllocatedtoEmployee";

            for (int i = 1; i < dataGridView1.Columns.Count+1; i++)
            
            {
                worksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
            }

            {

                for (int i =    0; i < dataGridView1.Rows.Count; i++)
                {
                    for (int j = 0; j < dataGridView1.Columns.Count; j++)
                    {
                        worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                    }
                }

                var saveFileDialog = new SaveFileDialog();
                saveFileDialog.FileName = "AssetAllocatedtoEmployee";
                saveFileDialog.Filter = "Excel files(2007)|*.xlsx";
                if (saveFileDialog.ShowDialog()==DialogResult.OK)
                {
                    workbook.SaveAs(saveFileDialog.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                    
                }

Maciej Los

У вас компонент DataGridView привязан к источнику данных, bindingsource?
Откуда берутся данные?

Satyabrata Samantaray

строка запроса = "";
if (comboBox1.SelectedIndex == 10)
{
Ящик для сообщений.Показать("выберите критерии для поиска");
}
if (comboBox1.SelectedIndex == 0)
{
query = "select * from tblAssetMaster where Branch_EmpID like '%" + textBox5.Text.Trim() + "%'";
}
else if (comboBox1.SelectedIndex == 1)
{
query = "select * from tblAssetMaster where SerialNumber like '%" + textBox5.Text.Trim() + "%'";
}
else if (comboBox1.SelectedIndex == 2)
{
query = "select * from tblAssetMaster where UINNumber like '%" + textBox5.Text.Trim() + "%'";
}
//UINNumber
// серийный_номер
против.Открыть();
Sqlcommand, который cmd6 = новый sqlcommand, который(запрос, кон);

Класс sqldatareader sqlReader6 = cmd6.Метода executereader();

если (sqlReader6.HasRows)

{
DataTable dt = новый DataTable();

DataTable dt1 = новый DataTable();

dt.Load(sqlReader6);

ст1 = ДТ.DefaultView.ToTable(true);

dgv1.Источник данных = ст1;

foreach (DataGridViewBand band in dgv1.Columns)
{
группа.Толькочтение = истина;
}

}
против.Закрывать();

CHill60

Это не решение вашей проблемы, но ваши SQL - операторы уязвимы для атаки SQL-инъекций-никогда не объединяйте строки для создания sql-операторов. Видеть SQL-инъекция - Википедия[^]
Предотвращение инъекций SQL · серия шпаргалок OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]

1 Ответов

Рейтинг:
12

CHill60

Есть пара вещей, которые ты можешь попробовать..

Предполагая, что это копия по ячейкам, которая занимает время, вы могли бы отбросить

.ToString()
в
worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
Или,
Вы можете сначала экспортировать его в CSV, а затем сохранить в формате .xlsx (проверьте форматирование, когда вы это делаете) - например, см. Эту статью CodeProject Экспорт DataGridview В Excel[^].

Не тот метод, который я бы защищал, но некоторые люди имеют некоторый успех, используя копирование/вставку, например, см. c# - как мгновенно экспортировать данные dataGridView в Excel при нажатии кнопки?[^] Пожалуйста, будьте осторожны, если вы идете по этому маршруту - убедитесь, что вы действительно вставляете туда, куда вы думаете, что вставляете!

Другим решением может быть отказ от взаимодействия и использование вместо него Open XML - Добро пожаловать в Open XML SDK 2.5 для Office | Microsoft Docs[^]

Или,

Почему бы не отбросить промежуточный datagridview полностью и не экспортировать данные из SQL непосредственно в Excel - например Экспорт полной базы данных в файл Excel[^] (извините, что он внутри VB.NET но в интернете есть бесплатные утилиты для конвертации)

Edit - если вы хотите сравнить тайминги, взгляните на эту статью CP Как измерить время выполнения в C#[^]