Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 06.01.2009, 14:44   #1
Max2114
 
Регистрация: 06.01.2009
Сообщений: 8
По умолчанию Чтение данных из файла Excel в C++Builder

Нужно прочитать данные из excel файла в мою программу. Пользуюсь C++Builder 6. Каким способом это лучше сдалть? Если дадите пример использования то буду благодарен.
Max2114 вне форума Ответить с цитированием
Старый 06.01.2009, 19:03   #2
Max2114
 
Регистрация: 06.01.2009
Сообщений: 8
По умолчанию

В общем я кое-что нашел... в билдере обычно используют технологию OLE... че-то пока что грамотного хелпа я на эту тему не нашел.. то что нашел позволяет редактировать текс а не считывать из файла.... нашел даже чьи-то самодельные компанененты, работющие на основе OLE, но они также позволят только записывать в эксель а не считывать с него. Жду дальше помощи.
Max2114 вне форума Ответить с цитированием
Старый 08.01.2009, 17:33   #3
Max2114
 
Регистрация: 06.01.2009
Сообщений: 8
По умолчанию

И чего никто не отвечает? Частично разобрался с OLE, но возникла проблема - не могу открыть файл. Вот что делаю:
Variant cnn = CreateOleObject("EXCEL.Application" );
cnn.OlePropertySet("Open",a);
где а - путь до файла в переменной типа String
Программа компилируется, но при выполнении тормозится на строке открытия файлы говоря "неизвестное имя". Что никто здесь с OLE не работал? Сколько нашел хелпов и примеров там нигде не открывали файл а создавали и сохраняли.
Max2114 вне форума Ответить с цитированием
Старый 11.01.2009, 16:52   #4
Mikola-TEAM
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 34
По умолчанию

Дописываем сверху
#include <comobj.hpp>
Размещаем на форме StringGrid1 и кнопку.
В кнопке пишем
Код:
Variant Excel;
Variant Book;
Variant Sheet;

Excel=CreateOleObject("Excel.Application");
//Excel.OlePropertySet("Visible",true);  //чтобы сделать Excel видимой, нужно раскоментировать строку
Book=Excel.OlePropertyGet("Workbooks").OlePropertyGet("Open", "D:\\enter_data"); //открываем книгу, указав её имя
Sheet=Book.OlePropertyGet("Worksheets", 1); //выбираем № активного листа книги

this->StringGrid1->Cells[0][0]=Sheet.OlePropertyGet("Range", "A1"); //выводим в StringGrid1 из Excel значение ячейки А1

Excel.OleProcedure("Quit");  //без неё EXCEL.exe не закроется, если не делали её видимой
}
Единственный минус, пока не смог разобраться, как сделать так, чтобы можно было выводить номер ячейки автоматически в зависимости от i,j , а не прописывать его вручную "A1", "B2" и т.д.
А так код работает. Содержимое ячейки А1 из Excel помещается в ячейку [0][0] StringGrid1

Последний раз редактировалось Mikola-TEAM; 11.01.2009 в 17:02.
Mikola-TEAM вне форума Ответить с цитированием
Старый 11.01.2009, 18:11   #5
Mikola-TEAM
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 34
По умолчанию

Написал функцию, выводящую А1, B1, C5 ... в зависимости от i,j .
Результат "А1" имеет тип AnsiString, но OlePropertyGet("Range", "A1") не хочет принимать. Программа вылетает и выдаёт сообщение "Неверный тип переменной". И какой же должен быть тип "А1" ? У "Range" тип AnsiString.

Когда пишем Sheet.OlePropertyGet и открываем скобки, то вылезает подсказка:
Код:
const AnsiString * name, TAutoArgBase * Args
const AnsiString * name, P1 p1
........
const AnsiString * name, P1 p, P2 p2, .... , P10 p10
Mikola-TEAM вне форума Ответить с цитированием
Старый 14.01.2009, 07:22   #6
Max2114
 
Регистрация: 06.01.2009
Сообщений: 8
По умолчанию

Я вообще уже разобрался... сделал вот так:
Код:
String a=OpenDialog1->FileName;
Variant cnn ;
bool st=false;
try
{
cnn = CreateOleObject("EXCEL.Application");
st=true;
}
catch (...)
{
 MessageBox(0, "Ошибка при открытии сервера excel", 
                 "Ошибка", MB_OK);
  return;
  }
 cnn.OlePropertyGet("Workbooks").OlePropertyGet("Open",a.c_str());

Label1->Caption=cnn.OlePropertyGet("Cells",1,3);
// таким образом во первых задавая номера в cnn.OlePropertyGet("Cells",1,3); 
//номера ячейки переменными мы сможем перебирать вся книгу
Модератор: тег CODE

Последний раз редактировалось MaTBeu; 15.01.2009 в 15:00.
Max2114 вне форума Ответить с цитированием
Старый 15.01.2009, 11:32   #7
Mikola-TEAM
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 34
По умолчанию

Цитата:
// таким образом во первых задавая номера в cnn.OlePropertyGet("Cells",1,3); номера ячейки переменными мы сможем перебирать вся книгу
Точно. В Делфи как раз Cells[i,j] и использовал, когда нужно было ввести\вывести данные в\из Excel. А тут что-то к "Range" прицепился
Mikola-TEAM вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение из файла. aschak Общие вопросы C/C++ 9 30.12.2008 15:24
Чтение из файла Amen БД в Delphi 2 09.12.2008 10:40
Чтение из файла Arkuz Общие вопросы Delphi 14 08.10.2008 18:52
Чтение из файла... Bill Gates Общие вопросы Delphi 3 22.03.2008 22:13


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840