Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2016, 11:16   #1
leks71
 
Регистрация: 25.02.2016
Сообщений: 5
По умолчанию Поиск в Excel

Приветствую, уважаемые форумчане.
Недавно начал изучать C# и вот столкнулся с такой задачей. Есть Excel таблица в ней в определенной колонке надо найти текст введенный в textBox1 и потом из этой же строки но из других ячеек вывести данные в textBox2, textBox3, textBox4. Вот так я начал:
Код:
        private void btnInfo_Click(object sender, EventArgs e)
        {
            //Проверяем наличие файла
            if (File.Exists("D:\\temp\\Книга.xlsx"))
            {
                //Создаём приложение.
                Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                //Открываем книгу.                                                                                                                                                       
                Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open("D:\\temp\\Книга.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                //Выбираем таблицу(лист).
                Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
                ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
                //Отчищаем поля
                textBox2.Clear();
                textBox3.Clear();
                textBox4.Clear();
 
               //Ищем данные в столбце "С"
                    Microsoft.Office.Interop.Excel.Range range = ObjWorkSheet.get_Range("C:C").Find(textBox1 .Text);
А вот как дальше выбрать из найденной строки нужные ячейки, не пойму.
Подскажите пожалуйста, а так же поправьте если я гдето ошибся в том что уже навоял!.
Заранее благодарен.
leks71 вне форума Ответить с цитированием
Старый 25.02.2016, 11:24   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Если нужен только xlsx формат (2007+), то там открытый OpenXML API, возьмите лучше библиотеку типа этой https://closedxml.codeplex.com, это проще, быстрее и не требует установленного офиса.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.02.2016, 12:02   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Посмотрите чего range.Row вернёт. Если не ошибаюсь, то там будет номер строки.
Если так, то можно тупо писать:
textBox2.Text = ObjWorkSheet.get_Range("A" + range.Row.ToString()).Value2;
pu4koff вне форума Ответить с цитированием
Старый 25.02.2016, 14:29   #4
leks71
 
Регистрация: 25.02.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Если нужен только xlsx формат (2007+), то там открытый OpenXML API, возьмите лучше библиотеку типа этой https://closedxml.codeplex.com, это проще, быстрее и не требует установленного офиса.
Спасибо за совет, а не могли бы вы написать пример использования
ClosedXML для открытия файла и поиска в нем данных, а то все что я нашел, только примеры на создание таблиц.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Посмотрите чего range.Row вернёт. Если не ошибаюсь, то там будет номер строки.
Если так, то можно тупо писать:
textBox2.Text = ObjWorkSheet.get_Range("A" + range.Row.ToString()).Value2;
Да действительно range.Row возвращает № строки и соответственно
Код:
textBox2.Text = ObjWorkSheet.get_Range("A" + range.Row.ToString()).Value2;
работает как надо, большое спасибо за помощь.
leks71 вне форума Ответить с цитированием
Старый 25.02.2016, 15:12   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Спасибо за совет, а не могли бы вы написать пример использования
ClosedXML для открытия файла и поиска в нем данных, а то все что я нашел, только примеры на создание таблиц.
Например просто пройти все ячейки столбца в цикле или с помощью LINQ

Код:
            string filePath = @"......xlsx";

            string textToFind = "text";

            using (var workbook = new XLWorkbook(filePath))
            {
                var worksheet = workbook.Worksheets.First();

                var column = worksheet.Column("C");

                var columnCells = column.CellsUsed();

                var cell = columnCells.First(c => c.Value.ToString().Contains(textToFind));

                var row = cell.WorksheetRow();

                Console.WriteLine(row.Cell("A").Value);
                Console.WriteLine(row.Cell("B").Value);
                Console.WriteLine(row.Cell("D").Value);
            }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 25.02.2016 в 15:37.
Alex11223 вне форума Ответить с цитированием
Старый 25.02.2016, 15:54   #6
leks71
 
Регистрация: 25.02.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Посмотрите чего range.Row вернёт. Если не ошибаюсь, то там будет номер строки.
Если так, то можно тупо писать:
textBox2.Text = ObjWorkSheet.get_Range("A" + range.Row.ToString()).Value2;
Все вроде работает, но есть маленький нюанс.
В одной из ячеек, которую надо вывести, указан № телефона вот такого типа 89993333333, и на этой ячейке выскакивает ошибка:

Необработанное исключение типа "Microsoft.CSharp.RuntimeBinder.Run timeBinderException" в PingConnectC.exe
Дополнительные сведения: Не удается неявно преобразовать тип "double" в "string"
leks71 вне форума Ответить с цитированием
Старый 22.03.2016, 11:52   #7
leks71
 
Регистрация: 25.02.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Например просто пройти все ячейки столбца в цикле или с помощью LINQ

Код:
            string filePath = @"......xlsx";

            string textToFind = "text";

            using (var workbook = new XLWorkbook(filePath))
            {
                var worksheet = workbook.Worksheets.First();

                var column = worksheet.Column("C");

                var columnCells = column.CellsUsed();

                var cell = columnCells.First(c => c.Value.ToString().Contains(textToFind));

                var row = cell.WorksheetRow();

                Console.WriteLine(row.Cell("A").Value);
                Console.WriteLine(row.Cell("B").Value);
                Console.WriteLine(row.Cell("D").Value);
            }
А не подскажите как сделать обработку события если введенный текст не найден?
leks71 вне форума Ответить с цитированием
Старый 22.03.2016, 12:03   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Например FirstOrDefault вместо First и проверять null ли cell.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.03.2016, 12:37   #9
leks71
 
Регистрация: 25.02.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Например FirstOrDefault вместо First и проверять null ли cell.
Во! Супер, Огромное спасибо за подсказку и помощь, правда для работы с ClosedXML помимо ClosedXML.dll и ClosedXML.XML нужна еще библиотека DocumentFormat.OpenXml.dll (5,5Mb), ну а вообщем работает НАМНОГО быстрее чем если все тоже делать через Microsoft.Office.Interop.Excel и к тому же не требуется установленного Excel.
leks71 вне форума Ответить с цитированием
Старый 22.03.2016, 12:45   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да. Если ClosedXML из NuGet ставить, то DocumentFormat тоже добавится сама.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 22.03.2016 в 12:48.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по Excel NewGeneration Общие вопросы .NET 0 21.05.2012 15:44
Почему Excel 2010 выполняет поиск гораздо медленнее чем Excel 2003 Sprat Microsoft Office Excel 1 25.10.2011 05:34
поиск в Excel Sega22 Общие вопросы Delphi 1 31.05.2010 09:55
Поиск в Excel Tirendus Общие вопросы Delphi 3 21.01.2010 10:39
Поиск в Excel rti Microsoft Office Excel 2 16.01.2010 00:01