Excel
Необходимо из программы открыть экселевскую таблицу и записать туда чего-нибудь. Так вот как это сделать, плз, или где можно почитать, а то в билдеровской справке про это ничего конкретного не написано.
Здравствуте!
Необходимо из программы открыть экселевскую таблицу и записать туда чего-нибудь. Так вот как это сделать, плз, или где можно почитать, а то в билдеровской справке про это ничего конкретного не написано.
Написано про это в небезызвестной, я думаю, книге Архангельского "С++ Буилдер 5" (да и в 4 и 6 тоже про вкладку Servers есть). Кратко и доходчиво, имхо.
Написано про это в небезызвестной, я думаю, книге Архангельского "С++ Буилдер 5" (да и в 4 и 6 тоже про вкладку Servers есть). Кратко и доходчиво, имхо.
Хех, не ходите детки в Servers'ы гулять. Нихрена толоковго и сколь-либо работоспособного с их помощью написать не удавалось еще никому. Так что курите в сторону OLE&COM
Если ничего не найдешь, будет время, скину пример
По-порядку:
1. Книгу архангельского видел и даже читал но там написано только про сервер ворда. Кратко и доходчиво. Про ексель нет.
2. По сайту шарился тоже, где-то что-то есть вроде но тоже не шибко понятно.
Так что хороший пример+минимум комментариев был бы очень кстати чтобы раз и навсегда с этим разобраться.
и мне плиз, пример :) [email]relax@ural-sb.ru[/email]
Я документ Excel гружу в OLEContainer из БД MSSQLServer2k, потом его изменяю и опять в БД сохраняю. Выглядит это все следующим образом:
void __fastcall TfrmIsLeasing::pcZayaChange(TObject *Sender)
{
if(pcZaya->ActivePage->Caption != "Общая информация")
{
if(((TDMod*)DM)->aspRetRasch->Active)
{
((TDMod*)DM)->aspRetRasch->Close();
}
((TDMod*)DM)->aspRetRasch->Parameters->ParamByName("@Zaya")->Value = ((TDMod*)DM)->aspReturnProj->FieldByName("ZayaMTO_ID")->AsInteger;
((TDMod*)DM)->aspRetRasch->Parameters->ParamByName("@Spec")->Value = pcZaya->ActivePageIndex;
((TDMod*)DM)->aspRetRasch->Prepared = true;
((TDMod*)DM)->aspRetRasch->Open();
if(((TDMod*)DM)->aspRetRasch->FieldByName("Otchet")->IsNull)
{
LeasParam *Par = new LeasParam;
Par->Srok = 0;
Par->Period = 0;
Par->Avans = 0;
Par->Leas = 0;
TfrmDogParam *DogParam = new TfrmDogParam(this, Par);
if(DogParam->ShowModal() == mrOk)
{
delete DogParam;
TOleContainer *OC = new TOleContainer(pcZaya->ActivePage);
OC->Parent = pcZaya->ActivePage;
OC->Align = alClient;
if(OC->State == osEmpty)
{
AnsiString Name;
Name = "Универсальный отчет";
Screen->Cursor = crHourGlass;
((TDMod*)DM)->aspReturnOtchet->Parameters->ParamByName("@Name")->Value = Name;
((TDMod*)DM)->aspReturnOtchet->Prepared = true;
((TDMod*)DM)->aspReturnOtchet->Open();
TMemoryStream *MS = new(TMemoryStream);
try
{
MS = (TMemoryStream *)((TDMod*)DM)->aspReturnOtchet->CreateBlobStream(((TDMod*)DM)->aspReturnOtchet->FieldByName("Otchet"), bmRead);
if (MS->Size)
{
OC->LoadFromStream(MS);
OC->Iconic = false;
OC->SizeMode = smAutoSize;
OC->Run();
OC->DoVerb(ovShow);
}
}
__finally
{
delete MS;
}
Screen->Cursor = crDefault;
if (app.IsNull() | app.IsEmpty())
{
app = OC->OleObject;
}
else
{
app.Clear();
app = OC->OleObject;
}
if (book.IsNull() | book.IsEmpty())
{
book = app.OlePropertyGet("WorkSheets",1);
}
else
{
book.Clear();
book = app.OlePropertyGet("WorkSheets",1);
}
if(((TDMod*)DM)->aspReturnTechBySpec->RecordCount)
{
((TDMod*)DM)->aspReturnTechBySpec->First();
int Col = 1;
setValue(34,Col,((TDMod*)DM)->aspReturnTechBySpec->FieldByName("Поле")->AsString);
setValue(24,Col,(((TDMod*)DM)->aspReturnTechBySpec->FieldByName("Type")->AsString).Trim());
if((((TDMod*)DM)->aspReturnTechBySpec->FieldByName("Type")->AsString).Trim() == "Автомобиль")
{
setValue(36,1,"0,25");
}
else
{
if(((TDMod*)DM)->aspReturnTechBySpec->FieldByName("Прочее")->AsString == "36")
{
setValue(36,1,"0,20");
}
else
{
setValue(36,1,"0,10");
}
}
if(((TDMod*)DM)->aspRetCortege->Active)
((TDMod*)DM)->aspRetCortege->Close();
((TDMod*)DM)->aspRetCortege->Parameters->ParamByName("@Zaya")->Value = ((TDMod*)DM)->aspReturnProj->FieldByName("ZayaMTO_ID")->AsInteger;
((TDMod*)DM)->aspRetCortege->Parameters->ParamByName("@Num")->Value = pcZaya->ActivePageIndex;
((TDMod*)DM)->aspRetCortege->Prepared = true;
((TDMod*)DM)->aspRetCortege->Open();
while (!((TDMod*)DM)->aspRetCortege->Eof)
{
setValue(5,Col,(((TDMod*)DM)->aspRetCortege->FieldByName("Поле2")->AsString).Trim());
.... и так далее.
}
Функция SetValue - ниже
//---------------------------------------------------------------------------
char* __fastcall TfrmIsLeasing::toText(int row, int col)
{
static char cellText[256];
cellText[0] = 'A' + col;
sprintf(&cellText[1],"%d", row + 1);
return cellText;
}
//---------------------------------------------------------------------------
void __fastcall TfrmIsLeasing::setValue(int row, int col, AnsiString as)
{
Variant r = book.OlePropertyGet("Range", toText(row,col));
r.OlePropertySet("Value",String(as));
}
На работе запарка
...
// запускаем ехель
excel = Variant::CreateObject("Excel.Application");
excel = Variant::GetActiveObject("Excel.Application");
//делаем его видимым
excel.OlePropertySet("Visible", true);
// создаем книгу
book = excel.OlePropertyGet("WorkBooks");
book.OleFunction("Add");
// переходим на нужный лист - здесь на первый
sheet = excel.OlePropertyGet("WorkSheets", 1);
sheet.OleFunction("Activate"); // активируем выбранный лист
//пишем в ячейку А1 то что нам нужно
range = sheet.OlePropertyGet("Range", "A1");
range.OlePropertySet("Value","ячейка");
// можно поменят шрифт
font = range.OlePropertyGet("Font");
font.OlePropertySet("Name", "Courier New");
font.OlePropertySet("Size", "8");
font.OlePropertySet("Bold", 1);
...
А какие еще бывают OleFunction, OleProcedure и OleProperty можно оказывается узнать из справки Ехеля.
Вот оно как бывает.
Выкладываю как есть в программе
Если я пишу программу, работающую с Word+Excel 2k будет ли она так же работать на машине с установленным 97-офисом?
Неа, не будет, там вызовы функций поменялись. например Open в Ворде. Так что надо делать проверку версии и в зависимости от этого вызывать нужную функцию.
Неа, не будет, там вызовы функций поменялись. например Open в Ворде. Так что надо делать проверку версии и в зависимости от этого вызывать нужную функцию.
Это стрёмно, тоесть если целевая аудитория юзеров мой проги используют ворд97, то мне тоже придется его устанавливать на время написания проги.
А какие еще функции поменялись, где это посмотреть.
Это стрёмно, тоесть если целевая аудитория юзеров мой проги используют ворд97, то мне тоже придется его устанавливать на время написания проги.
А какие еще функции поменялись, где это посмотреть.
Самый простой способ, сравнить файлы word_2k.h vs word_97.h и word_2k_srvr.h vs word_97_srvr.h
которые есть в $BCB$\Include\Vcl
и мне плиз, пример :) [email]relax@ural-sb.ru[/email]
и мне примерчик если не Влом!!!
VladSoft!!!!
[email]vladsoft@inf.susu.ac.ru[/email]