IG> Привет, All!
IG> Поделитесь хоть каким-нибудь фрагментом программы,
IG> работающей с Excel с использованием имеющихся в
IG> C++ Builder'е объектов. Hикак не могу сообразить, как
IG> с ними вообще работать. То, что предлагается в букваре
IG> по Visual Basic'у для работы с Excel, совсем не работает
IG> в CB5.
IG> Помогите, кто может!
IG> Игорь Горбунов
Вот фрагмент из рабочей программы. /Целиком не прогходит, нарезал куски./
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
...
#include <dir.h>
#include <comobj.hpp> //Excel
#include <utilcls.h> //Excel
#include <excel_97.h> //Excel
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveExlClick(TObject *Sender)
{
int i,x,y,Count;
bool flag;
AnsiString TmpText;
AnsiString SheetName;
Variant xlApp;
Variant xlWorkbook;
Variant xlWorkbooks;
Variant xlSheet;
Variant Sheet;
Variant Rows;
Variant Columns;
Variant Range;
Variant Borders;
Variant Interior;
Form6->Refresh();
xlApp=CreateOleObject("Excel.Application");
xlWorkbooks=xlApp.OlePropertyGet("Workbooks");
TmpText=Form5->DirectoryEdit3->Text+"\\konvert.xls";
xlWorkbooks.OleProcedure("Open",TmpText);
xlWorkbook=xlApp.OlePropertyGet("ActiveWorkbook");
xlSheet=xlWorkbook.OlePropertyGet("Sheets");
Count=xlSheet.OlePropertyGet("Count");
//Узнаем имя создаваемого листа
SheetName=Form6->StringGrid1->Cells[1][1];
flag=true;
for (i=1;i<=Count;i++) {
Sheet=xlSheet.OlePropertyGet("Item",i);
TmpText=Sheet.OlePropertyGet("Name");
if(TmpText==SheetName) {
flag=false;
xlApp.OlePropertySet("Visible",true);
Sheet.OleProcedure("Select");
Sheet.OleProcedure("Delete");
xlApp.OlePropertySet("Visible",false);
break;
}
}
Form1->Refresh();
Form6->Refresh();
if (!flag&xlSheet.OlePropertyGet("Count")==Count) {
xlApp.OleFunction("Quit");
Interior=Unassigned;
Borders=Unassigned;
Range=Unassigned;
Columns=Unassigned;
Rows=Unassigned;
Sheet=Unassigned;
xlSheet=Unassigned;
xlWorkbooks=Unassigned;
xlWorkbook=Unassigned;
xlApp=Unassigned;
ShowMessage("Запись не добавлена!");
return;
}
//Добавляем лист
xlSheet.OleProcedure("Add");
Sheet=xlWorkbook.OlePropertyGet("ActiveSheet");
Sheet.OlePropertySet("Name",SheetName);
//Определяем кол-во строк и столбцов
Columns=Sheet.OlePropertyGet("Columns");
Rows=Sheet.OlePropertyGet("Rows");
x=Columns.OlePropertyGet("Count");
y=Rows.OlePropertyGet("Count");
//Установка ширины столбцов
Range=Sheet.OlePropertyGet("Range","A1");
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("ColumnWidth",12);
//Прячем не используемые столбцы
Range=Sheet.OlePropertyGet("Range","H1:IV1");
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Hidden",true);
//Устанавливаем формат ячеек шапки
Range=Sheet.OlePropertyGet("Range","A1:G3");
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","@");
//Устанавливаем цвет ячеек шапки
Range=Sheet.OlePropertyGet("Range","A1:G2");
Interior=Range.OlePropertyGet("Interior");
Interior.OlePropertySet("ColorIndex",34);
Range=Sheet.OlePropertyGet("Range","A3:G3");
Interior=Range.OlePropertyGet("Interior");
Interior.OlePropertySet("ColorIndex",36);
//Форматируем ячейки шапки
Range=Sheet.OlePropertyGet("Range","C1:D1");
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("MergeCells",1);
//Делаем надписи шапки
Range=Sheet.OlePropertyGet("Range","A1");
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value","Дата");
//Выравнивание текста в ячейках шапки
{Range=Sheet.OlePropertyGet("Range","A1:G2");
Range.OlePropertySet("HorizontalAlignment",xlHAlignCenter);}
//Устанавливаем границы ячеек шапки
{Range=Sheet.OlePropertyGet("Range","A1:G1");
Borders=Range.OlePropertyGet("Borders");
Borders=Borders.OlePropertyGet("Item",xlEdgeTop);
Borders.OlePropertySet("LineStyle",xlContinuous);
Borders.OlePropertySet("Weight",xlThin);
Borders.OlePropertySet("ColorIndex",xlAutomatic);}
{Range=Sheet.OlePropertyGet("Range","C1:F1");
Borders=Range.OlePropertyGet("Borders");
Borders=Borders.OlePropertyGet("Item",xlEdgeBottom);
Borders.OlePropertySet("LineStyle",xlContinuous);
Borders.OlePropertySet("Weight",xlThin);
Borders.OlePropertySet("ColorIndex",xlAutomatic);}
{Range=Sheet.OlePropertyGet("Range","C2");
Borders=Range.OlePropertyGet("Borders");
Borders=Borders.OlePropertyGet("Item",xlEdgeRight);
Borders.OlePropertySet("LineStyle",xlContinuous);
Borders.OlePropertySet("Weight",xlThin);
Borders.OlePropertySet("ColorIndex",xlAutomatic);}
{Range=Sheet.OlePropertyGet("Range","E2");
Borders=Range.OlePropertyGet("Borders");
Borders=Borders.OlePropertyGet("Item",xlEdgeRight);
Borders.OlePropertySet("LineStyle",xlContinuous);
Borders.OlePropertySet("Weight",xlThin);
Borders.OlePropertySet("ColorIndex",xlAutomatic);}
//Устанавливаем автофильтр
Range=Sheet.OlePropertyGet("Range","B3:G3");
Range.OleProcedure("AutoFilter");
//Закрепляем область шапки
Range=Sheet.OlePropertyGet("Range","A4");
Range.OleProcedure("Select");
Variant ActiveWindow=xlApp.OlePropertyGet("ActiveWindow");
ActiveWindow.OlePropertySet("FreezePanes",true);
TmpText="A"+IntToStr((Form6->StringGrid1->RowCount)+3+3)+":A"+IntToStr(y);
//Прячем не используемые сторки
Range=Sheet.OlePropertyGet("Range",TmpText);
Rows=Range.OlePropertyGet("Rows");
Rows.OlePropertySet("Hidden",true);
//Устанавливаем границы ячеек отчета
TmpText="A4:G"+IntToStr((Form6->StringGrid1->RowCount)+1);
Range=Sheet.OlePropertyGet("Range",TmpText);
Borders=Range.OlePropertyGet("Borders");
Borders.OlePropertySet("Weight",xlThin);
//Устанавливаем границы ячеек итога отчета
TmpText="A"+IntToStr((Form6->StringGrid1->RowCount-1)+3)\
+":G"+IntToStr((Form6->StringGrid1->RowCount-1)+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
{Borders=Range.OlePropertyGet("Borders");
Borders=Borders.OlePropertyGet("Item",xlEdgeLeft);
Borders.OlePropertySet("LineStyle",xlContinuous);
Borders.OlePropertySet("Weight",xlThin);
Borders.OlePropertySet("ColorIndex",xlAutomatic);}
//Отметка конца страницы
TmpText="A"+IntToStr((Form6->StringGrid1->RowCount-1)+3+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value","EndFile");
//Устанавливаем формат ячеек отчета
{TmpText="A4:A"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","ДД\.ММ\.ГГГГ");}
{TmpText="B4:B"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","чч:мм:сс");}
{TmpText="C4:C"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","@");}
{TmpText="D4:D"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","0");}
{TmpText="E4:E"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","@");}
{TmpText="F4:F"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","@");}
{TmpText="G4:G"+IntToStr((Form6->StringGrid1->RowCount-1)+2);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","000");}
{TmpText="G"+IntToStr((Form6->StringGrid1->RowCount-1)+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("NumberFormat","чч:мм:сс");}
//Экспортируем данные
for (i=1;i<Form6->StringGrid1->RowCount;i++) {
{TmpText="A"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[1][i]);}
{TmpText="B"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[2][i]);}
{TmpText="C"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[3][i]);}
{TmpText="D"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[4][i]);}
{TmpText="E"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[5][i]);}
{TmpText="F"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[6][i]);}
{TmpText="G"+IntToStr(i+3);
Range=Sheet.OlePropertyGet("Range",TmpText);
Columns=Range.OlePropertyGet("Columns");
Columns.OlePropertySet("Value",Form6->StringGrid1->Cells[7][i]);}
}
//Сохраняем файл
xlWorkbook.OleProcedure("Save");
xlWorkbook.OlePropertySet("Saved",true);
// xlApp.OlePropertySet("Visible",1);
xlApp.OleFunction("Quit");
ShowMessage("Запись добавлена!");
Interior=Unassigned;
Borders=Unassigned;
Range=Unassigned;
Columns=Unassigned;
Rows=Unassigned;
Sheet=Unassigned;
xlSheet=Unassigned;
xlWorkbooks=Unassigned;
xlWorkbook=Unassigned;
xlApp=Unassigned;
return;
}
//---------------------------------------------------------------------------
Удачи!
> Tue Feb 27 2001 15:35, Igor Gorbounov wrote to All:
>
> IG> Привет, All!
> IG> Поделитесь хоть каким-нибудь фрагментом программы,
> IG> работающей с Excel с использованием имеющихся в
> IG> C++ Builder'е объектов. Hикак не могу сообразить, как
> IG> с ними вообще работать. То, что предлагается в букваре
> IG> по Visual Basic'у для работы с Excel, совсем не работает
> IG> в CB5.
> IG> Помогите, кто может!
> IG> Игорь Горбунов
>
> Вот фрагмент из рабочей программы. /Целиком не прогходит, нарезал куски./
> [....]
Здорово!
Огромное спасибо!
А откуда вообще можно взять информацию обо всех этих
свойствах и методах?
И еще - для чего тогда нужны объекты ExcelApplication, ExcelWorkbook,
ExcelWorksheet со вкладки Servers, если все можно реализовать через
стандартный OLE-интерфейс с помощью ExcelOleObject?
И еще - у меня такой подход заработал (правда, я смог реализовать только
несколько операций до этого письма) только после добавления на
форму ExcelOleObject - это правильно, или я все-таки торможу?
Спасибо за пример,
Игорь Горбунов
Кому-нибудь удалось переименовать Workbook?
Что-то у меня никак не получается...
Игорь Горбунов