Здравствуйте George Seryakov, Вы писали:
S>>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL.
GS>...
S>>И вторая, написана на BCB 5.0 с использованием OLE-вызовов, примеров море в интернете, приводить не буду.
GS> Нет уж, покажи цикл. Заодно и узнаем, что такое ole-вызовы.
S>>Так вот... ATL-вариант делает это за 1 минуту 15 секунд, а OLE за 47 секунд, хотя, даже Inprise утверждает, что ATL круче OLE в плане новизны и правильности. Может я что-то не так сделал?
GS> Скорее всего делается вызов разных наборов методов. Типа в одном случае диспатч, а в другом — нет. Или ранж по-разному вычисляется.
Пожалуйста...
#define PS(param) PropertySet(param)
string XlsDocument::MakeAddr(int row,int col)
{
string cell;
char strrow[6];
int i,j;
col--;
if (col<0 || col>229 || row & 0xFFFF0000) //230 равно адресу IV (последний столбец)
return "A1";
if (i=col/26) //получаем первую букву столбца
{
j=col%26; //вторая буква стобца
cell+=char('A'-1 + i);
cell+=char('A' + j);
}
else //буква столбца состоит из одного символа
cell+=char('A' + col);
itoa(row,strrow,10);
cell+=strrow;
return cell;
}
void XlsDocument::WriteCell(const string &cell,const string &value)
{
Doc.Exec(PS("Range") << cell.c_str() << value.c_str());
}
//---------------------------Главный цикл
char tmp[32];
for (int j=1;j<16;j++)
for(int i=1;i<1001;i++)
{
itoa(j,tmp,10);
MyDoc.WriteCell(i,j,tmp);
}
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...