Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ускорение процесса передачи данных из БД в Ексель

13K
13 июня 2006 года
Dr_C++
40 / / 07.06.2006
Я разрабатываю программу (CB 6) работающую с базами данных..
В прощессе разработки появилась необходимость передавать содержимое
базы данных в Ексель... Я реализовал ее по средствам ОЛЕ... Но тот алгоритм, которым пользуюсь я (преведу ниже), работает ОЧЕНЬ долго. И хоть у меня БД содержить всего 160 строк, процесс передачи на моем Сампроне 2800 занимает 2 минуы, и на 600 пне минут 20!
В программе, при передачи данных, я прорисовываю каждую ячейку отдельно, отдельно задаю параметры бордюра, настройки и стиль шрифта...

Вот часть кода, которым я прорисовываю шапку таблици:
Код:
vVarCell=vVarSheet.OlePropertyGet("Range","A1:P1");                   //заголовки таблици
    vVarCell.OleProcedure("Merge");
    vBorder(vVarCell,2,1,49);
    vFont(vVarCell,-4108,-4108,12,0,1,clBlack,1,0,0);
    vVarCell.OlePropertySet("Value", "НАРАХУВАННЯ КВАРТИРНОЇ ПЛАТИ ПО ОСББ \"КОРОНА-ВВЕДЕНСЬКА\"");

    vVarCell=vVarSheet.OlePropertyGet("Range","A2:P2");
    vVarCell.OleProcedure("Merge");
    vBorder(vVarCell,2,1,49);
    vFont(vVarCell,-4108,-4108,12,0,1,clBlack,1,0,0);
    vVarCell.OlePropertySet("Value", AnsiString(main->Month + " " + main->Year).c_str());    

    vVarCell=vVarSheet.OlePropertyGet("Range","A3:A4");    //№ квартири
    vVarCell.OleProcedure("Merge");
    vBorder(vVarCell,2,1,49);
    vFont(vVarCell,-4108,-4108,6,0,1,clBlack,4,0,0);
    vVarCell.OlePropertySet("ColumnWidth",4);
    vVarCell.OlePropertySet("RowHeight", 8.2);
    vVarCell.OlePropertySet("Value", "№ кв.");

    vVarCell=vVarSheet.OlePropertyGet("Range","B3:B4");   //о/рахунок
    vVarCell.OleProcedure("Merge");
    vBorder(vVarCell,2,1,49);
    vFont(vVarCell,-4108,-4108,6,0,1,clBlack,4,0,0);
    vVarCell.OlePropertySet("ColumnWidth",5.5);
    vVarCell.OlePropertySet("Value", "о/рахунок");

    vVarCell=vVarSheet.OlePropertyGet("Range","C3:C4");    //П.І.Б. власника
    vVarCell.OleProcedure("Merge");
    vBorder(vVarCell,2,1,49);
    vFont(vVarCell,-4108,-4108,6,0,1,clBlack,4,0,0);
    vVarCell.OlePropertySet("ColumnWidth",20);
    vVarCell.OlePropertySet("Value", "П.І.Б. власника");


Ну типа того...

Я пробывал задавать общее параметры для бордюров, и настроек шрифта, для
всей таблици, но это не ускорило процесса...
Я вижу что Оле операции очень долгие, но что сделать не знаю. Я встречал
статью в которой описывался в двух словах ускорения процесса передачи,
путем обьединени передаваемой информации в один болк, и потом передачи этого
блока в Ексель... Но статья утеряна, а процес не реалезован...

Кстати еще вопрос: в крайнем столбце А, при прорисовке границ данной функцией,
левая граница (тоесть самая крайняя левая граница документа) не прорисовываеться,
с чем это может быть связано?

функция:
Код:
void Tmain::vBorder(Variant& vVarCell,int Weight,int LineStyle,int ColorIndex)
{
 for(int i=8; i <= 10; i++)
 {
  switch(LineStyle)
 {
   case 1:
   case -4115:
   case 4:
   case 5:
   case -4118:
   case -4119:
   case 13:
   case -4142:
     VarCell.OlePropertyGet("Borders",10).OlePropertySet("LineStyle",LineStyle);
   break;
   
 default:
   vVarCell.OlePropertyGet("Borders",i).OlePropertySet("LineStyle",1);
 }
 
 switch(Weight)
 {
 case 1:
 case -4138:
 case 2:
 case 4:
    vVarCell.OlePropertyGet("Borders",i).OlePropertySet("Weight",Weight);
    break;
 default:
   vVarCell.OlePropertyGet("Borders",i).OlePropertySet("Weight",1);
 }
 vVarCell.OlePropertyGet("Borders",i).OlePropertySet("ColorIndex",ColorIndex);
 }
}


Возможно я дал не полную информацию по моей проблеме, так что в случае чего жду уточнающих вопросов...
Надо постараться ускорить процесс передачи данных, хотябы раз в 10...
246
14 июня 2006 года
GIZMO
1.8K / / 30.07.2004
[QUOTE=Dr_C++]Я разрабатываю программу (CB 6) работающую с базами данных..
В прощессе разработки появилась необходимость передавать содержимое
базы данных в Ексель...

[/QUOTE]
1. Вставляй сразу диапазонами.
или
2. Создай строку в которой будут находится записи из твоей таблицы поля в которых разделены ТАБ-ом и вставь все это через Clipboard.
Пример: String s = "Поле 1\tПоле2\tПоле3\n\r\Поле 1\tПоле2\tПоле3\n\r\"; - и т.д.
13K
26 июня 2006 года
Dr_C++
40 / / 07.06.2006
Создать строку - это понятно, а вот если можо чуть подробней о Clipboard...
1
26 июня 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=Dr_C++]Создать строку - это понятно, а вот если можо чуть подробней о Clipboard...[/QUOTE]
 
Код:
#include <clipbrd.hpp>
...

TClipboard *pClipboard = new TClipboard;
pClipboard->SetTextBuffer(s.c_str());

...
vVarCell=vVarSheet.OlePropertyGet("Range","A3:A3");            
vVarSheeеt.OleProcedure("Paste");

Работу вставки в эксел оттестируй сам - примерно это выглядит так.
246
26 июня 2006 года
GIZMO
1.8K / / 30.07.2004
[QUOTE=Dr_C++]Создать строку - это понятно, а вот если можо чуть подробней о Clipboard...[/QUOTE]
Специальное предложение:
http://forum.codenet.ru/showthread.php?t=26390
9.4K
27 июня 2006 года
_nоrth_
99 / / 24.04.2006
1. Возможно цвет левой границы совпадает с цветом фона и поэтому она не видна.

2. Можно написать макрос на Excel и записать напр. в C:\macro.bas
Код:
Public Sub Макрос()
  Dim Rng As Range
  With ActiveSheet
    Set Rng = Range("A1", "P1")
    Rng.Merge
    Rng.HorizontalAlignment = xlCenter
    Rng.Value = """НАРАХУВАННЯ КВАРТИРНОЇ ПЛАТИ ПО ОСББ ""КОРОНА-ВВЕДЕНСЬКА"""
   
    Set Rng = Range("A2", "P2")
    Rng.Merge
    Rng.HorizontalAlignment = xlCenter
    Rng.Value = Str(Month(Now())) & " " & Year(Now())
   
    Set Rng = Range("A3", "B3")
    Rng.Merge
    Rng.ColumnWidth = 4
    Rng.HorizontalAlignment = xlCenter
    Rng.Value = "№ кв."
   
    Set Rng = Range("C3", "D3")
    Rng.Merge
    Rng.ColumnWidth = 8.2
    Rng.HorizontalAlignment = xlCenter
    Rng.Value = "о/рахунок"
   
    Set Rng = Range("E3", "F3")
    Rng.Merge
    Rng.ColumnWidth = 20
    Rng.HorizontalAlignment = xlCenter
    Rng.Value = "П.І.Б. власника"
  End With
End Sub
И поместить этот код процедурой CBuilder, в Excel таблицу и выполнить макрос. Напр.
 
Код:
Variant Excel = CreateOleObject("Excel.Application");
  Excel.OlePropertyGet("Workbooks").OleProcedure("Add");
  Variant WorkBook = Excel.OlePropertyGet("Workbooks", 1) ;
  WorkBook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleProcedure("Import", "C:\\macro.bas");
  Excel.OleProcedure("Run", "Макрос");
  WorkBook.OleProcedure("SaveAs", "C:\\WB01.xls");
  ...
  ...
И точно также, минуя CBuilder, импортировать данные Excel-ом.

Но чтоб это можно было сделать, сперва нужно вызвать в Excel-e пункт меню: Сервис->Макрос->Безопастность, и на второй странице включить Доверять доступ к Visual Basic Project.
20K
20 июля 2006 года
Rem Norton
4 / / 19.07.2006
В приложенном архиве класс для работы с Excel (создание отчета по шаблону), демка, шаблон, база и все дела там же.
Надо только в BDE прописать альяс "demo" и указать в нем путь к demo.db

Это вообще часть наработок для компонента типа xlReport от Afalina Soft, так что пинимаются любые
замечания, жалобы и предложения.


Надеюсь это то, что нужно
20K
20 июля 2006 года
Rem Norton
4 / / 19.07.2006
Вот нашел у себя еще компонент, может пригодится качать отсюда:
http://rapidshare.de/files/26383023/xlGrid.zip.html
Он построен на основе TDBGrid, но с функцией сохранения в Excel.
Если не надо строить сильно навороченный отчет, то вполне подходит...
294
24 июля 2006 года
Plisteron
982 / / 29.08.2003
Есть ещё VTKExport http://www.035.pfr.ru/vcl/vtkExport134BCB6.zip
Работает на порядок быстрее OLE, потому как просто пишет файл в формате Micro$oft Excel, так что даже наличие M$ Office на машине не обязательно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог