Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Не удается удалить лист из книги Excel


Автор: Mr_Devil 5.1.2010, 17:34
Никак не могу удалить лишние листы из книги. Везде пишут, что так должно работать, но оно не работает smile
Если включить видимость приложения Excel, то оно спрашивает действительно ли я хочу удалить лист (хотя предупреждения отключены). Если ответить "Да", лист удаляется. А если видимость Excel не включать,то новый лист в книге остается.
Excel 2003

Делаю так:
Код

function ProcessPrice(Price_File_Name: string): boolean;
var
 EA1: TExcelApplication;
 EWB1: TExcelWorkbook;
 EWS1: TExcelWorksheet;
 i,j,k,L: integer;    // счетчики
begin
 EWS1:=TExcelWorksheet.Create(nil);
 EWS1.ConnectKind:=ckAttachToInterface;
 EWB1:=TExcelWorkbook.Create(nil);
 EWB1.ConnectKind:=ckAttachToInterface;
 L:=LOCALE_USER_DEFAULT;
 EA1:=TExcelApplication.Create(nil);
 EA1.ConnectKind:=ckNewInstance;
 EA1.AutoQuit:=True;
 EA1.DisplayAlerts[L]:=False;  // отключаем предупреждения
 EA1.Visible[L]:=False;
 EA1.Connect;
 try
   EWB1.ConnectTo(EA1.Workbooks.Open(Price_File_Name,// Filename: WideString;
     2, // UpdateLinks: OleVariant; 2 - never update
     False, // ReadOnly: OleVariant;
     EmptyParam, // Format: OleVariant;
     EmptyParam, // Password: OleVariant;
     EmptyParam, // WriteResPassword: OleVariant;
     EmptyParam, // IgnoreReadOnlyRecommended: OleVariant;
     EmptyParam, // Origin: OleVariant;
     EmptyParam, // Delimiter: OleVariant;
     EmptyParam, // Editable: OleVariant;
     EmptyParam, // Notify: OleVariant;
     EmptyParam, // Converter: OleVariant;
     False, // AddToMru: OleVariant;
     EmptyParam, // Local: OleVariant;
     EmptyParam, // CorruptLoad: OleVariant;
     L));
 except
...
 end;
 EA1.ActiveWorkbook.Sheets.Add(EmptyParam,EmptyParam,1,EmptyParam,L);  // новый лист добавляется, но не удаляется.
//  (EA1.ActiveWorkbook.Sheets[1] as _Worksheet).Name:='Listeg3';
 (EA1.ActiveWorkbook.Sheets[1] as _Worksheet).Delete(L);  // ВОТ ЗДЕСЬ НИЧЕГО НЕ ПРОИСХОДИТ
//  (EA1.ActiveWorkbook.Sheets[4] as _Worksheet).Delete(L);
// закрываем иксель
 EA1.ActiveWorkbook.Close(xlSaveChanges,EmptyParam,EmptyParam,L);
 EA1.Application.Quit;
 EWS1.Free;
 EWB1.Free;
 EA1.Free;
 Result:=True;
end;

Автор: Данкинг 5.1.2010, 17:48
А почто код у тебя такой длинный и страшный? smile 
Код

procedure TForm1.FormCreate(Sender: TObject);
var ex:variant;
begin
ex:=createoleobject('excel.application');
ex.visible:=false;
ex.DisplayAlerts:=False;
ex.Workbooks.open('I:\Musor\книга1.xls');
ex.ActiveWorkbook.Sheets[2].Delete;
Ex.ActiveWorkbook.SaveAs('I:\Musor\книга1.xls');
ex.application.quit;
ex:=unassigned;
end;

Автор: Mr_Devil 5.1.2010, 18:34
Цитата(Данкинг @ 5.1.2010,  17:48)
А почто код у тебя такой длинный и страшный? smile 

Делал как здесь написано: http://forum.vingrad.ru/forum/topic-84634.html  smile 

Автор: Данкинг 5.1.2010, 18:57
Mr_Devil, делай, как здесь написано. smile Я с WordApplication (как сервером) вообще никогда не работал.

Автор: Mr_Devil 5.1.2010, 19:11
Делаю так:
Код

function ProcessElcoPrice(Price_File_Name: string): boolean;
var
  E:variant;
 begin
  E:=CreateOleObject('Excel.Application'); // создание OLE-объекта
  E.DisplayAlerts:=False;  // отключение сообщений
  E.Visible:=False;
  E.Workbooks.open(Price_File_Name);
  E.ActiveWorkbook.Sheets[1].Delete;
  E.ActiveWorkbook.SaveAs(Price_File_Name);
  E.Application.Quit;
  E:=Unassigned;
end;

Компилятор косо смотрит на "Delete" (Undeclared identifier 'Delete'), но код переваривает. В итоге лист как был, так и остался. + выдается запрос на перезапись файла xls.

Добавлено через 1 минуту и 2 секунды
Цитата(Данкинг @ 5.1.2010,  18:57)
Mr_Devil, делай, как здесь написано. smile Я с WordApplication (как сервером) вообще никогда не работал.

Там и про Excel написано.

Автор: Данкинг 5.1.2010, 19:54
Не знаю тогда: у меня этот код рабочий. smile Писал его в D7, Excel 2003.

Цитата(Mr_Devil @  5.1.2010,  19:11 Найти цитируемый пост)
Там и про Excel написано. 

Ну да, я его тоже имел в виду. smile 


Автор: Mr_Devil 5.1.2010, 20:01
Сделал новый проект.
Код
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, StdCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  E:Variant;
begin
  E:=CreateOleObject('Excel.Application'); // создание OLE-объекта
  E.DisplayAlerts:=False;  // отключение сообщений
  E.Visible:=False;
  E.Workbooks.open('D:\StockStatus.xls');
  E.ActiveWorkbook.Sheets[1].Delete;
  E.ActiveWorkbook.SaveAs('D:\StockStatus.xls');
  E.Application.Quit;
  E:=Unassigned;
end;

end.

результат тот же :(
Excel2003, BDS 2006  smile 

Автор: Данкинг 5.1.2010, 20:36
Цитата(Mr_Devil @  5.1.2010,  20:01 Найти цитируемый пост)
BDS 2006 

У меня студия установлена, но без Дельфи, только Билдер и С#, поэтому в ней проверить не могу. smile Вот проект в D7, попробуй его запустить (только путь к XLS изменить не забудь). Для верности прикладываю и файл XLS, из которого у меня всё отлично удаляется. smile 

Автор: Mr_Devil 5.1.2010, 20:46
Млин :( поставил D7... все тоже самое.

Добавлено через 1 минуту и 24 секунды
щас попробую твой файл

Автор: Mr_Devil 5.1.2010, 21:04
Млин  smile 
Дело оказалось в файле xls. Он какой-то хитрый. Там присутствуют макросы и из него даже твой проект не может удалить лист, более того при сохранении он (Excel) спрашивает заменить ли файл. С твоим файлом (Книга1) все отлично работает (и мой проект тоже) и никаких вопросов не задает, даже после добавления в файл макроса. Попробовал сам сделать своим Excel'ем файл (и даже с макросом) все отлично работает.
Придется, видимо, копировать нужный лист в новую книгу и заменять потом старый файл.

Спасибо smile

Автор: Данкинг 5.1.2010, 21:04
Цитата(Mr_Devil @  5.1.2010,  20:46 Найти цитируемый пост)
Млин :( поставил D7... все тоже самое.

Думаю, тут какая-то проблема с офисом, а не с Дельфи.

Добавлено через 1 минуту и 1 секунду
Цитата(Mr_Devil @  5.1.2010,  21:04 Найти цитируемый пост)
Дело оказалось в файле xls. 

Вот и я про то же. Excel - штука часто непредсказуемая. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)