Borgir |
Отправлено: 08.09.2003, 08:24 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 48
|
Я понимаю, что вы сейчас будете страшно материться и отсылать меня в FAQ, но все же спрошу. Как же все-таки работать с EXCEL в Buildere 6? В FAQ описана прямая работа через OLE, а я хотел бы работать через компоненты ExcelApplication, ExcelWorksheet и тд. Все что от них надо это открыть определенный Экселевский файл, вставить в определенных местах некоторые значения и выставить у нужных ячеек типы границ. Сколько не пытался, никак не получается.
Заранее спасибо!!! |
|
ekya |
Отправлено: 08.09.2003, 13:05 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 27
|
Насколько я помню, как подсоединиться есть в примерах, может конечно для Ворда, что в принципе неважно.
Хотя я бы не посоветовал пользоваться компонетами, я работать через ОЛЕ |
|
Valdemar |
Отправлено: 16.09.2003, 15:42 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
Я не согласен с ekya, по поводу того, что лучше работать через OLE.
Во-первых, т.к. при работе с OLE применяется позднее связывание, поэтому компилятор не может проверить правильность кода программы на этапе компиляции, потому что он не знает существует ли у COM-сервера запрашиваемое свойство или функция. Из этого вытекает снижение скорости работы.
Во-вторых, уж очень много писанины получается если использовать OLE, а при использовании компонент с закладки Servers помогает Code Insight.
Конкретных примеров привести не могу, т.к. работал только с Word. Советую почитать хелп по VBA для Excel. Там есть описание всех свойств и методов. |
|
Гость_laifik |
Отправлено: 17.09.2003, 09:43 |
|
Не зарегистрирован
|
Только что занималась проблеммой Excel, вот примеры. Может это несколько не совсем ответы на все поставленные вопросы, но все таки:
Открытие файла через форму диалога:
CODE |
void __fastcall TPWordForm::N9Click(TObject *Sender)
{
// Устанавливаем путь к файлу
AnsiString sFile;
if (OpenDialog1->Execute())
{
sFile = OpenDialog1->FileName;
// Инициализируем Excel, открываем файл
try {
App=Variant::GetActiveObject("Excel.Application");
} catch(...) {
try { App=Variant::CreateObject("Excel.Application"); }
catch (...) {
Application->MessageBox("Невозможно открыть Microsoft Excel!"
" Возможно это приложение не установлено.","Ошибка",MB_OK+MB_ICONERROR);
}}
try {
App.OlePropertyGet("WorkBooks").OleProcedure("Open",sFile.c_str(),0,false,1);
Sh=App.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибка открытия книги Microsoft Excel!","Ошибка",MB_OK+MB_ICONERROR);
}
App.OlePropertySet("Visible",true);
Sh.Clear();
App.Clear();
}
}
Через OpenDialog1->FileName можно указать конкретный файл.
Далее, вставка данных из таблицы в Excel:
//---------------------------------------------------------------------------
void __fastcall TPWordForm::Button1Click(TObject *Sender)
{
MakeReport();
}
//---------------------------------------------------------------------------
// Данные в Exel
void TPWordForm::MakeReport()
{
TDateTime tor, s, po, rab;
AnsiString hos, mas, tran, na, fir;
float chas,opl;
int y;
ExcelInit("");
toExcelCell(1,1,String("Дата"));
toExcelCell(1,2,String("Фирма"));
// Определяем ширину столбцов
Sh.OlePropertyGet("Columns").OlePropertyGet("Item",1).OlePropertySet("ColumnWidth", 10);
Sh.OlePropertyGet("Columns").OlePropertyGet("Item",2).OlePropertySet("ColumnWidth", 7);
// Даем название листа книги
Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
Sh.OlePropertySet("Name", "Сверка");
//Соединение с таблицей БД
//Подсчет строк в таблице
y = Table1->RecordCount;
Table1->First();
do
{
for(int i=0; i<y; i++){
tor = Table1->AsDateTime;
toExcelCell(i+3, 1, String(tor));
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("Weight", 2);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);
hos = Table1->AsString;
toExcelCell(i+3, 2, String(hos));
Sh.OlePropertyGet("Cells", i+3,2).OlePropertySet("HorizontalAlignment", 3);
// где 4 — по левому краю, 2 — по правому, 3 — по центру)
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("Weight", 2);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);
Table1->Next();
}
}
while (Table1->Eof!=TRUE);
for (int l=1; l<=11; l++)
{
//Форматирование строк
//Первая строка
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
//Вторая строка
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);
if(!App.IsEmpty())App.OlePropertySet("Visible",true);
//---
Sh.Clear();
App.Clear();
Rang.Clear();
}
в .h прописано
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Db.hpp>
#include <DBCtrls.hpp>
#include <DBGrids.hpp>
#include <DBTables.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <OleServer.hpp>
#include "Word_2K_SRVR.h"
#include <DB.hpp>
#include "Excel_2K_SRVR.h"
#include <Menus.hpp>
#include <utilcls.h>
#include <OleCtnrs.hpp>
#include <Dialogs.hpp>
#include <dbcgrids.hpp>
#include <Mask.hpp>
#include <comobj.hpp>
#include "CSPIN.h"
#include <ComCtrls.hpp>
#include <AppEvnts.hpp>
private: // User declarations
void __fastcall formulaExcel(int sRow, int sColumn, int row);
void __fastcall ExcelInit(String File);
void __fastcall toExcelCell(int c1,int c2, String data);
void __fastcall toExcelCell(int c1,int c2, Variant data);
void MakeReport();
void __fastcall Connect(void);
|
Все это у меня работает, если чего лишнего не убрала за ненадобностью загромождения. Оставила вывод двух столбцов.
Отредактировано Admin — 17/09/2003, 15:08 |
|
Borgir |
Отправлено: 17.09.2003, 14:01 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 48
|
Пришлось мне сделать работу с EXCEL через ОЛЕ. Вроде бы все работает нормально: файл открывает, данные в ячейки перегоняет, EXCEL показывает и тд. Но вот с закрытием какие-то глюки получаются. Я сделал закрытия приложения EXCEL в событии OnClose формы. Визуально вроде бы все закрывается нормально. Но в процессах остается висеть "Excel.exe", и как результат второй раз открытие Excel невозможно. То есть он вроде как открывает файл, но на экране появляется только верхняя часть окна EXCEL, а рабочего пространства (где должна быть таблица) нет. Подскажите как правильно закрывать ентот EXCEL из моего приложения?
Заранее спасибо! |
|
Admin |
Отправлено: 17.09.2003, 16:33 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | а я хотел бы работать через компоненты ExcelApplication, ExcelWorksheet и тд |
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog->Execute();
ExcelApplication->Connect();
ExcelWorkbook->ConnectTo(ExcelApplication->Workbooks->
Open(WideString(OpenDialog->FileName)));
ExcelWorksheet->ConnectTo(ExcelWorkbook->ActiveSheet);
ExcelApplication->set_Visible(0, true);
// .....
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ExcelWorksheet->Disconnect();
ExcelWorkbook->Disconnect();
ExcelApplication->Quit();
ExcelApplication->Disconnect();
}
//----------------------------------------
|
|
|
|