выгружаю данные в эксель из DBGrida
PHP код:
int f4_SaveToExcel(){//Экспорт всех ячеек в Excel
TBookmark bm;
int result,col, row;
Screen->Cursor=crHourGlass;
Application->ProcessMessages();
result=f4_ExcelInit("");//Инициализация Excel
if(result==-1){Screen->Cursor=crDefault;return -1;}
Form4->DBGrid1->DataSource->DataSet->DisableControls();
bm=Form4->DBGrid1->DataSource->DataSet->GetBookmark();//Текущая ячейка
Form4->DBGrid1->DataSource->DataSet->First();
for(col=0;col<Form4->DBGrid1->FieldCount;col++){//добавляем имена колонок
result=f4_ExcelSend(1,col+1,1,Form4->DBGrid1->Fields[col]->DisplayLabel,true);
if(result==-1){Screen->Cursor=crDefault;return -1;}
}
Form4->ProgressBar1->Position=0;//Прогрессбар
Form4->ProgressBar1->Max=Form4->DBGrid1->DataSource->DataSet->RecordCount;
for(row=0;row<Form4->DBGrid1->DataSource->DataSet->RecordCount;row++){// получаем данные
Form4->ProgressBar1->Position=row;//Прогрессбар
for(col=0;col<Form4->DBGrid1->FieldCount;col++){
result=f4_ExcelSend(1,col+1,row+2,Form4->DBGrid1->Fields[col]->AsWideString,true);
if(result==-1){Screen->Cursor=crDefault;return -1;}
}
Form4->DBGrid1->DataSource->DataSet->Next();
}
Form4->DBGrid1->DataSource->DataSet->GotoBookmark(bm);//Текущая ячейка
Form4->DBGrid1->DataSource->DataSet->FreeBookmark(bm);
Form4->DBGrid1->DataSource->DataSet->EnableControls();
f4_ExcelVisible(true);//Сделать видимым Excel
Form4->ProgressBar1->Position=0;//Прогрессбар
Screen->Cursor=crDefault;
Application->ProcessMessages();
return 1;
}
//---------------------------
//===============================================
int f4_ExcelInit(UnicodeString File){//Подключение к Excel
try{//Если Excel запущен - подключиться к нему
XLSAPP=Variant::GetActiveObject("Excel.Application");}
catch (...){//Если Excel не запущен - запустить его
try{XLSAPP=Variant::CreateObject("Excel.Application");}
catch (...){
Application->MessageBox(L"Невозможно открыть Microsoft Excel."
L"Возможно, Excel не установлен на компьютере.",L"Ошибка",MB_OK+MB_ICONERROR);}
}
try{
if(File!=""){
XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("Open",File.w_str());}//Открыть документ
else XLSAPP.OlePropertyGet("WorkBooks").OleProcedure("add");//Создать новый документ
}
catch (...){
Application->MessageBox(L"Ошибка открытия файла Microsoft Excel.",
L"Ошибка",MB_OK+MB_ICONERROR);return -1;}
return 1;
}
//===============================================
int f4_ExcelVisible(bool i){//Показать/скрыть Excel
if(!XLSAPP.IsEmpty())XLSAPP.OlePropertySet("Visible",i);
return 1;
}
//===============================================
int f4_ExcelSend(int Sheet, int Stolb, int Stroka, UnicodeString Str, bool asText){//>>>
Variant ExcelSheet,Cur;//Запись данных в Excel (Лист, столбец, строка, "данные",как_текст?)
UnicodeString ErrStr;
asText = false;
if(Str=="")return 1;//Не писать "пустоту"
ErrStr=L"Ошибка при записи: лист "+IntToStr(Sheet)+", столбец "+IntToStr(Stolb)+", строка "+IntToStr(Stroka);
try{ExcelSheet=XLSAPP.OlePropertyGet("WorkSheets",Sheet);}
catch (...){Application->MessageBox(ErrStr.c_str(),
L"Ошибочный номер листа Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
XLSAPP.OlePropertyGet("Range", "A1:K1000").OlePropertySet("WrapText", true);
XLSAPP.OlePropertyGet("Range", "A1:K1000").OlePropertySet("ColumnWidth", 15);
try{Cur=ExcelSheet.OlePropertyGet("Cells",Stroka,Stolb);
if(asText)Cur.OlePropertySet("NumberFormat","@");//Форматировать ячейку как текст
Cur.OlePropertySet("Value",Str.w_str());
}
catch (...){Application->MessageBox(ErrStr.w_str(),
L"Ошибка Microsoft Excel",MB_OK+MB_ICONERROR); return -1;}
return 1;
Проблема: в эксел попадают "урезанные" данные, например в DBGrid значение ячейки 591145001, в экселе эта ячейка имеет значение 59114.
пробовал менять формат вот здесь:
PHP код:
if(asText)Cur.OlePropertySet("NumberFormat","@");//Форматировать ячейку как текст
Cur.OlePropertySet("Value",Str.w_str());}
вместо @ пробовал как число, и пустые кавычки ставлял - результат тот же.
если я все правильно понимаю, формат данных в DBGrid задается здесь
PHP код:
for(row=0;row<Form4->DBGrid1->DataSource->DataSet->RecordCount;row++){// получаем данные
Form4->ProgressBar1->Position=row;//Прогрессбар
for(col=0;col<Form4->DBGrid1->FieldCount;col++){
result=f4_ExcelSend(1,col+1,row+2,Form4->DBGrid1->Fields[col]->AsString,true);
if(result==-1){Screen->Cursor=crDefault;return -1;}
т.е. AsString.
Почему все же эксел "отбрасывает" часть данных?
Как исправить?