Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт из DBGrid в Excel, Надо перевести из Delphi в C++ Builder 
V
    Опции темы
Voldemar2004
  Дата 20.4.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Есть пример на Delphi Исходный код, который экспортирует данные из таблицы в Excel. 

Я подключил:

Код

#include <ComObj.hpp>


Теперь ошибка: "Ссылка на неизвестную функцию CreateOLEObject".

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <ComObj.hpp>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if ( OpenDialog->Execute() ) {
   TableDB->Active=false;
   TableDB->TableName=OpenDialog->FileName;
   TableDB->Active=true;
 }        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
OpenDialog->InitialDir=ExtractFilePath(Application->ExeName);        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{

 Variant XL, XArr;
 int i, j;

 XArr=VarArrayCreate([1,TableDB->FieldCount],varVariant);
 XL=CreateOLEObject('Excel.Application');
 XL->WorkBooks->add;
 XL->visible=true;


}
//---------------------------------------------------------------------------


Добавлено через 5 минут и 47 секунд
Исправил: 

Код

 XArr=VarArrayCreate([1,TableDB->FieldCount],varVariant);
 XL=CreateOleObject("Excel.Application");
 XL->WorkBooks->add;
 XL->visible=true;


В Дельфи так пишется:

Код

XL=CreateOLEObject('Excel.Application');


В C++ Builder так:
Код

XL=CreateOleObject("Excel.Application");



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
  Дата 20.4.2010, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Теперь ругается на строку:

Код

XArr=VarArrayCreate(....



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
xvr
Дата 20.4.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Voldemar2004 @  20.4.2010,  13:19 Найти цитируемый пост)
Теперь ругается на строку:
Правильно ругается. Смотри в сторону макроса OPEN_ARRAY (так кажется)


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



smile

Добавлено через 4 минуты и 7 секунд
Вот исходный код на Дельфи (кнопка "Экспортировать"):

Код

procedure TForm1.BtnExportClick(Sender: TObject);
var
 XL, XArr: Variant;
 i: Integer;
 j: Integer;
begin
 {не забудьте включить ComObj в список используемых модулей}
 // Создаем массив элементов, полученных в результате запроса
 XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);
 XL:=CreateOLEObject('Excel.Application');     // Создание OLE объекта
 XL.WorkBooks.add;
 XL.visible:=true;

 j := 1;
 TableDB.First;
 while not TableDB.Eof do
  begin
   i:=1;
   while i<=TableDB.FieldCount do
    begin
     XArr[i] := TableDB.Fields[i-1].Value;
     i := i+1;
    end;
   XL.Range['A'+IntToStr(j),
   CHR(64+TableDB.FieldCount)+IntToStr(j)].Value := XArr;
   TableDB.Next;
   j:=j+1;
  end;
 XL.Range['A1',CHR(64+TableDB.FieldCount)+IntToStr(j)].select;
 // XL.cells.select;                     // Выбираем все
 XL.Selection.Font.Name:='Arial cur';
 XL.Selection.Font.Size:=10;
 XL.selection.Columns.AutoFit;
 XL.Range['A1','A1'].select;
end;



Т.е. вместо
Код

XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);


использовать:

Код

Variant MyVariant(OPENARRAY(int, (0, 5)), varInteger);


?


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
xvr
Дата 20.4.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вместо
Код

XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);
использовать
Код

int bounds[]={1,TableDB.FieldCount};
XArr=VarArrayCreate(bounds,1,varVariant);
(см help на VarArrayCreate в BCB - там есть пример)

PM MAIL   Вверх
Voldemar2004
  Дата 20.4.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



xvr, спасибо ! 

Одна проблема решена.

Создаю OLE-объект:

Код

 XL=CreateOleObject("Excel.Application"); // Создание OLE-объекта


Ввожу так:

Код

XL->


и не появляются методы объекта XL smile 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Usper
Дата 20.4.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А так:
Код

XL.
smile


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Voldemar2004
Дата 20.4.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Цитата(Usper @  20.4.2010,  16:00 Найти цитируемый пост)
А так:


Это понятно smile Где метод 
Код

WorkBooks


В Делфи есть, тут нет  smile 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Usper
Дата 20.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В билдере он точно там же, где и в дельфи, а именно:
Код

 Variant XL, Workbooks;
 XL=CreateOleObject("Excel.Application");
 Workbooks=XL.OlePropertyGet("Workbooks");



--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Voldemar2004
  Дата 20.4.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Спасибо всем ! smile Сделал в результате сам и совсем по-другому !  smile 

Код


//---------------------------------------------------------------------------

#include <vcl.h>

#include<windows.h>
#include <comobj.hpp>

#include <string>

using namespace std;

//---------------------------------------------------------------------------

char *Rus(const char * Str);

char bufRus[512];

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

                Query1->Close();
                Query1->SQL->Clear();
                Query1->SQL->Add( "Выбираем например 5 полей" );
                Query1->ExecSQL();

                Query1->Active = true;



string FieldsName[5] = {"Pole1", "Pole2", "Pole3", "Pole4", "Pole5"};

Variant App,List;

        App=CreateOleObject("Excel.Application");          
        App.OlePropertySet("SheetsInNewWorkbook",1);    
        App.OlePropertyGet("Workbooks")
           .OleProcedure("Add");                       
        List=App.OlePropertyGet("Worksheets")
                .OlePropertyGet("Item",1);              


for(int j=0; j<5; j++) {
List.OlePropertyGet("Cells").OlePropertyGet("Item",1,j+1).OlePropertySet( "Value", FieldsName[j].c_str() );
}


CGauge1->MinValue = 1;
CGauge1->MaxValue = 5;

for(int j=1; j<=5; j++) {

        Query1->First();
        for(int i=2; i<=Query1->RecordCount+1; i++) {

                Application->ProcessMessages();

                string Buf = Query1->FieldByName( FieldsName[j-1].c_str() )->AsString.c_str();
                List.OlePropertyGet("Cells").OlePropertyGet("Item",i,j).OlePropertySet( "Value", Rus( Buf.c_str() ) );
                Query1->Next();
        }

CGauge1->Progress = j;

}
App.OlePropertySet("Visible",true);
}
//---------------------------------------------------------------------------

char *Rus(const char* Str) {
        OemToChar(Str,bufRus);
return bufRus;
}

//---------------------------------------------------------------------------



Осталось в класс завернуть, чтобы было универсально и красиво.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Usper
Дата 21.4.2010, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну, к сожалению, универсально и красиво не получается :(, сам сколько раз сталкивался с тем, что код, работающий в офисах 97-2003 не работает в 2007 :(. Причём не полностью не работает, а некоторые функции подглючивают и при этом, код, генерирующийся макроассмблером, для этих действий абсолютно одинаков во всех офисах.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Voldemar2004
Дата 21.4.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Usper, какая версия C++ Builder ? Откуда например C++ Builder 6 знает о формате Excel 2007 ?


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Usper
Дата 21.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Билдер 6, и он не имеет никакого понятия о формате файла как 2007 офиса, так и 97. Программа только подаёт команды OLE серверу и в результате получается документ. Необходимые команды определяются с помощью макроассемблера (ну или из справки офиса smile).


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Voldemar2004
  Дата 21.4.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Цитата(Usper @  21.4.2010,  14:06 Найти цитируемый пост)
Билдер 6, и он не имеет никакого понятия о формате файла как 2007 офиса, так и 97


Помнишь, при установке C++ Builder он спрашивает какой использовать MS Office ? там можно выбрать или 97 или 2000/xp. В более позних версиях Builder'а можно выбирать уже или 2000/xp или 2003.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Usper
Дата 22.4.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я то помню, однако эта опция влияет на установку компонент для работы с офисом. У тебя же, как я понял из приведённого кода, эти компоненты не используются. А OLE сервером офиса ты управляешь напрямую. При этом таким способом можно управлять не только майкрософтовским офисом, но и другими программами, которые предоставляют OLE интерфейс. А компоненты, как я понимаю, отличаются разными именами констант для разных версий офиса, но если не использовать имена, а использовать вместо них числовые значения, то, теоретически, можно управлять любой версией офиса (на данный момент).


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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