Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
0 / 0 / 1
Регистрация: 09.03.2016
Сообщений: 27

Импорт Excel в DataGridView различными методами

21.04.2016, 18:01. Показов 7359. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день, реализовал 2 варианта программы для импорта Excel в DataGridView:

1
C#
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
private void browse_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Taблицы Excel'2007 (*.xlsx)|*.xlsx| Таблицы Excel'97 (*.xls)|*.xls|All files (*.*)|*.*";
            opf.RestoreDirectory = false;
            if (opf.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtPath.Text = opf.FileName;
            }
        }
        
 
 
 
        private void load_Click(object sender, EventArgs e)
        {
            txtPath.Size = new Size(450, 60);
            dataGridView1.ColumnCount = 4;
            dataGridView1.ColumnHeadersVisible = true;
 
            DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
 
            columnHeaderStyle.BackColor = Color.Beige;
            columnHeaderStyle.Font = new System.Drawing.Font("Verdana", 6, FontStyle.Bold);
            dataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;
 
            dataGridView1.Columns[0].Name = "t, s";
            dataGridView1.Columns[1].Name = "t, s";
            dataGridView1.Columns[2].Name = "P, PLCunits";
            dataGridView1.Columns[3].Name = "Pfeed, Bar";
            int From;
            int Till;
            int Sheet;
 
 
                if (txtPath.Text == "")
                    {
                        MessageBox.Show("Не указан путь к загружаемому файлу. Укажите путь к загружаемому файлу.");
                    }
                if (txtFrom.Text == "")
                    {
                        MessageBox.Show("Не указана начальная строка загружаемого диапазона. Укажите начальную строку загружаемого диапазона.");
                    }
                if (txtTill.Text == "")
                    {
                        MessageBox.Show("Не указана конечная строка загружаемого диапазона. Укажите конечную строку загружаемого диапазона.");
                    }
                if (txtSheet.Text == "")
                    {
                        MessageBox.Show("Не указан номер загружаемой таблицы. Укажите номер загружаемой таблицы");
                    }
                
            try
            {
                From = Convert.ToInt32(txtFrom.Text);
                Till = Convert.ToInt32(txtTill.Text);
                
            }
            catch
            {
 
                
            }
            System.Data.DataTable tb = new System.Data.DataTable();
 
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook ExcelWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet ExcelWorkSheet;
            Microsoft.Office.Interop.Excel.Range ExcelRange;
 
            try 
            {
 
                
                From = Convert.ToInt32(txtFrom.Text);
                Till = Convert.ToInt32(txtTill.Text);
                Sheet = Convert.ToInt32(txtSheet.Text);
                ExcelWorkBook = ExcelApp.Workbooks.Open(txtPath.Text, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false,
                    false, 0, true, 1, 0);
                ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets.get_Item(Sheet);
                ExcelRange = ExcelWorkSheet.UsedRange;
                dataGridView1.Rows.Add(Till);
                for (int rCnt = From; rCnt <= Till; rCnt++)
                {
                    dataGridView1.Rows.Add(1);
                    for (int cCnt = 1; cCnt <= 4; cCnt++)
                    {
                        
                        string str = Convert.ToString((ExcelRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value2);
                        dataGridView1.Rows[rCnt - 1].Cells[cCnt - 1].Value = str;
                    }
 
                }
                ExcelWorkBook.Close(true, null, null);
                ExcelApp.Quit();
 
                releaseObject(ExcelWorkSheet);
                releaseObject(ExcelWorkBook);
                releaseObject(ExcelApp);
            }
            catch
            
                {
                    
                }
 
        }
2
C#
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
private void browse_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Taблицы Excel'2007 (*.xlsx)|*.xlsx| Таблицы Excel'97 (*.xls)|*.xls|All files (*.*)|*.*";
            opf.RestoreDirectory = false;
            if (opf.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtPath.Text = opf.FileName;
            }
        }
 
private void button1_Click(object sender, EventArgs e)
        {
           try
            { 
                int Sheet = Convert.ToInt32(txtSheet.Text);
                //подключение к сборке Microsoft Excel Driver v12 ACEODBC
                string constr = "Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + txtPath.Text + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";
                System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr);
                con.Open();
                //объявление DataSet
                DataSet ds = new DataSet();
                //Объявление DataTable
                DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                string sheet1 = (string)schemaTable.Rows[Sheet].ItemArray[0];
                string select = String.Format("SELECT * FROM [{0}]", sheet1);
                System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con);
                ad.Fill(ds);
                DataTable tb = ds.Tables[0];
                con.Close();
                con.Dispose();
                dataGridView1.DataSource = tb;
            }
            catch
            {
                MessageBox.Show("ERROR!");
            }
        }
В 1 методе устраивало всё (возможность задания границ загружаемого диапазона, выбор таблицы для загрузки), кроме скорости загрузки в датагрид
Во 2 методе ситуация обратная, мгновенная загрузка в датагрид, но отсутствует возможность задания границ загружаемого диапазона, и выбор таблицы для загрузки.

Хотелось импортировать 2 методом, но с сохранением вышеописанных возможностей. Подскажите пожалуйста как реализовать эту функцию.

P.S. При указании ненулевого значения для переменной Sheet, которая как я понимаю отвечает за выбор загружаемой таблицы из файла Excel происходит "сдвиг" загружаемого файла. При sheet=1 загружается действительно 1 таблица, но со 2 строки 1 столбца, однако при Sheet=0 загружается 2 таблица целиком с первой строки 1 столбца.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2016, 18:01
Ответы с готовыми решениями:

Импорт из Excel в dataGridView
Ребят помогите: Нужно, чтоб при нажатие на кнопку в грид копировались данные, но только таблицы с данными , а весь остальной текст он...

Импорт из Excel в datagridview
Здравствуйте! У меня возникла проблема импорта данных excel в datagridview. В документе содержится один лист, и ячейки нужно брать, начиная...

Импорт из Excel в datagridview
Не получается вывести все строки с данными. Выводится только первая строка. OpenFileDialog opf = new OpenFileDialog(); ...

5
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
21.04.2016, 18:52
по 1-му методу никогда нельзя бегать циклами по ячейкам листа Excel - это очень медленный метод. Нужно брать данные в двумерный массив, с помощью этого двумерного массива заполнять dataTable и уже datatable привязывать через Datasource к dataGridView

по 2-му методу, вы через Select не можете взять какой-то диапазон ячеек с листа Excel? Попробуйте
C#
1
string sSql = "SELECT * FROM [Лист1$B1:D300]"
P.S. в VB.NET эта строка такая
VB.NET
1
Dim sSql As String = "SELECT * FROM [Лист1$B7:D30]"
если со всего листа, то

C#
1
string sSql = "SELECT * FROM [Лист1$]"
0
0 / 0 / 1
Регистрация: 09.03.2016
Сообщений: 27
22.04.2016, 10:49  [ТС]
Спасибо, всё заработало через команду Select
string select = String.Format("SELECT * FROM [Calculating$A110]", sheet1);[/CSHARP]
Но остаётся проблема статичности этого кода. Хотелось бы иметь возможность изменять и лист и загружаемый диапазон через 3 textBox'а. Кавычки перед SELECT и после ] не дают возможности прописать в них txtSheet.Text+"$"+txtFrom.Text+":"+txtTi ll.text

Добавлено через 38 минут
Всё заработало
Выкладываю код полностью:

C#
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Data.OleDb;
 
using System.Windows.Forms;
 
namespace Excel_to_DGV
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void browse_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Taблицы Excel'2007 (*.xlsx)|*.xlsx| Таблицы Excel'97 (*.xls)|*.xls|All files (*.*)|*.*";
            opf.RestoreDirectory = false;
            if (opf.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.txtPath.Text = opf.FileName;
            }
        }
 
            private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
 
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
 
        }
 
        private void txtPath_TextChanged(object sender, EventArgs e)
        {
            txtPath.Size = new Size(450, 60);
        }
 
        private void textTill_TextChanged(object sender, EventArgs e)
        {
 
        }
 
        private void clear_Click(object sender, EventArgs e)
        {
            txtSheet.Clear();
            txtPath.Clear();
            txtFrom.Clear();
            txtTill.Clear();
            //dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
 
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
 
           
        }
 
        private void label1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void tabPage1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
           try
            {
                string range = "SELECT * FROM " + "[" + txtSheet.Text + "$" + txtFrom.Text + ":" + txtTill.Text + "]";
                //подключение к сборке Microsoft Excel Driver v12 ACEODBC
                string constr = "Provider=Microsoft.ACE.OleDb.12.0;Data Source=" + txtPath.Text + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";
                System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr);
                con.Open();
                //объявление DataSet
                DataSet ds = new DataSet();
                //Объявление DataTable
                DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
                string select = String.Format(range, sheet1); //SELECT * FROM [Calculating$A1:D10]
                System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con);
                ad.Fill(ds);
                DataTable tb = ds.Tables[0];
                con.Close();
                con.Dispose();
                dataGridView1.DataSource = tb;
            }
            catch
            {
                MessageBox.Show("ERROR!");
            }
        }
    }
    }
0
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 9
13.12.2017, 00:18
txtPath не определен ??? что делать???
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
13.12.2017, 01:24
Цитата Сообщение от Pulsar82 Посмотреть сообщение
txtPath не определен ??? что делать???
определить его, очевидно же
0
 Аватар для rar
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 458
21.04.2018, 18:33
Цитата Сообщение от atlaskin Посмотреть сообщение
Всё заработало
Выкладываю код полностью:
Есть способ при этом заранее задать в datatable ColumnType (например ComboBox) для определенного столбца?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2018, 18:33
Помогаю со студенческими работами здесь

Импорт данных из Excel в DataGridView
Всем доброго дня! После обновления Windows 7, при импорте данных из Excel в DGV столкнулся с такой проблемой, не происходит выгрузка...

Импорт данных из Excel в DataGridView
Всем привет! Вот код, который загружает данные из Excel в DataGridView Dim MyConnection As System.Data.OleDb.OleDbConnection ...

Импорт Excel в dataGridView с progressBar
Всем привет!!!! Подскажите пожалуйста, как реализовать задуманное. Импортирую большой файл Excel в dataGridView. Это занимает минуты 2. Как...

Неправильный импорт из Excel в DataGridView
Здравствуйте. Использую такой код для импорта Excel файла в датагрид. Мой файл содержит 4 столбца, в каждом из которых в 1 строке...

Импорт данных из Excel в DataGridView
Здравствуйте, дорогие форумчане. Столкнулся с проблемой по импорту данных в VB 2010. На самом деле статей очень много и все они полезные,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru