Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
4-1130396689
DancerMan
2005-10-27 11:04
2005.12.25
TWebBrowser запретить выделение


2-1133802468
silver_dragon
2005-12-05 20:07
2005.12.25
проблемы с компилированием(???)


14-1133685910
Fraksof
2005-12-04 11:45
2005.12.25
Помогите перевести текст за небольшое вознагрождение, плиз!


1-1133032336
heady
2005-11-26 22:12
2005.12.25
function SetLink


2-1134054400
аматор
2005-12-08 18:06
2005.12.25
Работа с файлом