Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 14.08.2003
Откуда: Питер
Значится так: имеется цель сохранить содержимое таблицы (пусть будет StringGrid но я пользуюсь компонентом GridView) в файл Excell. Ниже представлен исходник процедуры, которая переносит ячейки таблици в таблицу Excell.
Код:
procedure GV_to_Excel;
var
    BeginCol, BeginRow, i, j : integer;
    RowCount, ColCount : integer;
    ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData  : Variant;
begin
BeginCol := 1;
BeginRow := 1;
RowCount := Form1.GridView2.RowCount;
ColCount := Form1.GridView2.Columns.Count;

ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Application.EnableEvents := false;
Workbook := ExcelApp.WorkBooks.Add;
ArrayData := VarArrayCreate([1, RowCount+1, 1, ColCount], varVariant);

for i:=1 to ColCount do
    ArrayData[1,i]:=Form1.GridView2.Columns[i-1].Header.Caption; // Копирование названий колонок

for I := 2 to RowCount+1 do
    for J := 1 to ColCount do
        ArrayData[i,j]:= Form1.GridView2.Cell[j-1,i-2].AsString; // Копирование ячеек

Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow  + RowCount, BeginCol + ColCount-1];

Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
Range.Value := ArrayData;
ExcelApp.Visible := true;
end;


Так вот все же имеется пара вопросов:
1. Как "чисто сохранить файл Excell"? Дело в том, что если я пишу в конце процедуры
Код:
ExcelApp.Save('Test_Excell.eee');
ExcelApp.Quit;

то появляестся диалоговое окно о сохранении проекта. А как мне от него избавится т.к. моей сохраненке хочу присвоить другое расщирение (в данном случае 'eee')?
2. Как управлять размерами колонок в созданном файле?

_________________
Лучшая зашита - это нападение.



Партнер
 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
Halfback писал(а):
Значится так: имеется цель сохранить содержимое таблицы (пусть будет StringGrid но я пользуюсь компонентом GridView) в файл Excell.
...
А как мне от него избавится т.к. моей сохраненке хочу присвоить другое расщирение (в данном случае 'eee')?
2. Как управлять размерами колонок в созданном файле?


Есть такая хорошая вещь в Excek - макрос. Береш перед выполнением любой нужной тебе операции идеш в Сервис-Макрос-Начать запись. После останавливаеш запись макроса, и в том же меню выбираеш Макрос-Изменить.
И все - смотриш, как сам Excel делает ту или иную операцию.
Например для сохранения файлы вот такой макрос -
Код:
ActiveWorkbook.SaveAs Filename:="C:\Файл.eee", FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
.
Переписываеш в Delphi, примерно должно так:
Код:
MsExcel.Application.Workbooks.SaveAs(
   FileName:='C:\Файл.eee',
   FileFormat:=xlNormal,
   Password:='',
   WriteResPassword:='',
   ReadOnlyRecommended:=False,
   CreateBackup:=False);

ну а как дальше - разберешся


 

Member
Статус: Не в сети
Регистрация: 14.08.2003
Откуда: Питер
Ну в моем случае это наверно будет так:
Код:
ExcelApp.SaveAs('Test.xls',xlNormal,' ',' ',False,False);

Причем для того, чтобы компилятор поял свойство xlNormal надо в uses указать на ExcelXP (кинуть на форму компонет ExcellApplication - а то без него НИКАК).
Так вот теперь при попытке сохранить файл пишется ошибка типа того, что метод SaveAs не поддерживается 'by automation object' .
Какие будут предложения?

_________________
Лучшая зашита - это нападение.


 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
Halfback писал(а):
Ну в моем случае это наверно будет так:
Код:
ExcelApp.SaveAs('Test.xls',xlNormal,' ',' ',False,False);

Причем для того, чтобы компилятор поял свойство xlNormal надо в uses указать на ExcelXP (кинуть на форму компонет ExcellApplication - а то без него НИКАК).
Так вот теперь при попытке сохранить файл пишется ошибка типа того, что метод SaveAs не поддерживается 'by automation object' .
Какие будут предложения?


Ты неправильно понял - метод SaveAs надо запускать не для ExcelApp, я для книги т.е. для твоего случая
Код:
ExcelApp.Application.Workbooks[1].SaveAs(...)


P.S. Попозже проверю - напишу как точно. И кстати какой Delphi ты юзаеш. Я на 5-ой версии, и подключаю юнит Excel97.

Добавлено спустя 39 минут, 13 секунд:
Вот так точно работает - тока щас проверил (Delphi 5.0 + Office 11). Смотри пример:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
  MsExcel: Variant;
begin
  VarClear(MsExcel);
  try
    MsExcel := CreateOleObject('Excel.Application');
  except
    on E: Exception do
      begin
        ShowMessage('Невозможно запустить Microsoft Excel'+chr(13)+'Возможно программа не установлена!');
      Exit;
    end;
  end;
  MsExcel.Application.Visible:=1;
  MsExcel.Application.Workbooks.Open(
    FileName:='C:\Test.xls',
    UpdateLinks:=0
  );

  if FileExists('C:\Test_2.xls') then DeleteFile('C:\Test_2.xls');
  MsExcel.Application.Workbooks[1].SaveAs(
    FileName:='C:\Test_2.xls',
    FileFormat:=xlNormal,
    Password:='',
    WriteResPassword:='',
    ReadOnlyRecommended:=False,
    CreateBackup:=False
  );
  MsExcel.Application.Workbooks[1].Close(False);
  MsExcel.Quit;
  VarClear(MsExcel);
end;


Видиш я сам стираю файл, если он присутствует, при записи - т.к. Excel всегда запрашивает перед перезаписью чего делать.


 

Member
Статус: Не в сети
Регистрация: 14.08.2003
Откуда: Питер
Aleksoid1978
Спасибо за помощь. Всё работает!!!

Правда вот еще есть вопрпос: файл сохраняется в принципе не так уж быстро. На моей тачке(см. профиль) где-то за 1-1,5 сек. А что будет на 300 Целике с дрянным винтом и т.п.??? Это я к тому, что хочу сделать индикатор состояния сохранения - в моем случае ProgressBar. Вот только как оценить текущее и Max значение прогресса? Какие будут предложения?

_________________
Лучшая зашита - это нападение.


 

Member
Статус: Не в сети
Регистрация: 02.03.2005
Откуда: Владивосток
Halfback писал(а):
Aleksoid1978
Спасибо за помощь. Всё работает!!!

Правда вот еще есть вопрпос: файл сохраняется в принципе не так уж быстро. На моей тачке(см. профиль) где-то за 1-1,5 сек. А что будет на 300 Целике с дрянным винтом и т.п.??? Это я к тому, что хочу сделать индикатор состояния сохранения - в моем случае ProgressBar. Вот только как оценить текущее и Max значение прогресса? Какие будут предложения?


насчет ProgressBar не знаю, наверное не получится привязать его к сохранению файла, можеш для наглядности другой способ - изменять значения ProgressBar по таймеру, ну чтоб люди просто видели что процесс идет, а не стоит на месте.
Я так делал, когда обрабатывал файл Excel, но незнал скока придется обработать строк, делал так - Запукаю форму, на ней прогрессбар, изменяется по таймеру, как тока процесс закончен прячу форму и все. Но правда ProgressBar который в Delphi, может тока с лева на право, а тебе желательно в обе стороны, т.е. дошел до конца и пошел занова в другую сторону. У меня такой компонент есть, давай мыло скину с примером как его юзать.


 

Member
Статус: Не в сети
Регистрация: 14.08.2003
Откуда: Питер
Aleksoid1978 писал(а):
можеш для наглядности другой способ - изменять значения ProgressBar по таймеру, ну чтоб люди просто видели что процесс идет, а не стоит на месте.

Ну так любой сможет.

Aleksoid1978 писал(а):
У меня такой компонент есть, давай мыло скину с примером как его юзать.

Скинь на radist1982{собака}mail.ru
И можно с небольшим примерчиком.

_________________
Лучшая зашита - это нападение.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 7 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan