Проверить открыт ли файл excel delphi

Обновлено: 04.07.2024

Александр Шабля
дата публикации 26-05-2006 03:55

  • Как добавить новую книгу?
  • Как задать количество листов в новой книге?
  • Как открыть книгу, имеющуюся на диске?
  • Как сохранить книгу?
  • Как закрыть книгу без вопросов о сохранении? Как закрыть все книги?
  • Как узнать имена всех открытых книг?
  • Как найти определенную открытую книгу?
  • Как переименовать книгу?
  • Как спрятать книгу?
  • Как открыть текстовый файл в Excel'е?
  • Как узнать имена всех листов в книге и их количество?
  • Как получить ссылку на активный лист в активной книге?
  • Как добавить новый лист в книгу? Как удалить лист?
  • Нужно ли делать лист активным, чтоб записать в него данные?
  • Как задать имя листу в книге?
  • Как выделить один или несколько листов в книге?
  • Как скопировать/переместить лист в одной книге? В другую книгу?
  • Как задать/убрать область печати? Как вызвать PrintPreview? Как напечатать лист?
  • Как установить параметры печати: отступы на листе, ориентацию листа и др.?
  • Как установить свои разрывы страниц (HPageBreaks) в области печати? Как узнать номер строки HpagePreak?
  • Как сделать так, чтобы на каждой странице повторялись заголовки колонок таблицы?
  • Как спрятать рабочий лист?
  • Как установить пароль на существующий лист/книгу?
  • Как создать макрос из Delphi? Как выполнить макрос, имеющийся в книге?
  • Будет ли работать макрос при выставленной "Очень высокая безопасность макросов" в Excel'е пользователя?
  • Почему не работает макрос, записанный в книге?

Как добавить новую книгу?

Добавить новую пустую книгу:

В первом параметре метода Add можно указать стандартный тип шаблона Excel. Если же в нем указать имя (с полным путем) подготовленного файла (шаблоном может быть и "обычный" файл XLS, а не только файл XLT), то можно открыть книгу на диске как шаблон.

Откроет файл "MyTemplate1.xls", т.е. точно как обычный шаблон "Книга1.xls", но свой со своим форматированием, что позволит ускорить процесс экспорта данных в Excel, т.к. не придется форматировать ячейки и вызывать другие настройки листа.

Как задать количество листов в новой книге?

Задать количество листов в новой книге можно перед добавлением новой книги:

Как открыть книгу, имеющуюся на диске?

Если книга находится не в папке указанной в Excel.Application.DefaultFilePath, то нужно указывать полный путь к открываемому файлу .xls, даже если файл находится в текущей папке вашего приложения т.к. Excel ничего про него не знает.

Как сохранить книгу?

Как закрыть книгу без вопросов о сохранении? Как закрыть все книги?

Как узнать имена всех открытых книг?

Узнать имена всех книг экземпляра Excel.Application можно в цикле, например, так:

Как найти определенную открытую книгу?

Точно так же как в предыдущем ответе — по имени в свойстве Name. Если вы хотите сделать найденную книгу активной, то вызовите метод Activate

Как переименовать книгу?

Переименовать книгу ни как нельзя — только сохранить под другим именем методом SaveAs (смотрите "Как сохранить книгу").

Как спрятать книгу?

Как открыть текстовый файл в Excel'е?

Практически, так же как и обычную книгу, только внимательно указав дополнительные параметры в методе OpenText.

Как узнать имена всех листов в книге и их количество?

Узнать количество листов в книге можно в цикле по коллекции Workbook.Sheets. Количество листов — свойство Sheets.Count. Имя листа — свойство Worksheet.Name.

Как получить ссылку на активный лист в активной книге?

Обращаеясь к Excel.Application.ActiveSheet или WorkBook.ActiveSheet, вы получите ссылку на интерфейс IDispatch. Это происходит из-за того, что коллекция Excel.Application.Sheets может содержать объекты WorkSheet, Chart, Excel4MacroSheet (для поддержки Excel 4).

Определить тип листа можно, проверив свойство Worksheet.Type:

Как добавить новый лист в книгу? Как удалить лист?

При добавлении можно указать тип нового листа (WorkSheet, Chart, Excel4MacroSheet) и текущее положение. Добавленный лист будет активизирован автоматически (на него будет указывать свойство ActiveSheet)

Нужно ли делать лист активным, чтоб записать в него данные?

Не нужно — переключение (активация) листов только замедлит экспорт данных. Получите ссылку на любой лист в книге (активной или нет) и работайте c ней, как с активной. Активизировать лист нужно только в случае необходимости, например, при вставке из буфера обмена, предварительном просмотре и др.

Как задать имя листу в книге?

Как выделить один или несколько листов в книге?

Как скопировать/переместить лист в одной книге? В другую книгу?

Как задать/убрать область печати? Как вызвать PrintPreview? Как напечатать лист?

Как установить параметры печати: отступы на листе, ориентацию листа и др.?

Установка параметров печати — довольно продолжительный процесс, поэтому советую настроить их в предварительно подготовленном шаблоне. Все параметры печати задаются в свойстве PageSetup объекта Worksheet. Но учтите, что текст в свойствах Footer или Header для Left, Right, Center суммарно не должен превышать 255 символов.

Для задания отступов в сантиметрах используйте функцию Excel.Application.CentimetersToPoints

Если вы выполните данный код, то заметьте как долго Excel настраивает все границы печати.

Как установить свои разрывы страниц (HPageBreaks) в области печати? Как узнать номер строки HpagePreak?

Для того чтобы "появились" автоматические разрывы страниц нужно перейти в режим разметки.

Также вы можете "переместить" разрыв, присвоив новое значение свойству Location объекта HPageBreak

Как сделать так, чтобы на каждой странице повторялись заголовки колонок таблицы?

Нужно задать "сквозные" строки заголовка таблицы.

Как спрятать рабочий лист?

Как установить пароль на существующий лист/книгу?

Как создать макрос из Delphi? Как выполнить макрос, имеющийся в книге?

Вам не удастся создать макрос программно, т.к. по умолчанию в Excel VBA Project отключен доступ к VBA из программ. Как включить эту возможность читайте "PRB: Programmatic Access to Office XP VBA Project Is Denied"

Пример создания макроса с параметром и вызов его из программы:

Если все же вам очень нужно добавить макрос, не зависимо от настроек доступа к VBA Project, можно воспользоваться листом макросов xlExcel4MacroSheet. Макроязык представляет собой "команды".

Будет ли работать макрос при выставленной "Очень высокая безопасность макросов" в Excel'е пользователя?

Записанные макросы в книге, открытой вашей программой всегда будут работать, не зависимо от выставленного в Excel'е "Уровня безопасности" для макросов.

Почему не работает макрос, записанный в книге?

Записанный в книге макрос может не работать по причине установленного антивируса. Например, установленный "Kaspersky Office Guard", входящий в состав "Антивирус Касперского", начисто отключает все вызовы VBA.

Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.

Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.

Я бы сделал бы так

Sub Макрос1()
Dim WB As Workbook
Dim myWorkBook As String

myWorkBook = "Бюджет.xls" 'задаём имя искомой книги
On Error Resume Next
Windows(myWorkBook).Activate
If Err.Number = 9 Then
MsgBox "Книга " & myWorkBook & " не открыта!", , ""
End If
On Error GoTo 0
End Sub

Sub Макрос2()
Dim WB As Workbook
Dim myWorkBook As String

myWorkBook = "Бюджет.xls" 'задаём имя искомой книги
For Each WB In Application.Workbooks
If WB.Name = myWorkBook Then
Windows(WB.Name).Activate
End
End If
Next
If ActiveWorkbook.Name <> myWorkBook Then MsgBox "Книга " & myWorkBook & " не открыта!", , ""
End Sub

первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel'я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.

пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).

dim EX as Excel.Application
Dim WB As Workbook
.
.
открытие книги.
. работа
закрытие и сохранение книги
EX.Quit..Закрытие Excel . Иначе книга остается открытой Public Function WorkbookIsOpen(wbname) As Boolean
'проверка открыт фаил или нет
Dim x
On Error Resume Next
Set x = Workbooks(wbname)
If Err = 0 Then WorkbookIsOpen = True
Set x = Nothing
End Function

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

может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё

Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью. Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Очень хорошие статьи. Разобрался во всём с первого раза ))) Понравилась схема в mind42 )))
Автору остаётся сказать только спасибо!

не за что, Иван. Всегда рад помочь)

Странно. Если Excel запущен, то должна создаваться вторая копия приложения без исключений. Код в студию :)

Насчет процедуры CheckExcelRun. Если программа запускается из под Delphi и Excel не запущен, то выскакивает ошибка: Операция GetActiveOleObject недоступна. Если програма запускается не из под Delphi то все в порядке. Наверное эту проблему имел ввиду Алекс. Как решение можно при отладке программы когда возникает исключение нажимать F9.

По сабжу пока не работал, но скорее всего либо перменная FileName уже объявлена, либо тип TFileName из модуля SysUtils, где-то переопределен.

Помогите Вопрос! Я использую шаблоны в своей программе! Можно ли из Дельфи изменть путь Save as. Что бы при слхранений пользавателем путь сохранения был изменен? Спасибо

А можно ли проверить, что не просто запущен Excel, а уже имеется открытая конкретная книга.
Например, хочу создать в Excel (усли уже создана, то открыть) книгу table.xls

Канает в любой версии Delphi, даже в XE.

begin
result:=CheckExcelRun;
if not result then
if AutoRun then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;

Или так :-)
begin
result:=CheckExcelRun;
if (not result) and (AutoRun) then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;

Ну так отладчик же понятно говорит, что переменная Rez повторно объявлена. Ищите где повторное объявление. Может где в глобальных переменных повторились

function isExcelInstalled:boolean;
var
ClassID: TCLSID;
begin
Result := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Понятнее и короче.

Народ , а нельзя вбить какую нить формулу в excel и чтобы результат вычисления выводился в проге в Дельфи? просто я только разбираюсь в дельфи и не знаю как это через дельфи сделать..

Это будет проще сделать в делфи, и на много облегчит программу.

MsExcel : Variant;
_Sheet : TStringList;
i, x : integer;
CCR_Ver, lLastRow, Name_Sheet, path : String;

MsExcel.Workbooks.Open[XLS_File.FileName, 0, True];

// видимость Excel
MsExcel.Visible := False;
// Закрытие открытой книги
MsExcel.WorkBooks[MsExcel.WorkBooks.Count].Close(false);
// Закрытие Excel
MsExcel.quit;
// Перераспределение памяти
inherited;
close; // Закрытие формы frm_CCR_mos
end;

Влад, здравствуйте.
Я могу с Вами как либо связаться и задать пару вопросов?

GS, спасибо большое. Не возражаете, если я, по мере наличия свободного времени, опубликую в блоге отдельным постом эти примеры (Естественно с указанием настоящего автора примеров). Думаю, что такой пост может пригодиться многим.

GS! Подскажите, где взять библиотеку XLSReadWrite?

Буду только рад :)

Ребят, вы даже представить себе не можете, насколько это полезная информация)))
Спасибо!

подскажите плиз как сделать следующее с помощью компонентов XLSReadWrite
1. открыть книгу
2. сделать поиск построчно в столбце например T при этом нужен поиск с частичным совпадением текста.
3. организовать поиск по многим книгам за 1 проход.

текущий пример как сделано сейчас прилагаю. Открытие книги и поиск в ней выполняются за 9 секунд в среднем в двух книгах за 18. хотелось бы уменьшить данное время на сколько это возможно.

заранее спасибо всем откликнувшимся.

Вопрос поднимался выше, не ответили:
Не компилит функция Save, «FileName:TFileName», пишет:
1. если не определяем параметры функции SaveWorkSheet, пишет что не хватает актуальных параметров
2. ставлю параметры, (индекс), пишет что не соответствие типов String/Integer,

Vlad огромное спасибо за статью
Просьба есть: нельзя ли перезалить модуль.. как тут уже писали он не скачивается по ссылке :(

При объявлении переменой типа OleVariant, у самой переменой нету никаких методов/классов. После нажатия точки вылазит только (*,

Хотя сами методы компилятор видит. WorkBooks, Sheet, Range, Cells и т.п.

Именно так и должно быть, т.к. мы используем раннее связывание.

кто-то может передать экземпляр сломанной ссылке

подскажите пож как сделать чтобы когда вбиваешь edit текс он выводился в excel и когда я водил опять он спускался на строчку ниже а не -заменял преждний

При написании бизнес приложений на Delphi, выполняющих какие либо расчеты, может возникнуть необходимость импорта (экспорта) данных из файлов других приложений. Одно из основных таких приложений – MS Excel. Как прочитать файлы xls в Delphi мы сейчас и рассмотрим!?

Создадим новый проект и разместим на форме три компонента:

StringGrid – находится на палитре компонентов, во вкладке Additional

stringgrid в delphi

Кнопку Button и для удобства выбора файлов, диалог открытия файлов (работа с диалогами описана здесь).

Для StringGrid, в свойствах(Properties) укажем следующее:
DefaultRowHeight – 17
FixedCols – 0
FixedRows – 0

В результате форма будет выглядеть примерно так:


На этом украшательства закончим и приступим к написанию кода.

Для работы с Excel файлами нам понадобится библиотека ComObj, входящая в стандартную поставку Delphi. Подключается она в разделе Uses. Добавьте в конце, после запятой «ComObj».


Теперь опишите процедуру Xls_Open после ключевого слова implementation:

procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
const
xlCellTypeLastCell = $0000000B;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;

begin
//создаем объект Excel
ExlApp := CreateOleObject('Excel.Application');

//делаем окно Excel невидимым
ExlApp.Visible := false;

//открываем файл XLSFile
ExlApp.Workbooks.Open(XLSFile);

//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, с которого будем осуществлять чтение
Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

//активируем последнюю ячейку на листе
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

// Возвращает номер последней строки
r := ExlApp.ActiveCell.Row;

// Возвращает номер последнего столбца
c := ExlApp.ActiveCell.Column;

//устанавливаем кол-во столбцов и строк в StringGrid
Grid.RowCount:=r;
Grid.ColCount:=c;

//считываем значение из каждой ячейки и копируем в нашу таблицу
for j:= 1 to r do
for i:= 1 to c do
Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
//если необходимо прочитать формулы то
//Grid.Cells[i-1,j-1]:= sheet.cells[j,i].formula;

//закрываем приложение Excel
ExlApp.Quit;

//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;

end;

Наша процедура Xls_Open имеет два входных параметра:

  1. XLSFile – путь к файлу Excel (xls)
  2. Grid – таблица, в которую будем осуществлять вывод данных.

В комментариях к коду я постарался все расписать, объясню немного принцип работы процедуры.

Мы создаем в памяти объект ExlApp с приложением Excel.Application. Затем указываем что этот объект будет невидим для пользователя ExlApp.Visible := false (если false заменить на true, то при открытии файла мы увидим окно Excel с открываемым файлом). Далее открывается файл ExlApp.Workbooks.Open(XLSFile). Потом создаем еще один объект Sheet, который позволяет работать с листом книги Excel: Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1]. Единица в конце указывает номер листа с которого будем читать данные (к листам можно обращаться по имени, для этого вместо 1 указываем «ИмяЛиста1»). Далее определяем кол-во строк и столбцов которые содержат данные, и используя циклы For считываем данные копируя их в StringGrid. Впринципе и все.

Для использования процедуры Xls_Open пропишем в событие Click кнопки Button1 следующее:

If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName, StringGrid1);

Основные недостатки этого способа: медленное чтение данных (хотя для небольших файлов вполне сгодится) и необходимость установленной версии Excel на компьютере пользователя.

Полный листинг программы:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation

procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
const
xlCellTypeLastCell = $0000000B;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;

begin
//создаем объект Excel
ExlApp := CreateOleObject('Excel.Application');

//делаем окно Excel невидимым
ExlApp.Visible := false;

//открываем файл XLSFile
ExlApp.Workbooks.Open(XLSFile);

//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, с которого будем осуществлять чтение
Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

//активируем последнюю ячейку на листе
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

// Возвращает номер последней строки
r := ExlApp.ActiveCell.Row;

// Возвращает номер последнего столбца
c := ExlApp.ActiveCell.Column;

//устанавливаем кол-во столбцов и строк в StringGrid
Grid.RowCount:=r;
Grid.ColCount:=c;

//считываем значение из каждой ячейки и копируем в нашу таблицу
for j:= 1 to r do
for i:= 1 to c do
Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
//если необходимо прочитать формулы то
//Grid.Cells[i-1,j-1]:= sheet.cells[j,i].formula;

//закрываем приложение Excel
ExlApp.Quit;

//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName, StringGrid1);
end;

end.

Обновленный пример. Добавлена функция отбора строк по критерию. Так же добавлен обработчик делающий отображение шрифта "шапки" в StringGrid жирным. Все дополнения постарался по максимуму раскомментить

Читайте также: