powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Export в Excel из ADO через диапазон
2 сообщений из 2, страница 1 из 1
C++ Export в Excel из ADO через диапазон
    #38003011
Freeze729
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается преобразовать кусок кода из дельфи в с++

Цель такая. Экспорт данных из выборки БД в лист excel. Пока получается копировать данные по ячейкам, скорость 50-100 значений в секунду. Это уснуть можно.
Хочется экспорт делать через выделенный диапазон.
Как сформировать массив в С++? Я чет потужился, ошибок посмотрел разных, форумы полазил, не хватает процессоров осмыслить.

Вот дельфевый код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var MyRange,V:OleVariant;
...
MyRange:=ExcelWorksheet1.Range['A2','C4'];
V:=VarArrayCreate([0,2,0,2], varVariant);
V[0,0]:=4;
V[0,1]:=6;
V[0,2]:=1;
V[1,0]:=8;
V[1,1]:=9;
V[1,2]:=0;
V[2,0]:=5;
V[2,1]:=7;
V[2,2]:=3;
MyRange.Value:=V;




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Variant V; //massiv for data
//V=SafeArrayCreate(VT_DISPATCH,0,2,LPVOID(&CLSID_VObj));

ADOQuery3->First();
int s_rowcount= ADOQuery3->RecordCount;
if (s_rowcount>65000) {s_rowcount=64999;}
for(int k = 1; k <= s_rowcount; k++)
{
  ProgressBar1->Position=k;
  Label31->Caption=IntToStr(int(100*k/ProgressBar1->Max))+"%";

  j++;
  for(int i = 0; i < ADOQuery3->FieldCount; i++)
  {
    Application->ProcessMessages();
	r = xlRCtoA1(j, i + 1,false,false);
// Если раскомментить, то будет экспорт данных по ячейкам, скорость 50-100(max) в секунду
	//my_range = ExcelWorksheet1->get_Range(TVariant("A1"), TVariant(r));
	//my_range = my_range->get_Cells()->get_Item(TVariant(j), TVariant(i + 1));
	//if(ADOQuery3->Fields->Fields[i]->DataType != ftDateTime)
	//my_range->set_NumberFormat(TVariant("@"));
	//my_range->set_Value(TVariant(ADOQuery3->Fields->Fields[i]->AsString.c_str()));
	//V[j][i]= ADOQuery3->Fields->Fields[i]->AsString.c_str();
              // тут каким-то образом нужно наполнить массив
  }
  if(!ADOQuery3->Eof)
  ADOQuery3->Next();
}
r = xlRCtoA1( s_rowcount, ADOQuery3->FieldCount,false,false);
my_range = ExcelWorksheet1->get_Range(TVariant("A2"), TVariant(r));
//тут данные сливаем в диапазон excel
my_range-> set_Value(TVariant(V));
ADOQuery3->First();
ExcelApplication1->set_Visible(0,true);
ExcelWorksheet1->Disconnect();
delete ExcelWorksheet1;
ExcelWorkbook1->Disconnect();
delete ExcelWorkbook1;

ExcelApplication1->Disconnect();
delete ExcelApplication1;



Материал взят с винграда http://forum.vingrad.ru/topic-84634.html
...
Рейтинг: 0 / 0
C++ Export в Excel из ADO через диапазон
    #38003276
Freeze729
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге на чем остановился:
Код: plaintext
1.
2.
3.
ii=ADOQuery3->FieldCount;
jj=ADOQuery3->RecordCount+1;
Variant V= VarArrayCreate(OPENARRAY(int, (2, jj, 0, ii)), varVariant);



потом в цикле
Код: plaintext
1.
V.PutElement(ADOQuery3->Fields->Fields[i]->AsString,j,i);


После цикла
Код: plaintext
1.
my_range->set_Value2(TVariant(V));


И удалить массив

По ячейкам такое делалось больше 5 мин, дальше не выдерживал, останавливал.
Сейчас: 20К строк 4 столбца за 10-20 сек.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Export в Excel из ADO через диапазон
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]