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


Автор: Demo 13.3.2007, 12:38
Добрый день! Помогите решить проблему.
Я создаю отчет в Excele с помощью шаблона. Документ сохраняется в нужном мне файле при помощи следующего кода:
XLApp.Application.ActiveWorkBook.SaveAs(ExtractFilePath(Application.ExeName)+'Name.xls');
Мне нужно, чтобы каждый раз добавлялся лист в файл, а сейчас происходит замена одного листа другим.
Подскажите пожалуйста, как должен выглядеть код. 
Была попытка использовать XLApp.Worksheets.Add, но каждый раз добавлялся пустой лист, а лист с информацией изменялся...

Автор: SergeBS 13.3.2007, 14:36
Demo, 
DelphiWorld:
Код

procedure AddWorkSheet(WorkBookName, WorkSheetName: Ansistring);
var
  k, j: integer;
begin
  if VarIsEmpty(Excel) = false then
  begin
    k := WorkBookIndex(WorkBookName);
    if k <> 0 then
    begin
      Excel.DisplayAlerts := False;
      Excel.Workbooks[k].Sheets.Add;
      j := WorkSheetIndex(WorkBookName, WorkSheetName);
      if j = 0 then
        Excel.Workbooks[k].ActiveSheet.Name := WorkSheetName;
    end;
  end;
end;

Автор: Demo 14.3.2007, 10:15
Попробовала данныйкод, но компьютер ругается на индексы. Что это за индексы: WorkBookIndex, WorkSheetIndex?

Автор: SergeBS 14.3.2007, 10:58
Demo, 
На DelphiWorld сходить и все посмотреть/скачать лениво? Зря.
Код

function WorkBookIndex(WorkBookName: Ansistring): integer;
var
  i, n: integer;
begin
  //проверка на наличие книги с этим именем
  n := 0;
  if VarIsEmpty(Excel) = false then
    for i := 1 to Excel.WorkBooks.Count do
      if Excel.WorkBooks[i].FullName = WorkBookName then
      begin
        n := i;
        break;
      end;
  WorkBookIndex := n;
end;

function WorkSheetIndex(WorkBookName, WorkSheetName: Ansistring): integer;
var
  i, k, n: integer;
begin
  //проверка на наличие листа с этим именем в книге с этим именем
  n := 0;
  if VarIsEmpty(Excel) = false then
  begin
    k := WorkBookIndex(WorkBookName);
    for i := 1 to Excel.WorkBooks[k].Sheets.Count do
      if Excel.WorkBooks[k].Sheets[i].Name = WorkSheetName then
      begin
        n := i;
        break;
      end;
  end;
  WorkSheetIndex := n;
end;


Автор: Albinos_x 14.3.2007, 22:32
Цитата(Demo @  13.3.2007,  12:38 Найти цитируемый пост)
Была попытка использовать XLApp.Worksheets.Add, но каждый раз добавлялся пустой лист, а лист с информацией изменялся...

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

Автор: lotax 16.3.2007, 12:48
Попробуй так:
Код


uses
  ActiveX, ComObj;

var
  ServerIsRunning : Boolean;
  Unknown: IUnknown;
  Result: HResult;
  AppProgID: String;
  App: Variant;
begin
  // Указать программный идентификатор приложения-сервера
  AppProgID := 'Excel.Application';
  ServerIsRunning := False;
  Result := GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown);
  if (Result = MK_E_UNAVAILABLE) then
    // Создать один экземпляр сервера
    App := CreateOleObject(AppProgID)
  else
    begin
    // Соединиться с уже запущенной копией сервера
    App := GetActiveOleObject(AppProgID);
    ServerIsRunning := True;
  end;
  // показать окно приложения на экране
  App.Visible := True;
  App.Workbooks.Open(ExtractFilePath(Application.ExeName)+'Name.xls');
  App.Sheets.Add;
  //------------------------------------------------------
  //
  // Здесь выполняются другие действия
  //------------------------------------------------------
  //Сохраняем файл
  App.DisplayAlerts:=False;
  App.ActiveWorkBook.Save;
  //
  //------------------------------------------------------
  if not ServerIsRunning then App.Quit;
  App:=Unassigned;
end;


Автор: Albinos_x 16.3.2007, 22:05
lotax, Ваш ответ не имеет ничего общего с заданным вопросом !!!...

Автор: Demo 23.3.2007, 12:34
Я открываю шаблон, устанавливаю определенные свойства...
Код

 XLApp:=CreateOleObject('Excel.Application');
  XLApp.Visible:=False;
  XLApp.DisplayAlerts:=True;
  XLApp.WorkBooks.Open('D:\Папка1\Шаблон.xls');
  XLApp.Workbooks[1].WorkSheets[1].Name:=DateToStr(Date);
  Column:=XLApp.Workbooks[1].WorkSheets[DateToStr(Date)].Columns;
  Sheet:=XLApp.Workbooks[1].Sheets[DateToStr(Date)];

Затем вношу нужные мне данные
...................
...................
--После всех данных я и пытаюсь реализовать поставленную задачу.


...................
И делаю видимым документ
   XLApp.Visible:=True;

Спасибо за код! Я вот думаю, а нельзя ли это сделать как-нибудь компактнее?

Автор: Demo 25.3.2007, 17:56
Эту задачу пробую решить другим способом... Хочу добавить листы копированием... Копирование листа в новую рабочую книгу. При копировании лист всегда добавляется новый. Это мне как раз нужно.
Пишу:
XLApp.Sheets.Copy(Здесь нужно указать параметры - но вопрос: Какие)
В книге написано, что там 3 параметра, один из них - наименование книги - куда копировать, а остальные - незнаю. 
Если кто знает, подскажите, пожалуйста? Очень нужно!!!

Автор: Albinos_x 26.3.2007, 12:48
 копировать лист с указанием необходимой книги:  
Код

  ...  
  var ran : OleVariant;  
  ...  
  ran:=ExcelWorkbook1.ActiveSheet;  
  ExcelApplication1.Sheets.Copy(ran,EmptyParam,0);  
  ...  

   
 в новую книгу:  
Код
  ...  
  ExcelApplication1.Sheets.Copy(EmptyParam,EmptyParam,0);  
  ...  


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