Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
1

Экспорт в массив из Exel

23.05.2012, 18:52. Показов 5089. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Возник соответственно описанный в топике вопрос. Все что нагуглил относится к SQL-запросам, а к экспорту из локально расположенного xls файла ничего нету. Вопрос простой: как считать в массив данные из файла?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2012, 18:52
Ответы с готовыми решениями:

Экспорт из Exel
Вот взял готовый код, подставил в него свои данные: Процедура ПриОткрытии() Значение1=99;...

Экспорт запроса в Exel
Форумчане, подскажите как вставить данные запроса в шаблон Exel? Требуется в шаблоне заполнить...

Экспорт из WPF в EXEL
Здравствуйте! Есть вопросик... По нажатию кнопочки из разных полей на форме данные заносятся в...

Экспорт Exel в Access
Есть база данных в которую требуется по необходимости заносить сведения о районе, городе, улице,...

19
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
23.05.2012, 19:57 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
using System;
using System.Collections.Generic;
using System.Data.OleDb;
 
class Program
{
    static void Main(string[] args)
    {
        OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\1.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=NO\";");
        connection.Open();
        OleDbCommand command = new OleDbCommand("SELECT * FROM [Лист1$]", connection);
        OleDbDataReader reader = command.ExecuteReader();
        List<List<int>> list = new List<List<int>>();
        while (reader.Read())
        {
            List<int> buf = new List<int>();
            for (int i = 0; i < reader.FieldCount; i++)
                buf.Add(int.Parse(reader[i].ToString()));
            list.Add(buf);
        }
        connection.Dispose();
        for (int i = 0; i < list.Count; i++)
            Console.WriteLine(string.Join(", ", list[i]));
        Console.ReadKey(true);
    }
}
3
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.05.2012, 20:31  [ТС] 3
Петррр, я же как раз-таки сказал, что SQL-запросы есть, а просто считать локально расположенный файл я не нашел как. При чем тут oleDB?
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
23.05.2012, 21:04 4
А у меня файл не локальный?
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.05.2012, 22:23  [ТС] 5
Петррр, просто в Delphi это все делалось гораздо проще, я думал тут тоже примерно также. Ясно, спасибо.
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
23.05.2012, 22:38 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using Excel = Microsoft.Office.Interop.Excel;
 
class Program
{
    static void Main(string[] args)
    {
        Excel.Application app = new Excel.Application();
        app.Workbooks.Open("E:\\1.xlsx");
        Excel.Worksheet sheet = app.ActiveSheet;
        int[,] matrix = new int[2, 3];
        for (int i = 0; i < matrix.GetLength(0); i++)
            for (int j = 0; j < matrix.GetLength(1); j++)
                matrix[i, j] = (int)((sheet.Cells[i + 1, j + 1] as Excel.Range).Value);
        app.Quit();
        for (int i = 0; i < matrix.GetLength(0); i++)
        {
            for (int j = 0; j < matrix.GetLength(1); j++)
                Console.Write("{0, 3}", matrix[i, j]);
            Console.WriteLine();
        }
    }
}
2
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.05.2012, 23:54  [ТС] 7
То, что надо)
0
9 / 9 / 4
Регистрация: 25.09.2011
Сообщений: 23
24.05.2012, 14:38 8
Psilon, Вы считаете, что запуск Excel будет работать быстрее?
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.05.2012, 00:26  [ТС] 9
Corshun, мне нужно просто считать матрицу 6xN. Мне кажется, удобнее всего это сделать через Excel, если учесть, что нужно их выгружать из файла.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.05.2012, 20:04  [ТС] 10
using Excel = Microsoft.Office.Interop.Excel;
У меня нету такого пространства имен. С чем это может быть связано? Пробовал референс добавить, там тоже нету похожих.
Миниатюры
Экспорт в массив из Exel  
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
28.05.2012, 09:27 11
Цитата Сообщение от Psilon Посмотреть сообщение
Пробовал референс добавить
На что референс?
Нужен Microsoft.Office.Interop.Excel.dll
Скачать можно здесь
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.05.2012, 11:05  [ТС] 12
turbanoff, я думал он в стандартной поставке есть И он скачал какой-то экзешник для 2003 офиса, при попытке установки орет,что у меня десятый, а третьего нету

Все, разобрался, есть оно в стандартой поставке, просто библиотеки нету в списке библиотек, но если вручную через эксплорер скормить dll'ку, то заработает.

Добавлено через 22 минуты
Кроме того, ругается на строчку
C#
1
Excel.Worksheet sheet = app.ActiveSheet;
Ошибка 1 Не удается неявно преобразовать тип "object" в "Microsoft.Office.Interop.Excel.Worksheet". Существует явное преобразование (возможно, пропущено приведение типов)
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.05.2012, 11:17  [ТС] 13
Ладно, с этим тоже справился, но вот ваш код работать не хочет: говорит ,что пустой объект
Миниатюры
Экспорт в массив из Exel  
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
28.05.2012, 11:27 14
Скорее всего та ячейка пуста.

Добавлено через 4 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
И он скачал какой-то экзешник для 2003 офиса, при попытке установки орет,что у меня десятый, а третьего нету
Если расковырять архиватором, то можно достать dll-ку. Она там называется EXCELPIA.DLL.
Она для 2003-го, но точно работать будет и на 2007 и на 2010.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.05.2012, 11:31  [ТС] 15
turbanoff, вот документ, нет пустых клеток
Миниатюры
Экспорт в массив из Exel  
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
28.05.2012, 11:51 16
Формат ячеек посмотрети какой у Вас стоит.
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.05.2012, 12:01  [ТС] 17
Петррр, как это можно сделать? И что это за форматы? В экселе особо не работал.
0
1 / 1 / 1
Регистрация: 20.03.2016
Сообщений: 26
24.06.2016, 11:51 18
Петррр,
Как сравнивать таблицу SQL и фаил EXEL
1
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.06.2016, 18:42 19
Раз подняли такую старую тему (а это значит её кто-то может найти по поиску), то я дам, как я считаю, более правильный (быстрый) способ получения данных с листа Excel в массив и для примера выгрузки его в dataGridView

Если коротко, то вот 3 варианта. Чем они отличаются указано в комментариях

C#
1
2
3
4
5
6
7
8
9
//ВАРИАНТ 1 - если мы не знаем размер нашей таблицы, но она начинается с А1 и ниже, в таблице не должно быть пустых строк
var arrData = (object[,])xlSht.Range["A1"].CurrentRegion.Value;
            
//ВАРИАНТ 2 - если мы знаем точный размер нашей таблицы, например, A1:E50
var arrData = (object[,])xlSht.Range["A1:E50"].Value; 
            
//ВАРИАНТ 3 - если мы не знаем, где заканчивается наша таблица, но знаем начальную ячейку, например, A3 и ниже, в таблице могут быть пустые строки
int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
var arrData = (object[,])xlSht.Range["A3:E" + iLastRow].Value; //если мы знаем размер нашей таблицы, например, A1:D50

Вот весь код
Не забудьте указать вверху using Excel = Microsoft.Office.Interop.Excel; и указать ссылку на Microsoft Excel 15.0 Object Library в меню Project - Add Reference... - COM (у вас может быть не 15.0, а другая версия 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
 private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Microsoft Excel (*.xls*)|*.xls*";
            if (opf.ShowDialog() != DialogResult.OK)
            {
                MessageBox.Show("Вы не выбрали Excel файл!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string filename = opf.FileName;
            
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWB;
            Excel.Worksheet xlSht;
            Excel.Range xlRng;
            int iRow, iCol;                    
 
            xlWB = xlApp.Workbooks.Open(filename);
            xlSht = xlWB.Worksheets["Лист1"]; //имя листа с данными
 
            //ВАРИАНТ 1 - если мы не знаем размер нашей таблицы, но она начинается с А1 и ниже, в таблице не должно быть пустых строк
            var arrData = (object[,])xlSht.Range["A1"].CurrentRegion.Value;
            
            //ВАРИАНТ 2 - если мы знаем точный размер нашей таблицы, например, A1:E50
            //var arrData = (object[,])xlSht.Range["A1:E50"].Value; 
            
            //ВАРИАНТ 3 - если мы не знаем, где заканчивается наша таблица, но знаем начальную ячейку, например, A3 и ниже, в таблице могут быть пустые строки
            //int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
            //var arrData = (object[,])xlSht.Range["A3:E" + iLastRow].Value; //если мы знаем размер нашей таблицы, например, A1:D50
 
            //закрываем файл и закрываем Excel, он нам больше не нужен
            xlWB.Close(false); //false - закрываем книгу не сохраняя изменения (true - сохранить изменения)
            xlApp.Quit();
 
            //выгрузка данных в dataGridView
            dataGridView1.RowCount = arrData.GetUpperBound(0); //кол-во строк
            dataGridView1.ColumnCount = arrData.GetUpperBound(1); //кол-во столбцов
 
            for (iRow = 1; iRow <= dataGridView1.RowCount; iRow++)
            {
                for (iCol = 1; iCol <= dataGridView1.ColumnCount; iCol++)
                {
                    dataGridView1.Rows[iRow - 1].Cells[iCol - 1].Value = arrData[iRow, iCol];
                }
            }
        }
1
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
01.10.2018, 22:05 20
Pavel55, здоровья Вам!) Уже что-то
0
01.10.2018, 22:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2018, 22:05
Помогаю со студенческими работами здесь

Экспорт таблицы StringGrid в Exel
помогите пожалуйста(((((((( вроде все правильно написала:help::help::help::help::help::help::help:

Экспорт их Exel в CSV - Кодировка
Есть Exel файл. Там есть русские символы и они отображаются нормально. Но если я экспортирую в csv...

Нестандартные отчёты и экспорт в exel
Добрый день всем. Хочу спросить знатоков, где достать ссылку на примеры с hta отчётами. Так же хочу...

Экспорт трех DBChart в Exel
Короче проблема такая. Есть DBGrid. При клике на строке рисуется сложный график в DBChart....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru