Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

Excel   Найти похожие ветки 

 
snake77   (2005-12-08 16:51) [0]

Здравствуйте!
Нашел на сайте кусок исходника экспортирующий в эксель заданную выборку,
все нормально, но толко если я вызываю эту процедуру раза три , то на четвертом или раньше программа на строке
  ExcelApp.Visible := True;
просто зависает не отображая эксель , хотя в списке процессов висит эксель.

Че не так??
может надо как то освобождать переменную ExcelApp??


текст процедуры

Var
  ShFile: String; Querys:TDataSet;

  ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
  BeginCol, BeginRow, j: integer;
  RowCount, ColCount: Integer;
Begin
  BeginCol := 1;
  BeginRow := 3;
  Querys:=DBGrid1.DataSource.DataSet;

// Размеры выводимого массива данных
  ColCount := Querys.FieldDefs.Count;

// Создание Excel
  ExcelApp := CreateOleObject("Excel.Application");

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  ExcelApp.Application.EnableEvents := false;

//  Создаем Книгу (Workbook)
//  Если заполняем шаблон, то
  Workbook := ExcelApp.WorkBooks.Add(ShFile);

// Заполняем массив
  ShowMessageForm("Подготовка экспорта",true);

  Querys.DisableControls;
  Querys.First;
  while not Querys.Eof do
   Begin
    Inc(RowCount);
    Querys.Next;
   end;
  CloseMEssageForm;
  For J := 1 To Querys.FieldDefs.Count Do
   Begin
       Cell1 := WorkBook.WorkSheets[1].Cells[1,j];
       Cell1.NumberFormat:="@";
       Cell1.Value:=Querys.Fields[j - 1].DisplayLabel;
       Cell1.Columns.AutoFit;
   end;

  ShowPrMessageForm("экспорт данных в XLS формат",0,RowCount,0);
  Querys.First;

  While Not Querys.eof Do
  Begin
      ShowProgress(Querys.RecNo);
      For J := 1 To Querys.FieldDefs.Count Do
      Begin
       Cell1 := WorkBook.WorkSheets[1].Cells[Querys.RecNo+1,j];
       Cell1.NumberFormat:="@";
       Cell1.Value:=Querys.Fields[j - 1].AsString;
       Cell1.Columns.AutoFit;
      End;

      Querys.Next;
  End;

  Querys.EnableControls;
  CloseMessageform;

// Делаем Excel видимым
  ExcelApp.Visible := True;


 
snake77   (2005-12-08 17:22) [1]

Удалено модератором


 
MetalFan ©   (2005-12-08 17:26) [2]

ExcelApp := nil; ?


 
MetalFan ©   (2005-12-08 17:28) [3]

или null


 
MetalFan ©   (2005-12-08 17:28) [4]

простите за флуд) савсем запутался)
ExcelApp := UnAssigned;


 
snake77   (2005-12-08 17:43) [5]

сработало и просто null
тока вот чейто я н понимаю в чем прикол то?
объект то я не освобождаю таким образом а всего то обнуляю указатель
вчем тут криминал, ведь я то переменную использую локальную т.е. она всеравно удаляется после завершения процедуры


 
NiGGa ©   (2005-12-08 17:56) [6]

1. Эта мессага возникает?
ShowPrMessageForm("экспорт данных в XLS формат",0,RowCount,0);

2. Очень тормознутый подход к перекидыванию данных, никто так не делает(потому что смотри справку), вобщем это из-за тормознутости ОЛИ. Используется что-то вида

function ReferenceToCell(const ARow, ACol: Cardinal): string;
begin
 Result := Chr(Ord("A") + ACol - 1) + IntToStr(ARow);
end; {Reference to Cell}

 xlData := VarArrayCreate([0, rowCount, 0, colCount], varVariant);

 xlSheet := xlApp.Workbooks[1].WorkSheets[1];

 xlSheet.Range[ReferenceToCell(1, 1), ReferenceToCell(rowCount + 1, colCount + 1)].Value := xlData;

Заполняется же с квери xlData (тип OLEVariant, если не догадался).
при таком подходе весь массив за раз перекидывается.

3. И полседнее по порядку но не по важности
 Workbook := ExcelApp.WorkBooks.Add(ShFile);
что в ShFile ?

4. Конешно ExcelApp нужно освобождать.
Где-то так:
     ExcelApp.DisplayAlerts := False;
     ExcelApp.Quit;
     ExcelApp := Unassigned;


 
NiGGa ©   (2005-12-08 17:59) [7]


> сработало и просто null
> тока вот чейто я н понимаю в чем прикол то?

и Ексель из процессов выгружается?


 
snake77   (2005-12-08 18:01) [8]


> 3. И полседнее по порядку но не по важности
>  Workbook := ExcelApp.WorkBooks.Add(ShFile);
> что в ShFile ?


имя файла

> 2. Очень тормознутый подход к перекидыванию данных....

тормознутый не спорю %)
но данных перекидывается не много , да и честно говоря хотелось самому немного разобраться ;)
чем нежели использовать полностью готовый исходник


> 1. Эта мессага возникает?


угу, при трассировке зависала именно на ExcelApp.Visible := True;


 
snake77   (2005-12-08 18:03) [9]


> и Ексель из процессов выгружается?


;)
спасибо что сказал
неа , висит там родный
причем видимо со временем закрывается потому как я прбовал раз 10
его запустить а висит их там чтуки 4


 
snake77   (2005-12-08 18:13) [10]

блин а после ExcelApp.Quit;
эксель просто закрывается сам собой :(


 
NiGGa ©   (2005-12-08 18:27) [11]

Гы. А что не должен?


 
snake77   (2005-12-08 18:54) [12]

поидее нет, пользователь то должен посмотреть на это безобразие и ежели оно его устраивает то сохранить куданить


 
NiGGa ©   (2005-12-08 19:26) [13]

бррр. тогда без ExcelApp.Quit; но обезательно с Visible := True; иначе кто его закрывать будет?

А вообще советую поекспериментировать :)


 
MU ©   (2005-12-08 19:35) [14]

Может, завести у формы член xlApp : OleVariant, а не в функции?

procedure Form1.OnClick()
begin
 //Если Excel уже запущен, то получить его, а не запускать новый
 try
   xlApp := GetActiveOleObject("Excel.Application");
 except
 end;

 if VarIsNull(xlApp) then
   try
     xlApp := CreateOleObject("Excel.Application");
   except
   end;
 end;
 if VarIsNull(xlApp) then Exit; //No Excel ?
 ....
 
end;

destructor Form.Destroy
begin
 xlApp :=  UnAssigned;
end;


 
Digitman ©   (2005-12-09 09:22) [15]


> snake77   (08.12.05 18:13) [10]


подобные "вИсы" при выполнении обращений к Excel (да и не только к нему - как правило ко многим внешним серверам автоматизации) часто возникают из-за того, что при исполнении метода сервер обнаружил, например, ошибку, требующую интерактивное вмешательство юзера (сервер открывает модальное диалоговое окно)

в состоянии Visible = False юзер, разумеется, этого окна не видит, поэтому окно остается открытым, но вызванный метод при этом ждет его закрытия до бесконечности

убедиться в правильности такого предположения можно просмотрев список окон, принадлежащих серверу, сразу после обнаружения зависания вызванного метода ... например, средствами Spy++



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.013 c
1-1133287582
dRake
2005-11-29 21:06
2005.12.25
Как узнать размер выделенной памяти?


14-1133431363
Post
2005-12-01 13:02
2005.12.25
Книга


1-1133426979
general
2005-12-01 11:49
2005.12.25
Ограничение на длину элемента списка в TMemo


14-1133459980
Aleksandrrr
2005-12-01 20:59
2005.12.25
загрузочный диск


10-1109069193
Tarik
2005-02-22 13:46
2005.12.25
Ole





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский