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", "П.І.Б. власника");
ускорение процесса передачи данных из БД в Ексель
В прощессе разработки появилась необходимость передавать содержимое
базы данных в Ексель... Я реализовал ее по средствам ОЛЕ... Но тот алгоритм, которым пользуюсь я (преведу ниже), работает ОЧЕНЬ долго. И хоть у меня БД содержить всего 160 строк, процесс передачи на моем Сампроне 2800 занимает 2 минуы, и на 600 пне минут 20!
В программе, при передачи данных, я прорисовываю каждую ячейку отдельно, отдельно задаю параметры бордюра, настройки и стиль шрифта...
Вот часть кода, которым я прорисовываю шапку таблици:
Код:
Ну типа того...
Я пробывал задавать общее параметры для бордюров, и настроек шрифта, для
всей таблици, но это не ускорило процесса...
Я вижу что Оле операции очень долгие, но что сделать не знаю. Я встречал
статью в которой описывался в двух словах ускорения процесса передачи,
путем обьединени передаваемой информации в один болк, и потом передачи этого
блока в Ексель... Но статья утеряна, а процес не реалезован...
Кстати еще вопрос: в крайнем столбце А, при прорисовке границ данной функцией,
левая граница (тоесть самая крайняя левая граница документа) не прорисовываеться,
с чем это может быть связано?
функция:
Код:
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);
}
}
{
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...
В прощессе разработки появилась необходимость передавать содержимое
базы данных в Ексель...
[/QUOTE]
1. Вставляй сразу диапазонами.
или
2. Создай строку в которой будут находится записи из твоей таблицы поля в которых разделены ТАБ-ом и вставь все это через Clipboard.
Пример: String s = "Поле 1\tПоле2\tПоле3\n\r\Поле 1\tПоле2\tПоле3\n\r\"; - и т.д.
Создать строку - это понятно, а вот если можо чуть подробней о Clipboard...
Код:
#include <clipbrd.hpp>
...
TClipboard *pClipboard = new TClipboard;
pClipboard->SetTextBuffer(s.c_str());
...
vVarCell=vVarSheet.OlePropertyGet("Range","A3:A3");
vVarSheeеt.OleProcedure("Paste");
...
TClipboard *pClipboard = new TClipboard;
pClipboard->SetTextBuffer(s.c_str());
...
vVarCell=vVarSheet.OlePropertyGet("Range","A3:A3");
vVarSheeеt.OleProcedure("Paste");
Работу вставки в эксел оттестируй сам - примерно это выглядит так.
[QUOTE=Dr_C++]Создать строку - это понятно, а вот если можо чуть подробней о Clipboard...[/QUOTE]
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
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
Код:
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");
...
...
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");
...
...
Но чтоб это можно было сделать, сперва нужно вызвать в Excel-e пункт меню: Сервис->Макрос->Безопастность, и на второй странице включить Доверять доступ к Visual Basic Project.
Надо только в BDE прописать альяс "demo" и указать в нем путь к demo.db
Это вообще часть наработок для компонента типа xlReport от Afalina Soft, так что пинимаются любые
замечания, жалобы и предложения.
Надеюсь это то, что нужно
http://rapidshare.de/files/26383023/xlGrid.zip.html
Он построен на основе TDBGrid, но с функцией сохранения в Excel.
Если не надо строить сильно навороченный отчет, то вполне подходит...
http://www.035.pfr.ru/vcl/vtkExport134BCB6.zip
Работает на порядок быстрее OLE, потому как просто пишет файл в формате Micro$oft Excel, так что даже наличие M$ Office на машине не обязательно.
Есть ещё VTKExport
Работает на порядок быстрее OLE, потому как просто пишет файл в формате Micro$oft Excel, так что даже наличие M$ Office на машине не обязательно.