C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: импорт данных из экселя в Си  (Прочитано 10749 раз)
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


импорт данных из экселя в Си
« : 13 Январь 2014, 10:06:26 »

есть форма на форме есть несколько полей Edit есть экселевский файл. Необходимо считать его и данные из столбцов записать в поля Edit реально?! и если да то как?!
Точнее даже может проще просто считать данные из экселя ?! а переносить не надо, но тчобы было отображение в Edit и получается есть данные в эксель

артикул     цена

Чтобы когда мы ввели артикул в поле label "выпала" цена
Или подскажите как это реализовать)

« Последнее редактирование: 13 Январь 2014, 10:51:36 от leoboec » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #1 : 13 Январь 2014, 12:38:13 »

Все реально. Excel через OLE. См. примеры в интернете и на форуме, например: https://cbuilder.ru/index.php/topic,1109.0.html
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #2 : 20 Январь 2014, 11:58:27 »

Спасибо! много чем помогли эти уроки! Нопо ходу действия возникло несколько вопросов

Написал обработчик нажатия кнопки

Код
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Variant App, Sh;
String File;
 
try {
  App=Variant::GetActiveObject("Excel.Application");
 } catch(...){
         // Excel не запущен - запустить его
    try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
     Application->MessageBox("Невозможно открыть Microsoft Excel!"
    "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
 }    }
 
 try {
   if(File!="")
    App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());
   else
    App.OlePropertyGet("WorkBooks").OleProcedure("add");
 
   Sh=App.OlePropertyGet("WorkSheets",1);
 } catch(...) {
   Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                        "Ошибка",MB_OK+MB_ICONERROR);
 }
 
 // Даем название нашему листу "Наш лист итогов"
Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
Sh.OlePropertySet("Name", "123");
 
//-------------------
 
// Сохраняем файл как "Firm.xls"
App.OlePropertySet("DisplayAlerts", false);
App.OlePropertyGet("WorkSheets",1).OleProcedure("SaveAs","Firm.xls");
 
//закрытие файла
try{
App.OlePropertyGet("WorkBooks",1).OleProcedure("Close");
}catch(...){
ShowMessage("Не забудьте сами закрыть Excel.");
}
// закрыть сам Excel
App.OleProcedure("Quit");
}

возникли вопросы:
1) при таком написании почему то возникает ошибка именно на поиск активного открытого экселя.... новый процесс создается нормально
2) переименовать файл и лист да понятно.. как сохранить этот файл скажем в подпапку проекта?! ну к примеру проект/1/file.xls только получается не полный путьпрописывать а безусловная ссылка или ... не помнюк ак называется... и найти сразу не смог...
3) с закрытием рпоцесса... Если я пишу App.OleProcedure("Quit"); то эксель закрывается... а если открыты другие документы???! как быть?!
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #3 : 20 Январь 2014, 15:39:50 »

1. Ошибка вполне может возникать по разным причинам. Лучше отлови конкретную ошибку и посмотри, что пишет:
Код
try {
try {
App = NULL;
App = Variant::GetActiveObject("Excel.Application");
}
catch(EOleSysError& err) { // ошибка чисто OLE сервера
Application->ShowException(&err); throw;
}
catch(Exception& err) { // другая ошибка, образованная от Exception
Application->ShowException(&err); throw;
}
catch(...) { // вообще "левая" ошибка...
throw;
}
}
catch(...) {
try {
App = NULL;
App = Variant::CreateObject("Excel.Application");
}
catch(EOleSysError& err) { // ошибка чисто OLE сервера
Application->ShowException(&err); return;
}
catch(Exception& err) { // другая ошибка, образованная от Exception
Application->ShowException(&err); return;
}
catch(...) { // вообще "левая" ошибка...
return;
}
}
 

У меня, кстати, бывало, что ошибка вылетает при запуске программы из студии в режиме Debug, а в Release версии при запуске из системы ошибок нет - OLE сервер находился без проблем...

2. А какие проблемы? Можно и с полным путем сохранить:
Код
oBook = App.OlePropertyGet("WorkBooks").OleProcedure("Add"); // создаем новую книгу
oBook.OleProcedure("SaveAs", WideString(IncludeTrailingBackslash(ExtractFileDir(Application->ExeName)) + "DIR\\Firm.xls")); // сохраняем книгу в подпапку DIR
 

3. Надо проверять, открыты ли другие книги. Если нет - Quit, если да - ничего не делать. Т.е. надо читать свойство Count коллекции Workbooks.
« Последнее редактирование: 20 Январь 2014, 15:45:11 от S0mbre » Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #4 : 30 Январь 2014, 06:02:13 »

по 3 пункту не совсем понял..... точнее еще одно уточнение... хорошо я увидел count больше 1 ничего не делаю, но потом при повторных запусках программы он также ничего не будет делать и в то же время процессы excel будут накапливаться в системе... верно?! а ка кэтого избежать....
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #5 : 30 Январь 2014, 09:31:24 »

точнее чем больше думаю.. тем больше вопросов...
Касаемо экселя возникли следующие вопросы...
1) Когда его лучше открывать?! поянсю. Вот у меня есть программа в ней есть поля Edit, Checkbox, ComboBox, Button, Label когда я ввожу данные в edit или выбираю ChekBox или выбираю из Combobox или нажимаю Button у меня должно появиться определенное значение в Label.. Тогда получается что формально эксель открытый нужен при запуске самой программы?! а дальше я только проверяю активно ли этот файл?! верно?!
2) Возможно ли при вводе значений в Edit или выборе из Combobox какого то параметра  происходил поиск значения в эксель соответствующий этому параметру (ну допустим я ввожу или выбираю из combobox'a "синий" он ищет это значение в экселе и в Label выдает "3" как пример?!).
3)  Уточнение про Combobx как бы хотел сделать....  я же ввожу значение посимвольно то есть "с" "и" "н" "и" "й" . ВОзможно ли чтобы при вводе симовлов он мне выдавал (искал соответствующие варианты ) в эксель?! к примеру я ввел с он выдал синий серый и я уже выбираю, чтобы вводить не полностью
« Последнее редактирование: 30 Январь 2014, 09:37:30 от leoboec » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #6 : 30 Январь 2014, 10:30:15 »

Цитата: leoboec от 30 Январь 2014, 09:31:24
точнее чем больше думаю.. тем больше вопросов...
Касаемо экселя возникли следующие вопросы...
1) Когда его лучше открывать?! поянсю. Вот у меня есть программа в ней есть поля Edit, Checkbox, ComboBox, Button, Label когда я ввожу данные в edit или выбираю ChekBox или выбираю из Combobox или нажимаю Button у меня должно появиться определенное значение в Label.. Тогда получается что формально эксель открытый нужен при запуске самой программы?! а дальше я только проверяю активно ли этот файл?! верно?!
2) Возможно ли при вводе значений в Edit или выборе из Combobox какого то параметра  происходил поиск значения в эксель соответствующий этому параметру (ну допустим я ввожу или выбираю из combobox'a "синий" он ищет это значение в экселе и в Label выдает "3" как пример?!).
3)  Уточнение про Combobx как бы хотел сделать....  я же ввожу значение посимвольно то есть "с" "и" "н" "и" "й" . ВОзможно ли чтобы при вводе симовлов он мне выдавал (искал соответствующие варианты ) в эксель?! к примеру я ввел с он выдал синий серый и я уже выбираю, чтобы вводить не полностью

Все, что перечислил, возможно.
1. Если Excel тебе нужен только однократно (выгрузил в него - закрыл), тогда лучше в обработчике кнопки все делать: создал объект приложения, отработал, сохранил, закрыл. Если же нужно еще что-то с ним делать (например, как ты хочешь, организовать поиск и т.д.), тогда лучше, конечно, открывать Excel заранее - при запуске программы, например. А закрывать его при закрытии программы.
2. YES. Смотри, как организуется поиск на VBA (макросом) - и переведи все это дела на OLE C++.
3. YES. См. пункт выше. Для инкрементного поиска (ты, кажется, его имел в виду) требуется лишь обрабатывать событие OnChange твоего едита.
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #7 : 30 Январь 2014, 11:52:24 »

попытался перенести открытие экселя в тело формы

Код
_fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
 
 
 
try {
  App=Variant::GetActiveObject("Excel.Application");
 } catch(...){
         // Excel не запущен - запустить его
    try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
     Application->MessageBox("Невозможно открыть Microsoft Excel!"
    "Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
 }    }
 
 try {
   if(File!="")
    App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());
   else
    App.OlePropertyGet("WorkBooks").OleProcedure("add");
 
   Sh=App.OlePropertyGet("WorkSheets",1);
 } catch(...) {
   Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                        "Ошибка",MB_OK+MB_ICONERROR);
 }
 
 // Даем название нашему листу "Наш лист итогов"
Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
Sh.OlePropertySet("Name", "5555");
 
//-------------------
 
// Сохраняем файл как "Firm.xls"
App.OlePropertySet("DisplayAlerts", false);
App.OlePropertyGet("WorkSheets",1).OleProcedure("SaveAs",WideString(IncludeTrailingBackslash(ExtractFileDir(Application->ExeName)) + "123\\123.xls"));
 
 
 
}

на данном этапе не закрываю файл... при компиляции проекта выдает ошибку принтскрин прилагаю... Если запускаю exe то ошибку не выдает, но только первый раз... ка ктолько Excel попадает в процессы выдается сообщение "Ошибка" принт прилагаю... куда копать?!

вот на что обратил внимание....  когда запускаю exe фвйл, то создается процесс экселевский... и далее он подвисает... запускаю второй раз выдает ошибку которая ниже в скрине. запускаю эксель ручками ничего не вижу просто книга и все... убиваю экселевский процесс, запускаю эксель ручками заново и у меня появляется сбоку что файл был неудачно закрыт и имя файла того который создает exe программа... то есть я так понимаю что он не выполняет App=Variant::GetActiveObject("Excel.Application"); и сразу пытается создать файл но с таким же именем... откуда и вылазиет ошибка.... .. то же самое думаю и при дебаге.... он не выполняет пэту строчку и выдает ошибку... но вот почему....
« Последнее редактирование: 30 Январь 2014, 12:07:43 от leoboec » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #8 : 30 Январь 2014, 12:46:28 »

Думаю, что для современных версий Excel GetActiveObject() вообще не нужно. Просто каждый раз создавай новый процесс методом CreateObject() и в конце убивай его смело. Дело в том, что Excel просто запускает столько процессов, сколько нужно (сколько есть активных клиентов). Поэтому риска "убить" чей-то "чужой" процесс у тебя нет.
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: импорт данных из экселя в Си
« Ответ #9 : 30 Январь 2014, 14:05:04 »

Если будет интересно, выложу класс для работы с Экселем. Заодно послушаю критику от более опытных товарищей.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #10 : 30 Январь 2014, 15:09:54 »

Держи демо, наваял в обед сегодня )
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #11 : 04 Февраль 2014, 11:45:08 »

Цитата: Tantos от 30 Январь 2014, 14:05:04
Если будет интересно, выложу класс для работы с Экселем. Заодно послушаю критику от более опытных товарищей.
интересно)
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #12 : 04 Февраль 2014, 11:46:09 »

Цитата: S0mbre от 30 Январь 2014, 15:09:54
Держи демо, наваял в обед сегодня )
эм я больше "начинающий-любитель" не так часто программирую как хотелось бы.... поэтмоу попрошу проект целиком... пытаюсь разобраться по коду. вопросы возникают...
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #13 : 04 Февраль 2014, 13:15:39 »

Цитата: leoboec от 04 Февраль 2014, 11:46:09
эм я больше "начинающий-любитель" не так часто программирую как хотелось бы.... поэтмоу попрошу проект целиком... пытаюсь разобраться по коду. вопросы возникают...

Так это и есть проект целиком...   
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #14 : 04 Февраль 2014, 20:18:45 »

Цитата: S0mbre от 04 Февраль 2014, 13:15:39
Цитата: leoboec от 04 Февраль 2014, 11:46:09
эм я больше "начинающий-любитель" не так часто программирую как хотелось бы.... поэтмоу попрошу проект целиком... пытаюсь разобраться по коду. вопросы возникают...

Так это и есть проект целиком...  

пардон... на работе не по глазам было.... откомпилить  не смог...
« Последнее редактирование: 04 Февраль 2014, 20:28:00 от leoboec » Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: импорт данных из экселя в Си
« Ответ #15 : 05 Февраль 2014, 03:05:56 »

По заявкам
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #16 : 10 Февраль 2014, 07:58:49 »

Подумал, потренирвоался, допер, что в прицнипе на данном этапе запись в файл мне не нужна... но уроки полезны... из всего этого мне сейчас понадобилось открытие эксель приложения из конкретной директории, а также закрытие...

Теперь все таки хочу вернуться к поиску...
Ввести данные в комбобокс посимвольно получилось... теперь вопрос с самими поиском....
хотя вопрос и по вводы данных остался...
завел переменную str1 ввожу текст в  Combobox1 и пытаюсь записать в str1 и вывести в Label подскажите что делаюне так
Код
ComboBox1->Text==str1;
Label10->Text=str1;
 
Разобрался в своих ошибках)
актуален вопрос по поиску

 вопрос для меня пока сложный...в более развернутом видеопробую описать.
ПРи вводе символов (файл эксель открыт при запуске программы) мы должны сверять с символом в столбце "а" допустим и если эти символы близки нам. мы выбираем то что нам надо и в лэйбл он должен вывести значение из столбца "B"  соответствующего "А". смотрю коды на VBA но еще больше запутываюсь
« Последнее редактирование: 11 Февраль 2014, 07:14:09 от leoboec » Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #17 : 11 Февраль 2014, 07:14:22 »

немного конкретизирую..
при запуске программы открываю книгу эксель

Код
{
 
    try {
     App=Variant::CreateObject("Excel.Application"); }
     catch (...) {
     Application->MessageBox("?????????? ??????? Microsoft Excel!"
    "бла0-бла-бла",MB_OK+MB_ICONERROR);
 }
  App.OlePropertyGet("Application").OlePropertyGet("Workbooks").OleProcedure("Open",WideString(IncludeTrailingBackslash(ExtractFileDir(Application->ExeName)) + "123\\Firm.xls"));
  // App.OlePropertySet("SheetsInNewWorkbook", 1);
    }

то есть создал процесс эксель и открыл уже существующую книгу
далее
в комбобокс ввожу текст
и пытаюсь его обработать
открываю 1 лист текущей книги
Код
 App.OlePropertyGet("Application").OlePropertyGet("Workbooks").OlePropertyGet("Item",1);

далее мне нужна работа к примеру с первым столбцом по идее всем (потому что значений заранее неизвестно сколько

Код
ce=App.OlePropertyGet("Cells").OlePropertyGet("Range","A1:?");

а вот что далее пока не могу понять....

То естьв ернуть какое то значение типа Cells,1,1  это получается... а вот выбор значения из всего столбца... вот это не поулчается....
то есть не понимаю ка корганизовать поиск по всему столбцу,

И еще не могу понять... надо ли список из эксель столбца копировать в Combobox или не обязательно???! и если я его не скопировал будет ли ему из какого сипска выделять значение при поиске (в плане отображать в комбобокс для выбора пользователем нескольких значений, например если пользователь ввел "ИГ" отобразиться ли в combobox  "ИГРА" "ИГЛА" если изначально combobox пустой и все  данные в экселе)
« Последнее редактирование: 11 Февраль 2014, 09:10:53 от leoboec » Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #18 : 15 Февраль 2014, 21:02:16 »

так и не сдвинулся с мертвой точки! прошу помощи
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #19 : 17 Февраль 2014, 08:45:20 »

Для начала у тебя должно быть понимание работы с Excel посредством VBA - без этого ты не сможешь правильно организовать доступ по OLE. Поучись макросам - поиск, замена текста и т.д. А потом легче все это будет портировать в стороннее приложение - макросы почти один в один "переводятся" на OLE.
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #20 : 17 Февраль 2014, 10:21:10 »

Цитата: S0mbre от 17 Февраль 2014, 08:45:20
Для начала у тебя должно быть понимание работы с Excel посредством VBA - без этого ты не сможешь правильно организовать доступ по OLE. Поучись макросам - поиск, замена текста и т.д. А потом легче все это будет портировать в стороннее приложение - макросы почти один в один "переводятся" на OLE.
спасибо! учиться коненчо буду и учусь уже) много чего узнал. просто хочу как можно быстрее закончить этот проект )) жене для работы строчу небольшую програмулину ) вот и пытаюсь вперед батьки лезть

ну и в дополнение тогда попрошу еще какую нибудь хорошую книгу по этой теме
« Последнее редактирование: 17 Февраль 2014, 10:28:29 от leoboec » Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #21 : 04 Март 2014, 08:18:58 »

прошу еще помощи.... пока что не могу досоображать...
итак у меня в первом столбце что-то записано... мне нужноп осчитать количество занятых ячеек, то есть тупо пройти сверху вниз до того момента пока значение в ячейке не пусто....
вот мои действия

 App.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);
   n=1;
       ce=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);
       res=ce.OlePropertyGet("Text");
  if (&res!=" ")
   {
       n++;
    }

выполняется один раз этот if и все   если цикл то зациливается... хочу посчитать сейчас просто количество непустых строк... понимаю что проблема именно в if но не могу исправить  и понять как проверить пусто ли значение в ячейке?!
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: импорт данных из экселя в Си
« Ответ #22 : 05 Март 2014, 03:11:48 »

Variant::IsEmpty()
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #23 : 05 Март 2014, 06:41:30 »

Код
App.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);    
  n=1;                                                        
      ce=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
    res=ce.OlePropertyGet("Text");                                
      for(;!res.IsEmpty();)            
 
  {
 n++;
 ce=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
 res=ce.OlePropertyGet("Text");                                
 Label7->Caption=res;
}

зацикливается....  причем заходит в цикл норм  () то есть локальном енял на if  res меняется... ставлю цикл и все...  зацикливается хотя забито всего 10 значений в первом столбце

кхм.... ан нет... запустил я... он минут 10 думал думал и в итоге выдал  сообщение скрин прилагаю...

разобрался с Empty() так и не получилось.. получилось вот так
for(;AnsiString(res)!=""ну иплюс к этому в дополнение пока искал все про empty и пробовал нашел... может будет интересно кому то?!.. но и прошу объяснения что с empty делал не так

http://www.vbnet.ru/vbguide/showfunction.asp?id=90

Цитировать
. Не следует путать значение Null со значением Empty, указывающим, что переменная не была инициализирована. Это значение также не эквивалентно пустой строке (""), которую иногда называют строкой нулевой длины.
« Последнее редактирование: 05 Март 2014, 08:19:20 от leoboec » Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: импорт данных из экселя в Си
« Ответ #24 : 05 Март 2014, 08:37:36 »

Тогда еще и на Variant::IsNull()
Код
while( !res.IsEmpty()||!res.IsNully() )
{
 n++;
 ce=App.OlePropertyGet("Cells").OlePropertyGet("Cells",n,1);  
 res=ce.OlePropertyGet("Text");                                
 Label7->Caption=res;
}
 
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #25 : 05 Март 2014, 11:32:26 »

ну вот сдвинулся с мертвой точки! и дошел до самого интересного в чем и прошу помощи

Цитировать
3. YES. См. пункт выше. Для инкрементного поиска (ты, кажется, его имел в виду) требуется лишь обрабатывать событие OnChange твоего едита.

Простой поиск в Combobox работает то есть я ввожу строку в комбобокс   он ее находит в экселе.. а можно про третий пункт чуть поподробнее?! как это организовать?!
 то есть я ввожу первый символ слова он передает это в подпрограмму поиска и выводит из экселя получается все что начинается на этот символ вот это пока не могу понять как обрабатывать событие.
То есть щелкнул по Onchange там описано вроде все но я так понимаю что проблема именно втом что выборка идет сиз файла эксель а не из итемсов... хотя могу ошибаться... код вот такой

Код
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
 
   str1=ComboBox1->Text;
   cell= Find(str1, row);
   Label10->Caption=cell;
   App.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);
   ce=App.OlePropertyGet("Cells").OlePropertyGet("Cells",cell,2);
   res=ce.OlePropertyGet("Text");
 
   Label7->Caption=res;
 
 
 
}
вопрос надо все в итемс перекидывать или все таки можно ка кто сделать чтобы он показывал список экселевский
« Последнее редактирование: 05 Март 2014, 13:40:40 от leoboec » Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #26 : 14 Март 2014, 11:30:16 »

вот в продолжение моей темы вопрос про то, что я хочу
   ComboBox1.RowSource = "[Книга1]Лист3!$A$1:$A$5"
чтобы отображалось вот так http://www.cyberforum.ru/vba/thread389116.html
но там внешняя форма подключена, а как тут это реализовать не совспем понимаю.... да и кстати нижняя граница должна меняться то есть не конкретно А5 а Аn
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #27 : 16 Март 2014, 09:30:11 »

Ну напиши функцию, которая будет загружать элементы в комбобокс из диапазона Excel. Что-то типа
Код
void __fastcall TMainForm::LoadCombo(
TComboBox* pCombo,               // наш комбобокс
const Variant& AWorkSheet,       // лист Excel (уже открытый)
const String& AAddress)            // адрес диапазона (например "A1:A10")
{
pCombo->Items->Clear();
pCombo->Items->BeginUpdate();
 
try {
Variant vCells = AWorkSheet.OlePropertyGet("Range", WideString(AAddress)).OlePropertyGet("Cells");
const int nCount = vCells.OlePropertyGet("Count");
for(int i=1; inCount; i++) {
pCombo->Items->Add(vCells.OlePropertyGet("Item", i).OlePropertyGet("Value"));
}
}
__finally {
pCombo->Items->EndUpdate();
}
}
 

И загружай:
Код
LoadCombo(ComboBox1, wSheet, "A1:A10");
 
Записан
leoboec
Участник


Сказали спасибо: +1/-2
Offline

Сообщений: 189

За красоту! ;)


Re: импорт данных из экселя в Си
« Ответ #28 : 17 Март 2014, 18:26:07 »

сделал немного по-другому. через
Код
ComboBox1->Items->Add(AnsiString(res));
   при запуске программы. когда запускается эксель и считается количество непустых строк, решил сразу забить эти непустые строки.
Вопрос правильно ли?! и как лучше сделать в плане быстродействия. в начале загрузить все строки при запуске программы или в момент работы вызывать  и загружать эти данные?!
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: импорт данных из экселя в Си
« Ответ #29 : 18 Март 2014, 07:14:21 »

Цитата: leoboec от 17 Март 2014, 18:26:07
сделал немного по-другому. через
Код
ComboBox1->Items->Add(AnsiString(res));
  при запуске программы. когда запускается эксель и считается количество непустых строк, решил сразу забить эти непустые строки.
Вопрос правильно ли?! и как лучше сделать в плане быстродействия. в начале загрузить все строки при запуске программы или в момент работы вызывать  и загружать эти данные?!

Это в в зависимости от конкретной задачи. Если данные на листе Excel не будут меняться во время работы программы, тогда можно загрузить сразу. Если будут - надо загружать динамически (кнопка "Обновить" или что-то типа такого).
« Последнее редактирование: 18 Март 2014, 07:24:12 от S0mbre » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.145 секунд. Запросов: 19.