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

 
Отчет на C++Builder в Excel, Передача данных из DBGrid в Excel
еБЦЕМХИ
Отправлено: 25.08.2004, 15:24


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







Как данные конкретно из DBGrid передать в Excel. Напишите пожалуйста пример кода. Спасибо!
olegenty
Отправлено: 26.08.2004, 10:01


Ветеран

Группа: Модератор
Сообщений: 2412



Ну из DBGrid — это неверная формулировка по любому.
Как в одном из рядом стоящих сообщений сказал AVC, реально из DBGrid->DataSource->DataSet. DBGrid — это просто контрол, в нём никаких данных нет, он их только отображает.

а реальный код — да пожалуйста:
CODE

try
   {
       ex = Variant::CreateObject("Excel.Application");
       AnsiString asTemplate = ExtractFilePath(Application->ExeName) + "Templates\\Sign.xlt";
       ex.OlePropertyGet("Workbooks").OleProcedure("Open", asTemplate.c_str(), 0, false, 1);
       CExcelExp::Export(ex, "C1", fdsSignsSIGN->AsString);
       CExcelExp::Export(ex, "C2", fdsSignsNAME->AsString);
       CExcelExp::Export(ex, "C3", fdsSignsPRINT_SIGN->AsInteger);
       CExcelExp::Export(ex, "C4", fdsSignsDESCRIPTION->AsString);

       SUnit *u = CPDBUtils::SelectUnit(fdsSignsPARENT_ID->AsInteger);
       CExcelExp::Export(ex, "C7", u->CODE);
       CExcelExp::Export(ex, "C8", u->DESIGN);
       CExcelExp::Export(ex, "C9", u->NAME);
       delete u;

       int i = 13;

       fdsSignJoins->DisableControls();
       fdsSignJoins->First();
       while (!fdsSignJoins->Eof)
       {
           Variant A(OPENARRAY(int, (0, 4)), varVariant);
           A.PutElement(fdsSignJoinsPOS->AsInteger  , 0);
           A.PutElement(fdsSignJoinsCODE->AsString  , 1);
           A.PutElement(fdsSignJoinsDESIGN->AsString, 2);
           A.PutElement(fdsSignJoinsNAME->AsString , 3);
           A.PutElement(fdsSignJoinsNUM->AsString   , 4);
           AnsiString asRange = "A"+ IntToStr(i) + ":E" + IntToStr(i);
           CExcelExp::Export(ex, asRange.c_str(), A);
           i++;
           fdsSignJoins->Next();
       }
       fdsSignJoins->First();
       fdsSignJoins->EnableControls();

       ex.OlePropertySet("Visible", true);
       ex.Clear();
   } catch (...)
   {
       Application->MessageBox("Невозможно передать данные в Excel",
                               "Возможно, Excel не установлен на Вашем компьютере",
                               MB_OK + MB_ICONERROR);
   }


код — реально рабочий. чтобы разобраться, как же именно он имеет место работать, почитай Уроки на данном сайте.

CExcelExp — простенький статический класс:
CExcelExporter.h
CODE

#ifndef CExcelExporterH
#define CExcelExporterH

#include <system.hpp>

class CExcelExp
{
public:
   static void __fastcall Export(Variant App, const char *Exc, int off, AnsiString data);
   static void __fastcall Export(Variant App, const char *Exc, double data);
   static void __fastcall Export(Variant App, const char *Exc, int data);
   static void __fastcall Export(Variant App, const char *Exc, AnsiString data);
   static void __fastcall Export(Variant App, const char *Exc, Variant data);
};

#endif

CExcelExporter.cpp
CODE

#pragma hdrstop

#include "CExcelExporter.h"

#pragma package(smart_init)

void __fastcall CExcelExp::Export(Variant App, const char *Exc, int off, AnsiString data)
{
   try {
       App.OlePropertyGet("Range", Exc).OlePropertyGet("Offset", off).OlePropertySet("Value", data.c_str());
   } catch(...) {; }
}

void __fastcall CExcelExp::Export(Variant App, const char *Exc, double data)
{
   try {
       App.OlePropertyGet("Range", Exc).OlePropertySet("Value", data);
   } catch(...) {; }
}

void __fastcall CExcelExp::Export(Variant App, const char *Exc, int data)
{
   try {
       App.OlePropertyGet("Range", Exc).OlePropertySet("Value", data);
   } catch(...) {; }
}

void __fastcall CExcelExp::Export(Variant App, const char *Exc, AnsiString data)
{
   try {
       App.OlePropertyGet("Range", Exc).OlePropertySet("Value", data.c_str());
   } catch(...) {; }
}

void __fastcall CExcelExp::Export(Variant App, const char *Exc, Variant data)
{
   try {
       App.OlePropertyGet("Range", Exc).OlePropertySet("Value", data);
   } catch(...) {; }
}


исключительные ситуации невредно бы иначе обрабатывать, но лень, и так работает.

fdsSignsJoins тут и есть тот самый DBGrid->DataSource->DataSet
iAlexander
Отправлено: 31.08.2004, 14:05


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

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



Вот это довольно интересный вопрос, я как раз сейчас занимаюсь написанием некого репорт-подобия.
Пытаюсь автоматизировать процесс создания отчетов.
Для хранения таблицы использую TGrid, ну это просто для скорости, по-хорошему, конечно нужно бы делать свою структуру, но нет желания долго возиться. А идея в том, что есть некий объект-менеджер отчета, он просто использует Grid для визуализации и хранения данных, при этом может автоматом загнать отчет в предварительно созданный Excel шаблон. Ну и представляет суммарную строку (как в EhLib примерно)
У кого интересные идеи? Предложения? Опыт? Готовые Excel библиотеки biggrin.gif ?
Не надо кода, тех. подробностей — просто iDeas
AVC
Отправлено: 31.08.2004, 14:21


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Для хранения таблицы использую TGrid

Не понял. Как в TGrid можно хранить таблицу? Обычно этим занимается СУБД. А вообще вопрос уже обсасывался не один раз. Можно покопаться в статьях, на форуме или в FAQ.
AVC
Отправлено: 31.08.2004, 14:30


Ветеран

Группа: Модератор
Сообщений: 1583



Посмотрите "Уроки". Там есть очень симпатичная статья про Excel и Builder.
iAlexander
Отправлено: 31.08.2004, 17:24


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

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



Ну ладно..
Я не прошу помощи...
AVC
TStringGrid! не TDBGrid! (ну забыл про String...)
Просто хотел пообщаться на отвлеченные темы... cool.gif
Насчет Екселя — есть уже и у меня своя библиотечка, это просто вроде шутки было
** Nick
Отправлено: 07.09.2004, 11:11


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







А вот насчет уроков
у меня проблемка есть небольшая.
Если формировать подряд несколько файлов,
то получаем ошибочку "Сервер RPC недоступен"
Подозреваю что Excell не успевает закрыться в случае если закрывать его вместе с книгой,
а если не закрывать еще что то непотребное происходит.
Пока не решил эту проблему, есть дела поважнее.

Наверно все же лучше писать прямо в файл как это сделал автор ehLib.

ynkulbyh
Отправлено: 08.09.2004, 10:14


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

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



есть такая вещь, называется xml

ексель ее замечательно открывает, дельфи и билдер имеет инструменты работы с xml (TXMLDocument) довольно простые.

xml открыт и т.д. и т.п. зачем юзать формат екселя? если пользователю это так надо он сам может все засейвить в формат екселя.

плюс если xml то работа программы не зависит от того, установлен ли ексель на компьютер.
Guest
Отправлено: 08.09.2004, 15:07


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







Если можно поподробнее про XML,
ни демо ни путевого хелп не нашел,
есть еще очень интересная для меня статья

http://www.ibase.ru/devinfo/xmldb.htm

хотя это может это совсем другое

Dimon.Ru
Отправлено: 27.10.2004, 10:01


Станционный диспетчер

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



у меня тоже есть задача переноса данных в Ёксель.

сейчас реализован вариант работы с excel-сервером. и заранее созданным шаблоном.

хотелось бы не бытьзавязанным на екселе, так как он может быть не установлен на компьютере, где будет работать моя программа.

ПОЖАЛУЙСТА, напишите подробнее про XML!!!!
хотя бы ссылки, что б почитать....

Вернуться в Работа с базами данных в C++Builder