Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2012, 10:45   #1
Пепс
 
Регистрация: 18.10.2011
Сообщений: 5
По умолчанию Из DBGrid в Excel: эксель отбрасывает часть данных

выгружаю данные в эксель из DBGrida
PHP код:
int f4_SaveToExcel(){//Экспорт всех ячеек в Excel 
TBookmark bm
int result,colrow
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 Sheetint Stolbint StrokaUnicodeString Strbool 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.
Почему все же эксел "отбрасывает" часть данных?
Как исправить?
Пепс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт данных из dbgrid в excel ippolit-ul БД в Delphi 0 14.04.2012 20:36
Перенос данных из DbGrid в Excel Nigadyai Общие вопросы Delphi 1 21.03.2010 02:31
искажение данных DBGrid в Excel-? Evgenii БД в Delphi 2 18.11.2009 00:43
проблемы экспорта данных из DBGrid в Excel GhostBZ БД в Delphi 11 31.08.2009 07:20
Вставка данных(Excel) из clipboard в DBGrid mahsus Общие вопросы Delphi 1 07.10.2007 02:02