Для начала необходимо использовать следующие модули:
uses Variants, Registry, ComObj, Excel2000, ActiveX; |
|
Теперь простенькая функция определения установлен ли соответствующий объект в системе или нет. С её помощью можно искать Excel, Word и т.д...Для начала необходимо использовать следующие модули:
functionIsOLEObjectInstalled(Name:string):boolean; var ClassID:TCLSID; Rez:HRESULT; begin // Ищем CLSID OLE-объекта Rez:=CLSIDFromProgID(PWideChar(WideString(Name)),ClassID); if Rez=S_OKthen // Объект найден Result:=true else Result:=false; end; | | Например: IsOLEObjectInstalled('Excel.Application.8') |
| Так мы можем определить установлены ли объекты соответствующей версии Excel или нет.
Теперь попробуем запустить Excel. Определим переменные:
var cls_ExcelObject: string; WorkSheet: Variant; Excel: Variant; RegData: TRegistry; | |
Для того, что бы избавится от локальных названий класса для каждой верcии Office Excel необходимо выбрать ветку реестра с текущей весией, и если эта ветка существует сменить название.
begin // Это для того, чтобы не применять локальные // для каждой версии // названия "Excel.Application.8", "Excel.Application.9". // Ко всему прочему приведенный пример // не работает с Excel95. cls_ExcelObject := 'Excel.Application'; RegData := TRegistry.Create; RegData.RootKey := HKEY_CLASSES_ROOT; try if RegData.OpenKey('\Excel.Application\CurVer', False) then begin cls_ExcelObject := regData.ReadString(''); RegData.CloseKey; end finally regData.Free; end; | | Определим установлен Excel на данный компьютер или нет.
if not IsOLEObjectInstalled(cls_ExcelObject) then begin ShowMessage('Excel не установлен.'); exit; end;
// Вот теперь откроем Excel Excel := CreateOleObject(cls_ExcelObject);
|
Вот теперь самые интересные параметры работы с Excel. Мы отключает все события, интерактивную реакцию, в том числе и перерисовку, отображение в строке состояния, отображение границ листа и пересчет формул (если конечно не нужно пересчитывать формулы автоматически. А еще делаем процесс работы приложения невидимым.
// Отключаем реакцию Excel на события, // чтобы ускорить обработку информации информации
Excel.Application.ScreenUpdating := False
Excel.Application.Calculation := xlCalculationManual;
Excel.Application.EnableEvents := false; Excel.Application.Interactive := False; Excel.Application.DisplayAlerts := False; Excel.ActiveSheet.DisplayPageBreaks := False;
Excel.Application.DisplayStatusBar := False;
Excel.Visible := false;
| |
А теперь создадим таблицу или откроем указанный файл:
// Создадим новую таблицу Excel.Workbooks.Add; // -------- или --------- // Откроем существующую таблицу Excel.Workbooks.Open('FileName.xls'); | |
Получим дополнительную информацию. Количество листов в книге, получим имена всех листов.
UsedRange - очень интересное свойство. Через него можно узнать физическое количество заполненных ячеек первую строку заполненного диапазона. Очень полезно для парсинга таблиц прайсов.
// Количество значащих строк Rows := WorkSheet.UsedRange.Rows.Count; // Количество значащих колонок Columns := WorkSheet.UsedRange.Columns.Count; // Первая строка диапазона First := WorkSheet.UsedRange.Row;
| |
В начале работы можно еще узнать, количество листов в книге, список названий листов. Дальше показан пример работы с определенным листом. Обращаться к книге или листу можно по номеру, а можно указывать название.
// Количество листов в таблице SheetsCount := Excel.Sheets.Count; // Получим имена всех листов в первой открытой книге for i := 1 to SheetsCount do begin WorkSheetsNames.Items.Add(Excel.Workbooks[1].WorkSheets[i].Name); end;
// Выберем первый лист первой книги WorkSheet := Excel.Workbooks[1].WorkSheets[1]; Rows := WorkSheet.UsedRange.Rows.Count; // Количество значащих строк Columns := WorkSheet.UsedRange.Columns.Count; // Количество значащих колонок // Первая строка диапазона FirstString := WorkSheet.UsedRange.Row; | | Дальше уже можно работать с таблицей. Обработка и парсинг Excel книги мы рассмотрим в следующей статье. Но перед завершением программы не забудем вернуть свойства Excel в исходное состояние. В примере сохраняю в другой файл и закрываю Excel без запроса на сохранение. Т.е. если были открыты другие файлы и в них были изменения не будет выдано запроса на сохранение измененных файлов. Excel.Application.EnableEvents := true; Excel.Application.Interactive := true; Excel.Application.DisplayAlerts := true; Excel.ActiveWorkbook.SaveCopyAs('FileName.xls'); Excel.ActiveWorkbook.Close(0); // xlDontSaveChanges Excel.Quit; Excel := Unassigned; | | Дополнительные ссылки: Особенности работы с «Русским» Excel'ем
Tech Daily - Щоденні новини технологій
|