отчет в Excel ( C++builder6 )

  • Автор темы master11
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

master11

1.создал файлы классов excel_tlb.h, excel_tlb.cpp
2.включил их в проект
3. ExcelApplication *app;
4. как дальше: создать обьект? или как?

в с++builder5 - TCOM_Application m_XLApp;
m_XLApp=CoExcelApplication::Create();
и все работает нормально

а в c++builder6 - не могу разобраться.
Помогите, спасибо.
 
?

????

Для: master11
в хэдере #include "Excel_2K_SRVR.h"

Код:
#pragma link "Excel_2K_SRVR"
.
.

   TExcelApplication *XLApp = new TExcelApplication(this);
   long LCID = LOCALE_USER_DEFAULT;

   XLApp->AutoConnect = false;
   XLApp->AutoQuit = false;
   XLApp->ConnectKind = ckRunningOrNew;
   XLApp->set_DisplayAlerts(LCID, TVariant(false));

   XLApp->Connect();

   ExcelWorksheetPtr XLSheet;
   ExcelWorkbookPtr XLBook;

   String defaultWBook = GetCurrentDir() + "\\template.xls";

   XLBook = XLApp->Workbooks->Open(TVariant(defaultWBook),
              TNoParam(), TNoParam(), TNoParam(),
              TNoParam(), TNoParam(), TNoParam(),
              TNoParam(), TNoParam(), TNoParam(),
              TNoParam(), TNoParam(), TNoParam(),
              LCID);

   XLSheet = XLBook->ActiveSheet;

   XLSheet->set_Name(TVariant("asdasd"));

   XLSheet->Cells->set__Default(TVariant(4), TVariant(4), TVariant("test"));

   XLBook->SaveAs(TVariant("test.xls"),
       TVariant(xlNormal), TNoParam(), TNoParam(),
       TNoParam(), TNoParam(), xlNoChange,
       TNoParam(), TNoParam(), TNoParam(),
       TNoParam(), LCID);

   XLBook->Close(TVariant(false), TNoParam(), TNoParam(), LCID);

   XLSheet->Release();
   XLApp->Disconnect();

вырвал пару строк из старого проекта
 
M

master11

спасибо
скомпилировал, запустил - все получилось!!!
но тут еще одна проблемка.
может, подскажете...
отчетик мой состоит из нескольких сотен строк по 15-20 столбцов
задержка получается ООЧЧЕЕНННЬЬ приличная :(
слышал, что можна как-то через массивы работать
но не знаю как справиться
буду очень благодарен за подсказку
 
?

????

<!--QuoteBegin-master11+10:04:2006, 15:24 -->
<span class="vbquote">(master11 @ 10:04:2006, 15:24 )</span><!--QuoteEBegin-->слышал, что можна как-то через массивы работать
[snapback]33320" rel="nofollow" target="_blank[/snapback]​
[/quote]
можно. вот набросок с одномерным массивом (не компилил, не проверял, но принцип должен быть понятен):

Код:
Variant values = VarArrayCreate(OPENARRAY(int, (0, 10)), varVariant);

for( int i=0; i < 10; i++ )
{
values.PutElement(TVariant(i*2), i);
}

Variant Cell1, Cell2;
Cell1 = XLSheet->Cells->get_Item(TVariant(5), TVariant(1));
Cell2 = XLSheet->Cells->get_Item(TVariant(5), TVariant(11));
XLSheet->get_Range(Cell1, Cell2)->set_Value( values );

для двумерного массива будет что-то типа

Код:
Variant values = VarArrayCreate(OPENARRAY(int, (0, 10, 0, 10)), varVariant);

for( int i=0; i < 10; i++ )
{
for( int j = 0; j < 5; j++ ) 
{
 values.PutElement(TVariant(i*2 + j), i, j);
}
}

Variant Cell1, Cell2;
Cell1 = XLSheet->Cells->get_Item(TVariant(5), TVariant(1));
Cell2 = XLSheet->Cells->get_Item(TVariant(15), TVariant(11));
XLSheet->get_Range(Cell1, Cell2)->set_Value( values );

пробуй.
 
M

master11

спасибо
дальше постараюсь сам разобраться
 
M

master11

понемножку двигается отчет
но вот такой вопрос: сначала хочу загрузить файл шаблона ( шапка ) а потом уже ячейки заполнять программно
но никак не могу
( если честно, то с ОЛЕ-функциями я не разобрался до конца )
Помогите, плз.
Спасибо
 
B

Barmutik

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

А грузить свой шаблон:

Код:
ExcelApp.WorkBooks.Add('имя шаблона');
 
T

THuman

Пожалуй возродим эту тему!
Для меня прграммирование офисовских приложений из Delphi милое дело! Но... на работе столкнулся
с тем же но в деBilder'е C++. Законектился к екселю именно через TExcelAplcation и т.д. как было упомянуто выше, но так же не интиресно!!! Вобщем есть в Delphe и другой способ
Код:
uses ComObj;

procedure TFormButton1Click(Sender: TObject);
var xl:variant;

begin
xl:=CreateOleObject('Excel.Application');
xl.WorkBooks.Add;
xl.Visible:=Ttrue;
end;

Именно этим способом я обычно пользуюсь, но вот как его организовать в билдере???
В делфе используется ComObj а что билдеру подключать???
На саму операцию xl=CreateOleObject("Excel.Application"); билдер не ругается, а вот когда я пытаюсь обратится к какому либо свойству, к примеру xl->Visible=true; матюкается!!!!!!!!!!!!!
 
L

LAW

Ничего подключать не нужно.
Видимо неправильно обращаешся :)
 
T

THuman

По логике как и всегда к свойству или методу через "->"! Но если не так то как???? Или в билдере такой способ коннекта не катит??? ;) Если знаеш подскажи!!!!
 
P

Programmer_Hard

не всегда -> если не на указатель то точка.
 
T

THuman

:D Более дельные советы будут!??? Вчера вроде нашел способ установки значений свойств:
xl.OlePropertySet("Visible", true);
получить значение свойства OlePropertyGet
Но зараза при выполнении вызывает AccesViolation!!!!!!!!!!!!!!!! :( :) :)
 
L

LAW

Вот мой пример:
Код:
 // Открываем книгу в EXCELL:
Variant oXLSObj,VBook;
oXLSObj = Variant::CreateObject("Excel.Application");
oXLSObj.OlePropertySet("DisplayAlerts",false);
oXLSObj.OlePropertySet("Visible", true);
oXLSObj.OlePropertySet("SheetsInNewWorkbook",3);
VBook=oXLSObj.OlePropertyGet("WorkBooks");
VBook.OleProcedure("add");
VBook=VBook.OlePropertyGet("Item",1);
Удачи!
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!