еБЦЕМХИ |
Отправлено: 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 библиотеки ?
Не надо кода, тех. подробностей — просто 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...)
Просто хотел пообщаться на отвлеченные темы...
Насчет Екселя — есть уже и у меня своя библиотечка, это просто вроде шутки было |
|
** 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!!!!
хотя бы ссылки, что б почитать.... |
|
|