Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
 
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
#1

Заполнить comboBox данными из Excel - C#

03.03.2016, 13:04. Просмотров 1140. Ответов 21

Добрый день, уважаемые знатоки
Прошу сильно не пинать, форум почитал, но не разобраться :-(
Есть на форме комбобокс, значения для него необходимо подтягивать из xls файла, колонка адреса. Подскажите пожалуйста как реализовать?
И вообще, ексель файл примерно 500 строк, по-мимо колонки с адресами, есть другие необходимые, имеет ли смысл замораживаться с ексель файлов, или может есть другое решение?
Тысячу благодарностей за ответы :-)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2016, 13:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заполнить comboBox данными из Excel (C#):

Заполнить данными combobox в datagridview - C#
Я новичок, не пинайте сильно... Заполняю данными dataGridView1 данными из таблицы Employees источник: dataGridView1.DataSource =...

.NET 4.x Как в combobox добавить значение key и value, а так же заполнить их данными? - C#
Доброго дня. Перелазив интернет, так и не нашел как в форме дизайнера добавить значения с ключем. То бишь: petya, Петр fedya, Федор ...

ComboBox.DataSource и DataView: как заполнить ComboBox - C#
Добрый вечер! Прочитал в книге, что "В результирующем DataView, будут видимы все столбцы исходный таблицы". То есть предположим если мы...

Заполнение combobox данными из БД mysql - C#
Здравствуйте товарищи программисты! У меня возник такой вопрос. Ломал долго голову, лазим через дебаггер в свойства объекта но ничего не...

Заполнить DataGridView данными из коллекции - C#
Добрый день. Я никогда не работала с ДатаГрид, но необходимо доделать одно задание. В винформе вводим данные книги. Нажимаем Save. Данные...

Заполнение comboBox данными из ячейки datagridview - C#
В datagridview выводится таблица из SQL, в одном из столбцов хранятся данные для заполнения comboBox, данные для каждого comboBox записаны...

21
kimisu
21 / 21 / 10
Регистрация: 11.08.2015
Сообщений: 69
Завершенные тесты: 7
03.03.2016, 16:53 #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
using Microsoft.Office.Interop.Excel;
using Application = Microsoft.Office.Interop.Excel.Application;
string IXls.GetOneCellData(string filename, int sheet, int col, int row)
        {
            Application excelApp = new Application();
            _Workbook excelWorkBook = excelApp.Workbooks.Open(filename, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false,
                false, 0, true, 1, 0);
            Worksheet excelWorkSheet = (Worksheet)excelWorkBook.Worksheets.Item[sheet];
            Range excelRange = excelWorkSheet.UsedRange;
            string val = "";
            if ((excelRange.Cells[row, col] as Range)?.Value2 != null && (excelRange.Cells[row, col] as Range).Value2.ToString() != string.Empty && (excelRange.Cells[row, col] as Range).Value2.ToString() != "")
                val = ((excelRange.Cells[row, col] as Range).Value2).ToString();
            excelWorkBook.Close(false, filename, null);
            excelApp.Quit();
            ReleaseObject(excelWorkBook);
            ReleaseObject(excelApp);
            return val;
        }
void ReleaseObject(object obj)
        {
            try
            {
                Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(@"Unable to release the object " + ex);
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }
1
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
03.03.2016, 20:37  [ТС] #3
Спасибо! Пока на работе был, получилось вот так. Сейчас твой пример буду разбирать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  private void GetExcel()
        {
            string path = "C:\\11.xlsx"   ;
            var exApp = new Excel.Application();
            var exBook = exApp.Workbooks.Open(path);
            if (exBook == null) throw new ArgumentNullException("exBook");
            var ExSheet = (Excel.Worksheet)exBook.Sheets[1];
            var lastcell = ExSheet.Cells.SpecialCells(Type: XlCellType.xlCellTypeLastCell);
            //string[,] list = new string[lastcell.Row, lastcell.Column];
            List<List<string>> list = new List<List<string>>();
            for (int i = 0; i < lastcell.Column; i++) //Все колонки
            {
                list.Add(new List<string>());
                for (int j = 0; j < lastcell.Row; j++) //строки
                    list[i].Add(ExSheet.Cells[j + 1, i + 1].Value.ToString());
            }                                       
            // ReSharper disable once CoVariantArrayConversion
            comboBox1.Items.AddRange(items: list[0].ToArray());
            exBook.Close(false, Type.Missing, Type.Missing);
            exApp.Quit();
            GC.Collect();
        }
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
03.03.2016, 21:05  [ТС] #4
С колонкой из 9 строк работало, а с колонкой адресов исключение
Подскажите пожалуйста что не так
0
Миниатюры
Заполнить comboBox данными из Excel  
kimisu
21 / 21 / 10
Регистрация: 11.08.2015
Сообщений: 69
Завершенные тесты: 7
04.03.2016, 00:34 #5
цикл for измени на
C#
1
for (int i = 1;i<= lastcell; i++)
т.к. индекса 0 не существует
и использование .Value или .text, как правило, плохая идея, потому что вы не можете получить реальное значение из ячейки, и они медленнее, чем .Value2
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
04.03.2016, 08:20  [ТС] #6
Да, спасибо. Потом проблема была здесь
C#
1
2
                    list[i].Add(ExSheet.Cells[j + 1, i + 1].Value.ToString());
            }
Исправил на list[i-1]

А с чем связано медленное выполнение этого кода?
0
kimisu
21 / 21 / 10
Регистрация: 11.08.2015
Сообщений: 69
Завершенные тесты: 7
04.03.2016, 13:47 #7
.Text gives you a string representing what is displayed on the screen for the cell. Using .Text is usually a bad idea because you could get ####

.Value2 gives you the underlying value of the cell (could be empty, string, error, number (double) or boolean)

.Value gives you the same as .Value2 except if the cell was formatted as currency or date it gives you a VBA currency (which may truncate decimal places) or VBA date.

Using .Value or .Text is usually a bad idea because you may not get the real value from the cell, and they are slower than .Value2
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
04.03.2016, 18:58  [ТС] #8
блин, подскажите пожалуйста с ошибкой в этом куске...непонимаю
C#
1
2
3
4
5
6
7
8
for (int i = 1; i < lastcell.Column; i++) //Все колонки
            {
                list.Add(new List<string>());
                for (int j = 0; j < lastcell.Row; j++) //строки
                    list[i-1].Add(ExSheet.Cells[j + 1, i + 1].Value2.ToString());
            }                                       
            // ReSharper disable once CoVariantArrayConversion
            comboBox1.Items.AddRange(items: list[0].ToArray());
0
Миниатюры
Заполнить comboBox данными из Excel  
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
05.03.2016, 21:39  [ТС] #9
разобрался,в ексель файле была пустая колонки, добавил проверку

Добавлено через 23 часа 57 минут
А может подскажет кто еще, как в зависимости от адреса выбрать и показать изображение из папки? Т.е, есть папка, в ней ~500 .gif, названы они по адресам...например, если в комбобоксе выбрать адрес Шевченко 8а, в этой папке есть картинка с таким же названием, ее нужно показать на следующей форме. Каким образом можно перебирать названия изображений в указанном каталоге?
0
kimisu
21 / 21 / 10
Регистрация: 11.08.2015
Сообщений: 69
Завершенные тесты: 7
06.03.2016, 00:37 #10
Как-то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            string[] file = Directory.GetFiles(@"someDirectory", "someName*");
            if (file.Length == 1)
            {
                Image newImg = Image.FromFile(file[0]);
                Size _size = new Size(newImg.Size.Width, newImg.Size.Height);
                PictureBox picture = new PictureBox
                {
                    Name = "pictureBox",
                    Size = _size,
                    Location = new Point(14, 17)
                };
                this.Controls.Add(picture);
                picture.Image = newImg;
            }
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
06.03.2016, 06:53  [ТС] #11
Цитата Сообщение от kimisu Посмотреть сообщение
string[] file = Directory.GetFiles(@"someDirectory", "someName*");
\
Я, конечно, прошу прощения за глупый вопрос, но все же: вместо "someName* можно указать переменную со значением комбобокса?
0
kimisu
21 / 21 / 10
Регистрация: 11.08.2015
Сообщений: 69
Завершенные тесты: 7
06.03.2016, 15:13 #12
если у тебя значение в комбобоксе соответствует названию файла то как-то так
C#
1
string[] file = Directory.GetFiles(@"someDirectory", combobox.SelectedItem.ToString()+"*");
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
06.03.2016, 18:48  [ТС] #13
Да, соответствует, премного благодарен :-)
0
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
07.03.2016, 07:04  [ТС] #14
Как-то криво заполняется, не пойму. И AutoSize есть выставить, все равно...
0
Миниатюры
Заполнить comboBox данными из Excel  
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 39
07.03.2016, 12:58  [ТС] #15
Вопрос снят, разоврался.
А вот еще, можно как-то закэшировать данные, полученные из экселя? Сейчас, при нажатии Назад он снова считывает эксель файл.

Добавлено через 2 часа 19 минут
т.е. файл считывается так
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
public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            GetExcel();
        }
 
        public void GetExcel()
        {
            string path = "C:\\data.xlsx";
            var exApp = new Excel.Application();
            Excel.Workbook exBook = exApp.Workbooks.Open(path);
            if (exBook == null) throw new ArgumentNullException("exBook");
            Excel.Worksheet exSheet = (Excel.Worksheet)exBook.Sheets[1];
            var lastcell = exSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);
            //string[,] list = new string[lastcell.Row, lastcell.Column];
            List<List<string>> list = new List<List<string>>();
            for (int i = 0; i < lastcell.Column; i++) //Все колонки 
            {
                list.Add(new List<string>());
                for (int j = 0; j < lastcell.Row; j++) //строки 
                {
                    //var t = exSheet.Cells[i, j].Value.ToString();
                    if (exSheet.Cells[j + 1, i + 1].Value2 != null)
                    {
                        var t = exSheet.Cells[j + 1, i + 1].Value2.ToString();
                        list[i].Add(t);
                    }
                }
            }
            if (comboBox1 != null) comboBox1.Items.AddRange(list[0].ToArray());
            exBook.Close(false, Type.Missing, Type.Missing);
            exApp.Quit();
            GC.Collect();
        }
Возвращаемся по кнопке назад так:
C#
1
2
3
 Form3 f3 = new Form3();
            this.Visible = false;
            f3.Show();
И получается снова загружаем форму 3 вместе с методом public void GetExcel().
Можно GetExcel() выполнить один раз, а дальше работать только уже с массивом во всех формах?
0
07.03.2016, 12:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2016, 12:58
Привет! Вот еще темы с ответами:

Соотнесение ComboBox.Text с определенным данными... - C#
Всем привет!!!! Из темы наверно мало понятна суть) объясню: Например имеем комбобокс, в нем значения: Анализ лога Монитор ф/п ...

Как заполнить Items ComboBox'a из Items другого ComboBox'a - C#
Есть комбобокс на главной форме и комбобокс на Form2. Необходимо заполнить айтемс комбобокса на Form2 из айтемс комбобокса на первой форме....

Заполнить dataGridView данными из txt файла - C#
Доброго времени суток.Есть txt файл вида: 5,742 38,445 52,173 20,416 28,3305 18,106 5,2965 37,818 51,986 45,738 26,3615 17,9135...

Заполнить DataGridView данными из нескольких TextBox - C#
Здравствуйте, господа. Уже час пытаюсь что-то сделать с DataGridView, но ни черта не получается. Помогите, пожалуйста, заполнить таблицу из...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru