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

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

20.06.2022, 14:13. Показов 604. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
У меня получается загрузить данные в datagridview только из одного листа excel.
Мне надо чтобы в один датагрид загрузилась инфо с всех листов сразу. Столбцы у всех листов одинаковые, меняется только содержимое.

Везде есть комбобох со списком, которий включает в себя excel листы для выбора. Мне это не годится.

У кого-нибудь есть какие-либо идеи?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.06.2022, 14:13
Ответы с готовыми решениями:

Импорт данных из нескольких листов Excel в DataGridView
Всем доброго дня. Заранее извиняюсь если окажется, что тема дублируется. подскажите решение на такой вопрос, у меня на форме есть 2...

Импорт данных из листов Excel в несколько DataGridView для каждого листа
Добрый день. Подключил библиотеку Microsoft.Office.Interop.Excel. Возникла задача - есть файл Excel .xlsx с 6 таблицами. Нужно подключить...

Импорт данных из excel в DataGridView
Здравствуйте, нужна Ваша помощь. Необходимо организовать импорт данных их Excel в datagridview c#. Возможно что-то не так с первой строкой,...

13
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
20.06.2022, 14:35
Что мешает Вам пройтись циклом по всем листам Excel?
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
20.06.2022, 15:28  [ТС]
Uswer, Я смотрел эту страницу и ничего не понял что делать.
И спасибо что написали, откликнулись.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
20.06.2022, 18:22
Felikss, использовать ADO .NET (OleDb) и в запросе SELECT использовать UNION.
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
21.06.2022, 20:30  [ТС]
Andrey-MSK, Спасибо за ответ но где писать UNION?

C#
1
2
3
4
5
6
7
8
9
10
11
12
   private void Form1_Load(object sender, EventArgs e)
        {
            OleDbConnection myExcelConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " + "Data Source =  S:\\DVKC_DS\\0_DVKC DS\\DVKC_DATABASES\\FS\\DVKC Chat\\Book1.xlsx" + ";Extended Properties=Excel 12.0;");
            myExcelConn.Open();
            OleDbCommand objOleDB = new OleDbCommand("SELECT *FROM [Sheet1$]", myExcelConn);
            OleDbDataReader objBulkReader = null;
            objBulkReader = objOleDB.ExecuteReader();
            System.Data.DataTable dt = new System.Data.DataTable();
            dt.Load(objBulkReader);
            dataGridView1.DataSource = dt;
            myExcelConn.Close(); myExcelConn = null;
}
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
28.06.2022, 08:35  [ТС]
Никто больше не знает, как это сделать?
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
28.06.2022, 08:35
Цитата Сообщение от Felikss Посмотреть сообщение
но где писать UNION
SQL
1
2
3
4
5
SELECT * FROM [Sheet1$]
UNION
SELECT * FROM [Sheet2$]
UNION
SELECT * FROM [Sheet3$]
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
28.06.2022, 09:06  [ТС]
Мне по сути не надо чтобы все листы загрузились datagridview.
Идея такова что в каждом excel листе есть дополнительные 3 столбца - true, false и название темы.
Мне надо на форму вывести в каких excel листах в строках из двух столбцах есть true. И если в строках есть true то чтобы в label вывело имя листа, название темы и в каких строках есть труе.

Добавлено через 7 минут
Andrey-MSK, А как быть если имена листов и количество неизвестно. Листы и их название создают сотрудники через форму.

Добавлено через 10 минут
Название листов в форму я импортирую так:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
 
using System.Runtime.InteropServices;
using System.Reflection;
using System.Collections;
using System.IO;
 
namespace SpellCheck
{
 
public partial class Form1 : Form
{
private string Excel07ConString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\\DVKC_DS\\0_DVKC DS\\DVKC_DATABASES\\FS\\DVKC Chat\\Book1.xlsx;Extended Properties='Excel 12.0 Xml;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text'";
string sheetName;
DataSet ds;
 
List<string> listBoxData = new List<string>();
 
 
public Form1()
{
InitializeComponent();
 
SetDataTablesFromExcel();
 
listBox1.DataSource = listBoxData;
 
}
 
private void SetDataTablesFromExcel()
{
ds = new DataSet();
using (OleDbConnection con = new OleDbConnection(Excel07ConString))
{
using (OleDbCommand cmd = new OleDbCommand())
{
using (OleDbDataAdapter oda = new OleDbDataAdapter())
{
cmd.Connection = con;
con.Open();
DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
 
for (int i = 0; i < dtExcelSchema.Rows.Count; i++)
{
sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString();
DataTable dt = new DataTable();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
oda.SelectCommand = cmd;
oda.Fill(dt);
dt.TableName = sheetName;
// comboBoxData.Add(sheetName.Replace("$",""));
listBoxData.Add(sheetName.Replace("$", ""));
ds.Tables.Add(dt);
//i++;
}
}
}
}
}
 
public int RowIndex { get; private set; }
 
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int index = listBox1.SelectedIndex;
dataGridView1.DataSource = ds.Tables[index];
}
}
}
}
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
28.06.2022, 10:23
Felikss, работа с офисными документами посредством ADO.Net это конечно хорошо, но почему Вы не хотите работать с документами как с объектами используя библиотеки Interop?
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
28.06.2022, 11:20  [ТС]
Uswer, С interop загружал так:

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
  public System.Data.DataTable LoadExcelSheetToTable1(string filename, string sheet)
        {
            System.Data.DataTable table1 = new System.Data.DataTable();
            using (System.Data.OleDb.OleDbConnection co =
            new System.Data.OleDb.OleDbConnection(
            "Provider=Microsoft.ACE.OLEDB.12.0; " +
            "Data Source='" + filename + "';" +
            "Extended Properties=\"Excel 12.0;HDR=TES;IMEX=1\""))
            using (System.Data.OleDb.OleDbDataAdapter import =
            new System.Data.OleDb.OleDbDataAdapter(
            "select * from [" + sheet + "$]", co))
                import.Fill(table1);
            return table1;
        }
 void PlaceTableToDatabase1(System.Data.DataTable table1)
        {
            ModelNepieslegts db2 = new ModelNepieslegts();
            table1.PrimaryKey = new DataColumn[] { table1.Columns["ID"] };
            foreach (DataRow row in table1.Rows)
            {
                int ID = Convert.ToInt32(row["ID"]);
 
                TWENTYNOTCLOSEDdb TWENTYNOTCLOSEDdb = db2.TWENTYNOTCLOSEDdb.Find(ID);
                if (TWENTYNOTCLOSEDdb == null)
                {
                    TWENTYNOTCLOSEDdb = new TWENTYNOTCLOSEDdb();
                    TWENTYNOTCLOSEDdb.ID = ID;
                    TWENTYNOTCLOSEDdb.Gads1 = Convert.ToString(row["Gads1"]);
                    TWENTYNOTCLOSEDdb.Numurs1 = Convert.ToString(row["Numurs1"]);
                    TWENTYNOTCLOSEDdb.Objekts1 = Convert.ToString(row["Objekts1"]);
                    TWENTYNOTCLOSEDdb.DatumsLaiks1 = Convert.ToString(row["DatumsLaiks1"]);
                    TWENTYNOTCLOSEDdb.Notikums1 = Convert.ToString(row["Notikums1"]);
                    TWENTYNOTCLOSEDdb.Rīcība1 = Convert.ToString(row["Rīcība1"]);
                    db2.TWENTYNOTCLOSEDdb.Add(TWENTYNOTCLOSEDdb);
                }
                else
                {
                    TWENTYNOTCLOSEDdb.Gads1 = Convert.ToString(row["Gads1"]);
                    TWENTYNOTCLOSEDdb.Numurs1 = Convert.ToString(row["Numurs1"]);
                    TWENTYNOTCLOSEDdb.Objekts1 = Convert.ToString(row["Objekts1"]);
                    TWENTYNOTCLOSEDdb.DatumsLaiks1 = Convert.ToString(row["DatumsLaiks1"]);
                    TWENTYNOTCLOSEDdb.Notikums1 = Convert.ToString(row["Notikums1"]);
                    TWENTYNOTCLOSEDdb.Rīcība1 = Convert.ToString(row["Rīcība1"]);
                }
            }
            foreach (TWENTYNOTCLOSEDdb TWENTYNOTCLOSEDdb in db2.TWENTYNOTCLOSEDdb)
                if (table1.Rows.Find(TWENTYNOTCLOSEDdb.ID) == null)
                    db2.TWENTYNOTCLOSEDdb.Remove(TWENTYNOTCLOSEDdb);
            db2.SaveChanges();
        }
 private String[] GetExcelSheetNames(string excelFile)
        {
            OleDbConnection objConn = null;
            System.Data.DataTable dt = null;
            try
            {
                String connString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                "Data Source=" + excelFile + ";Extended Properties=\"Excel 12.0;HDR=Yes;\";";
                objConn = new OleDbConnection(connString);
                objConn.Open();
                dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (dt == null)
                {
                    return null;
                }
                String[] excelSheets = new String[dt.Rows.Count];
                int i = 0;
                foreach (DataRow row in dt.Rows)
                {
                    excelSheets[i] = row["TABLE_NAME"].ToString();
                    i++;
                }
                for (int j = 0; j < excelSheets.Length; j++)
                {
                    // Query each excel sheet.
                }
                return excelSheets;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                if (objConn != null)
                {
                    objConn.Close();
                    objConn.Dispose();
                }
                if (dt != null)
                {
                    dt.Dispose();
                }
            }
        }
 
 private void button10_Click(object sender, EventArgs e)
        {
            
                    System.Data.DataTable table1 = LoadExcelSheetToTable1(@"\\w-fsclu1-str\STR\LE\DF\DVKC_DS\DVKC Search Engine\DVKC Search Engine\DVKC Search Engine\bin\Debug\Datubazes\2020_Gada atskaite\TWENTYNOTCLOSEDdb.xlsx", "Nepieslēgtie objekti");
                    PlaceTableToDatabase1(table1);             
                    conn = new SqlConnection("Data Source=w-fdsql1;Initial Catalog=Nepieslegtie;Integrated Security=True;TransparentNetworkIPResolution=True");
                    this.tWENTYNOTCLOSEDdbTableAdapter.Fill(this.nepieslegtieDataSet.TWENTYNOTCLOSEDdb);
 
}
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
28.06.2022, 12:11
Цитата Сообщение от Felikss Посмотреть сообщение
С interop загружал так:
В каком месте Interop?
0
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
28.06.2022, 12:41  [ТС]
Uswer, Я все равно не понимаю, как загрузить все excel листы

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
        private void button1_Click(object sender, EventArgs e)
        {
            string filename = "S:\\DVKC_DS\\0_DVKC DS\\DVKC_DATABASES\\FS\\Book1.xlsx";
            string str;
            int rCnt;
            int cCnt;
            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;
 
            ExcelWorkBook = ExcelApp.Workbooks.Open(filename, 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(1);
 
            ExcelRange = ExcelWorkSheet.UsedRange;
            for (rCnt = 1; rCnt <= ExcelRange.Rows.Count; rCnt++)
            {
                dataGridView2.Rows.Add(1);
                for (cCnt = 1; cCnt <= 2; cCnt++)
                {
                    str = (string)(ExcelRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Text;
                    dataGridView2.Rows[rCnt - 1].Cells[cCnt - 1].Value = str;
                }
            }
            ExcelWorkBook.Close(true, null, null);
            ExcelApp.Quit();
 
            releaseObject(ExcelWorkSheet);
            releaseObject(ExcelWorkBook);
            releaseObject(ExcelApp);
        }
 
        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();
            }
        
}
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
28.06.2022, 13:35
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
Using Exl = Microsoft.Office.Interop.Excel;
...
// До этого надо получить ExcelWorkBook как ссылку на конкретную книгу
// Пройдёмся по всем листам
for (int i=0; i < ExcelWorkBook.Worksheets.Count; i++)
{
    ExcelWorkSheet = ExcelWorkBook.Worksheets[i];
    DataTable resultTable = getSheetRange(ExcelWorkSheet); // Чтение данных с i-ого листа книги
    // Тут добавляем данные из таблицы куда нужно
}
 
private DataTable getSheetRange(Exc.WorkSheet sheet)
{
    DataTable res = new DataTable();
    ExcelRange = sheet.UsedRange;
    // Создадим столбцы в таблице
    for (int i=0; i < ExcelRange.Columns; i++)
    {
        res.Columns.Add()
    }
    String str;
    for (rCnt = 1; rCnt < ExcelRange.Rows.Count; rCnt++)
    {
        DataRow row = res.NewRow();
        for (cCnt = 1; cCnt < ExcelRange.Columns; cCnt++) // ??????   ExcelRange.Columns <> 2   ???????
        {
            //str = ExcelRange.Cells[rCnt, cCnt].Text;
            row[cCnt-1] = ExcelRange.Cells[rCnt, cCnt].Text;
        }
        res.Add(row);
    }
    return res;
}
Код не проверен.
1
4 / 4 / 0
Регистрация: 21.08.2016
Сообщений: 404
28.06.2022, 13:39  [ТС]
Решил свою проблему. Все excel листы загружается в datagridview.

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
  private void button2_Click(object sender, EventArgs e)
        {
            string filePaths = "S:\\DVKC_DS\\0_DVKC DS\\DVKC_DATABASES\\FS\\DVKC Chat\\Book1.xlsx";
            try
            {
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                String constr = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""", filePaths);
                OleDbConnection myConnection = new OleDbConnection(constr);
                myConnection.Open();
 
                DataTable spreadSheetData = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string sheetName = "";
                OleDbCommand onlineConnection;
                OleDbDataAdapter theDataAdapter;
                foreach (DataRow dr in spreadSheetData.Rows)
                {
                    sheetName = dr["TABLE_NAME"].ToString();
                    sheetName = sheetName.Replace("'", "");
                    if (sheetName.EndsWith("$"))
                    {
                        onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "A1:Y100" + "]", myConnection);
                        theDataAdapter = new OleDbDataAdapter(onlineConnection);
                        dt.TableName = (String.IsNullOrEmpty(dt.TableName)) ? sheetName : dt.TableName;
                        theDataAdapter.Fill(dt);
                    }
                }
                myConnection.Close();
                ds.Tables.Add(dt);
                dataGridView1.DataSource = ds.Tables[0];
                for (int i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                }
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
                }
            }
 
            catch
                (Exception ex)
            {
                MessageBox.Show("Ошибка: " + ex.Message, "Ошибка при считывании excel файла");
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2022, 13:39
Помогаю со студенческими работами здесь

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

Импорт данных из Excel в DataGridView
Нужно импортировать данные из файла в грид, а затем добавить в БД. То бишь пользователь загружает что-то из эксельки в грид, проверяет еще...

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

Импорт данных из Excel в DataGridView
Здравствуйте! Мне нужно извлечь данных из excel. У меня возникла ошибка. Как ее исправить, почему выдается ошибка? Спасибо! using...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru