C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с Excel
Liss
Отправлено: 19.06.2003, 18:16


Не зарегистрирован







В Дельфи можно было сделать так:

var
xlap,xl:variant;
i:integer;
begin
if SaveDialog1.Execute then
begin
XLap:= CreateOLEObject('Excel.Application');
xlap.workbooks.add;
XLap.visible := true;
xl:=xlap.Workbooks[1].Sheets[1];
i:=1;
Form1.Table1.First;
while not Form1.Table1.Eof do
begin
xl.Cells[i,1].Value:=Form1.Table1.FieldByName('Famil').AsString;
inc(i);
Form1.Table1.Next;
end;
xlap.ActiveWorkbook.SaveAs(SaveDialog1.FileName);
end;

При попытке сделать тоже в Buildere, не могу например:
xl:=xlap->Workbooks[1]->Sheets[1];

Как реализовать подобное, если есть пример киньте мылом пожалуйста:

slipatov@yandex.ru
Гость_Nick
Отправлено: 21.06.2003, 00:45


Не зарегистрирован







Если тебе это поможет, я работал так.


mExcel = Variant::CreateObject("excel.application");
mWorkBooks = mExcel.OlePropertyGet("workbooks");

Procedure Open("Open");

AnsiString fileName;
fileName = fileName.sprintf("%stemp\\%s",
aPatch.c_str(),
IBQ_ParamLoad->FieldByName("FILENAME")->AsString.c_str() );

bool openT;

mWorkBooks.Exec( Open << fileName.c_str());


mWorkBook = mExcel.OlePropertyGet("ActiveWorkbook");

// PropertySet Visibility("Visible");
// Visibility << True;
// mExcel.Exec(Visibility);



mWorkSheets = mWorkBook.OlePropertyGet("WorkSheets");
mActiveSheet = mWorkBook.OlePropertyGet("ActiveSheet");

int iNullKod = 0;
// --- хитрый вып насчет разной информации в одном листе
if ( IBQ_ParamLoadFIRSTSTR->Value> 0 ) iStr = IBQ_ParamLoadFIRSTSTR->Value;
else iStr -= IBQ_ParamLoadFIRSTSTR->Value;


PropertyGet Range("Range");



if ( IBQ_ParamLoadDATECELLSX -> Value == -1 ) cDate = Date();
else
if ( IBQ_ParamLoadDATECELLSX -> Value != -2 )
{

getDataR( IBQ_ParamLoadDATECELLSX->Value, IBQ_ParamLoadDATECELLSY->Value );
cDate = convertNormDate(bRange);
};


if ( IBQ_ParamLoadFIRSTSTR->Value != NULL )
while (iNullKod < 2 )
{
getDataR( IBQ_ParamLoadFN_TOVAR_ID->Value, iStr );
if ( bRange != "")
{
iNullKod = 0;
Application->ProcessMessages();
IBT_PNEW->Insert();
IBT_PNEWPRICES_ID->Value = -1;
IBT_PNEWPOSTAV_ID->Value = IBQ_ParamLoadPOSTAV_ID->Value;
IBT_PNEWTOVAR_ID->Value = mRange.OlePropertyGet("Value");

getDataR( IBQ_ParamLoadFN_NAME->Value, iStr );
IBT_PNEWNAME->Value = bRange;

if ( IBQ_ParamLoadFN_ARTICUL->Value != NULL )
{
getDataR( IBQ_ParamLoadFN_ARTICUL->Value, iStr );
IBT_PNEWARTICUL->Value = bRange;
};


Немного кривовато, это мой первый опыт работы с Excel из программы CBuilder 6
Гость_liss
Отправлено: 21.06.2003, 16:59


Не зарегистрирован







Таким способом делал и я сам, тем более что есть примеры и уроки в разделе "Уроки" данного сайта, для меня именно была интересна конструкция

xl:=xlap->Workbooks[1]->Sheets[1];

iAlexander
Отправлено: 24.06.2003, 17:41


Дежурный стрелочник

Группа: Участник
Сообщений: 70



А можно ли работать с листами Excel из 5-го Builder'a. Есть компоненты на закладке Server, но справка на них какая-то однообразная. Или же стоит ради такого дела переходить на Builder 6?
Liss
Отправлено: 24.06.2003, 17:50


Не зарегистрирован







>А можно ли работать с листами Excel из 5-го Builder'a.

Конечно можно, если хочешь напиши мне на мыло, я вышлю тебе пример, который будет работать с листами Excel, вообще без тех компонентов, которые есть на странице Servsers, кстати они в 6 перемещены на другую страницу.
slipatov@yandex.ru
Admin
Отправлено: 24.06.2003, 22:47


Владимир

Группа: Администратор
Сообщений: 1190



Бросьте пример по этой ссылке.
Пароль: if5edU7dk4

А на C++Builder 6 конечно стоит переходить,
и не только из-за закладки Servers.

Отредактировано Admin — 24 Jun 2003, 22:49
NikolayB
Отправлено: 25.06.2003, 06:54


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (iAlexander @ 24 Jun 2003, 17:41)
А можно ли работать с листами Excel из 5-го Builder'a. Есть компоненты на закладке Server, но справка на них какая-то однообразная. Или же стоит ради такого дела переходить на Builder 6?

Variant XL, ExcelWorkBook, ExcelWorkSheet;
try{
try{
XL=GetActiveOleObject("Excel.Application");
}
catch(EOleSysError &ErrConnect)
{
XL=CreateOleObject("Excel.Application");
}
}
catch(EOleSysError &Err)
{
return false;
}
XL.OlePropertySet("Visible",true);
ExcelWorkBook=XL.OlePropertyGet("Workbooks");
if( CreateNewBook->Checked )
ExcelWorkBook.OleProcedure("Add");
else
ExcelWorkBook.OleFunction("Open", BookName);

ExcelWorkBook = XL.OlePropertyGet("ActiveWorkbook");

ExcelWorkSheet = XL.OlePropertyGet("ActiveSheet");

После чего пользуешь ExcelWorkSheet по своему усмотрению
iAlexander
  Отправлено: 25.06.2003, 15:58


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Спасибо.
Все, что нужно — создать на основе шаблона лист, повставлять в ячейки значения(кол-во ячеек заранее не известно), распечатать и закрыть.

Я в нете нарыл какой-то компонент — адрес
http://www.ems-hitech.com/excelreport/download.phtml, но он платный.
Admin
Отправлено: 25.06.2003, 16:45


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE

Все, что нужно — создать на основе шаблона лист, повставлять в ячейки значения(кол-во ячеек заранее не известно), распечатать и закрыть.


Так посмотрите урок работы с шаблонами в Excel и пример:
http://www.cbuilder.ru/WinLesson/bles1_3.htm

Вернуться в Вопросы программирования в C++Builder