Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBgrid, DataSet, Excel 
:(
    Опции темы
Knorkator
Дата 29.5.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 26.11.2006

Репутация: нет
Всего: нет



Всем привет.
Запутался с типом Variant. 
Вопрос.
Как в C++ Builder занести данные из DBgrid в котором хранится таблица из ADOTable, в Excel?
Средствами Delphi все делается очень просто, в билдере не могу разобраться.

Всем откликнувшимся: Заранее большое спасибо!
PM MAIL   Вверх
Knorkator
Дата 29.5.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 26.11.2006

Репутация: нет
Всего: нет



Код

Variant XLSAPP;
//===============================================
int f4_ExcelInit(AnsiString File){//Подключение к Excel
try{//Если Excel запущен - подключиться к нему
  XLSAPP=Variant::GetActiveObject("Excel.Application");}
catch (...){//Если Excel не запущен - запустить его
  try{XLSAPP=Variant::CreateObject("Excel.Application");}
  catch (...){
    Application->MessageBox("Невозможно открыть Microsoft Excel."
    "Возможно, Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);}
  }
try{
 if(File!=""){
    XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());}//Открыть документ
 else XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("add");//Создать новый документ
 }
catch (...){
 Application->MessageBox("Ошибка открытия файла Microsoft Excel.",
                         "Ошибка",MB_OK+MB_ICONERROR);return -1;}
return 1;
}
//===============================================
int f4_ExcelVisible(bool i){//Показать/скрыть Excel
if(!XLSAPP.IsEmpty())XLSAPP.OlePropertySet("Visible",i);
return 1;
}
//===============================================
int f4_ExcelSend(int Sheet, int Stolb, int Stroka, AnsiString Str, bool asText=false){//>>>
Variant ExcelSheet,Cur;//Запись данных в Excel (Лист, столбец, строка, "данные",как_текст?)
AnsiString ErrStr;
if(Str=="")return 1;//Не писать "пустоту"
ErrStr="Ошибка при записи: лист "+IntToStr(Sheet)+", столбец "+IntToStr(Stolb)+", строка "+IntToStr(Stroka);
try{ExcelSheet=XLSAPP.OlePropertyGet("WorkSheets",Sheet);}
catch (...){Application->MessageBox(ErrStr.c_str(),
           "Ошибочный номер листа Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
try{Cur=ExcelSheet.OlePropertyGet("Cells",Stroka,Stolb);
   if(asText)Cur.OlePropertySet("NumberFormat","@");//Форматировать ячейку как текст
   Cur.OlePropertySet("Value",Str.c_str());}
catch (...){Application->MessageBox(ErrStr.c_str(),
           "Ошибка Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
return 1;
}
//===============================================
int f4_SaveToExcel(){//Экспорт всех ячеек в Excel
TBookmark bm;
int result,col, row;
Screen->Cursor=crHourGlass;
Application->ProcessMessages();
result=f4_ExcelInit("");//Инициализация Excel
if(result==-1){Screen->Cursor=crDefault;return -1;}
Form1->DBGrid1->DataSource->DataSet->DisableControls();
bm=Form1->DBGrid1->DataSource->DataSet->GetBookmark();//Текущая ячейка
Form1->DBGrid1->DataSource->DataSet->First();
for(col=0;col<Form1->DBGrid1->FieldCount;col++){//добавляем имена колонок
 result=f4_ExcelSend(1,col+1,1,Form1->DBGrid1->Fields[col]->DisplayLabel,true);
 if(result==-1){Screen->Cursor=crDefault;return -1;}
 }
Form1->ProgressBar1->Position=0;//Прогрессбар
Form1->ProgressBar1->Max=Form1->DBGrid1->DataSource->DataSet->RecordCount;
for(row=0;row<Form1->DBGrid1->DataSource->DataSet->RecordCount;row++){// получаем данные
 Form1->ProgressBar1->Position=row;//Прогрессбар
 for(col=0;col<Form1->DBGrid1->FieldCount;col++){
   result=f4_ExcelSend(1,col+1,row+2,Form1->DBGrid1->Fields[col]->AsString,true);
   if(result==-1){Screen->Cursor=crDefault;return -1;}
   }
 Form1->DBGrid1->DataSource->DataSet->Next();
 }
Form1->DBGrid1->DataSource->DataSet->GotoBookmark(bm);//Текущая ячейка
Form1->DBGrid1->DataSource->DataSet->FreeBookmark(bm);
Form1->DBGrid1->DataSource->DataSet->EnableControls();
f4_ExcelVisible(true);//Сделать видимым Excel
Form1->ProgressBar1->Position=0;//Прогрессбар
Screen->Cursor=crDefault;
Application->ProcessMessages();
return 1;
}

Нашел на просторах рунета, неизвестное авторство, прекрасно работает.
PM MAIL   Вверх
Пепс
Дата 23.10.2012, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



возможно и прекрасно работает в 6-ом билдере, а в новом - хрен в сметане. разные кодировки ansi и unicode. как поправить этот код чтоб в Embarcadero 15 работало?
сам же и отвечу - везде где стоит Ansistring меняем на Unicodestring, и перед тесктами ставим L (например, L"Невозможно открыть Microsoft Excel.")
еще здесь отредактировал 
Код

int f4_ExcelSend(int Sheet, int Stolb, int Stroka, AnsiString Str, bool asText=false){//>>>
Variant ExcelSheet,Cur;//Запись данных в Excel (Лист, столбец, строка, "данные",как_текст?)
AnsiString ErrStr;


на

Код

int f4_ExcelSend(int Sheet, int Stolb, int Stroka, UnicodeString Str, bool asText){//>>>
Variant ExcelSheet,Cur;//Запись данных в Excel (Лист, столбец, строка, "данные",как_текст?)
UnicodeString ErrStr;
asText = bool;


и еще t_str поменял на w_str

Это сообщение отредактировал(а) Пепс - 24.10.2012, 09:05
PM MAIL   Вверх
Пепс
Дата 24.10.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



эти процедуры запускают процесс excel.exe но не закрывают. кто-нить знает как его (процесс) грохнуть по завершению?
PM MAIL   Вверх
xvr
Дата 24.10.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Пепс @  24.10.2012,  10:20 Найти цитируемый пост)
 кто-нить знает как его (процесс) грохнуть по завершению? 

Послать ему команду Quit() (через OleProcedure)


PM MAIL   Вверх
Пепс
Дата 25.10.2012, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



выгружаю через вышеописанные функции. Проблема: в эксел попадают "урезанные" данные, например в DBGrid значение ячейки 591145001, в экселе эта ячейка имеет значение 59114.
пробовал менять формат вот здесь:
Код

if(asText)Cur.OlePropertySet("NumberFormat","@");//Форматировать ячейку как текст
   Cur.OlePropertySet("Value",Str.w_str());}

вместо @ пробовал как число, и пустые кавычки ставлял - результат тот же.
если я все правильно понимаю, формат данных в DBGrid задается здесь
Код

for(row=0;row<Form4->DBGrid1->DataSource->DataSet->RecordCount;row++){// получаем данные
 Form4->ProgressBar1->Position=row;//Прогрессбар
 for(col=0;col<Form4->DBGrid1->FieldCount;col++){
   result=f4_ExcelSend(1,col+1,row+2,Form4->DBGrid1->Fields[col]->AsString,true);
   if(result==-1){Screen->Cursor=crDefault;return -1;}

т.е. AsString.
Почему все же эксел "отбрасывает" часть данных?
Как исправить?
PM MAIL   Вверх
xvr
Дата 25.10.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Пепс @  25.10.2012,  07:32 Найти цитируемый пост)
Проблема: в эксел попадают "урезанные" данные, например в DBGrid значение ячейки 591145001, в экселе эта ячейка имеет значение 59114.

Excel понимает тип данных по их (данных) внешнему виду. У вас данные выглядят как число - он их и делает числом

Цитата(Пепс @  25.10.2012,  07:32 Найти цитируемый пост)
пробовал менять формат вот здесь:

Это формат показа, на содержимое ячейки он не влияет.

Скажите Excel'у, что у вас текст - добавьте апостроф перед числом:
Код

Cur.OlePropertySet("Value",('\''+Str).w_str());}


PM MAIL   Вверх
Пепс
  Дата 25.10.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 25.10.2012,  12:19)
Скажите Excel'у, что у вас текст - добавьте апостроф перед числом:
Код

Cur.OlePropertySet("Value",('\''+Str).w_str());}



сделал как вы предложили, вываливает ошибку
[BCC32 Error] Unit4.cpp(156): E2015 Ambiguity between '_fastcall System::+(int,const System::Currency &) at c:\program files\embarcadero\rad studio\8.0\include\windows\rtl\syscurr.h:178' and '_fastcall System::+(int,const System::Variant &) at c:\program files\embarcadero\rad studio\8.0\include\windows\rtl\sysvari.h:3497'
  Full parser context
    Unit4.cpp(142): parsing: int f4_ExcelSend(int,int,int,System::UnicodeString,bool)

и

[BCC32 Error] Unit4.cpp(156): E2285 Could not find a match for 'Variant::OlePropertySet(const char *,undefined)'
  Full parser context
    Unit4.cpp(142): parsing: int f4_ExcelSend(int,int,int,UnicodeString,bool)

указывая на данную строку
PM MAIL   Вверх
xvr
Дата 25.10.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Ну тогда сделайте так
Код

Cur.OlePropertySet("Value",(L"'"+Str).w_str());}

Да, Str у вас надеюсь типа String ?

PM MAIL   Вверх
Пепс
Дата 25.10.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 25.10.2012,  13:40)
Ну тогда сделайте так
Код

Cur.OlePropertySet("Value",(L"'"+Str).w_str());}

Да, Str у вас надеюсь типа String ?

так я уже тоже делал...
Str - тип Unicodestring
PM MAIL   Вверх
xvr
Дата 25.10.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Пепс @  25.10.2012,  13:43 Найти цитируемый пост)
так я уже тоже делал...

И что, тоже не компилируется? Или не работает?

PM MAIL   Вверх
Пепс
Дата 26.10.2012, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 25.10.2012,  14:57)
Цитата(Пепс @  25.10.2012,  13:43 Найти цитируемый пост)
так я уже тоже делал...

И что, тоже не компилируется? Или не работает?

компилируется, но данные тоже "обрезаны"
PM MAIL   Вверх
xvr
Дата 26.10.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Пепс @  26.10.2012,  05:48 Найти цитируемый пост)
компилируется, но данные тоже "обрезаны" 

А если в Excel'е в эту ячейку встать курсором, он в троке редактирования показывает обрезанные или полные данные?

PM MAIL   Вверх
Пепс
Дата 26.10.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.1.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 26.10.2012,  11:49)
Цитата(Пепс @  26.10.2012,  05:48 Найти цитируемый пост)
компилируется, но данные тоже "обрезаны" 

А если в Excel'е в эту ячейку встать курсором, он в троке редактирования показывает обрезанные или полные данные?

обрезанные
прикрепил скрин как это выглдит в проге

Добавлено через 12 минут и 2 секунды
блин, .xls нельзя сюда загрузить, но вот так это выглядит. в строке формул точно так же

19.10    59021    5904    460072
19.10    59021    5904    460072
19.10    59021    5904    460072
19.10    59021    5904    460072
19.10    59021    5904    460072


Это сообщение отредактировал(а) Пепс - 26.10.2012, 12:29

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Новый_рисунок.png 18,08 Kb
PM MAIL   Вверх
xvr
Дата 28.10.2012, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Настолько оно не должно обрезать. Зазипуйте xls и приатачте сюда

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.