Delphi excel выделение ячейки

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодняшняя статья блога  будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.

Про работу с этими объектами я уже вкратце говорил, а сегодня хотел бы поделиться с вами более полной информацией. Итак, начнем с самого простого.

1. Что такое Range и как его получить?

Согласно официальному определению Microsoft, Range :

представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.

Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа.  Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:

var  MyRange: OLEVariat;
begin
{объект Range, состоящий из одной ячейки}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1'];
{объект Range в виде строки из четырех ячеек}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D1'];
{объект Range в виде столбца из четырех ячеек}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:A4'];
{объект Range в виде таблицы 4х4 ячейки}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D4'];
end;

Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:

var  MyRange: OLEVariat;
     Cell_1, Cell2: OLEVariant;
begin
{получаем ссылку на объект Cells, соответствующей ячейке A1}
  Cell_1:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[1,1];
{получаем ссылку на объект Cells, соответствующей ячейке C5}
  Cell_2:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3];
{получаем объект Range размером 3х5}
  MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range[Cell_1, Cell_2]
end;

Какой из способов Вы будете использовать в Delphi — не важно, так как результат будет один и тот же. Получив в свое распоряжение диапазон Вы можете использовать его далее, например, для того, чтобы установить вид его границ.

2. Свойства объекта Excel Range.

Рассмотрим основные свойства объекта Range и их применение работе в Excel в Delphi.

Вначале перечислю свойства, которые будут далее рассмотрены в статье.

Свойство Описание
Formula Возвращает или помещает в диапазон формулу
Value Возвращает или устанавливает значение для диапазона
Text возвращает текст из ячейки
Column Возвращает номер первого столбца в первой области, в указанном диапазоне
Columns возвращает объект Range, представляющий собой один столбец из всего диапазона
Comment Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.
Address Возвращает реальный адрес диапазона Range

Formula

Возвращает или помещает в диапазон формулу.

Value

Возвращает или устанавливает значение для диапазона.Свойство Value замечательно тем, что с помощью него можно записать в ячейки абсолютно любые данные, особо не задумываясь о формате данных. Например, запишем в ячейки диапазона строку, число типа integer и число типа single: чтобы каждый раз не повторяться в листингах и не писать одни и те же элементы по 100 раз, будем считать, что в переменной Sheet уже содержится ссылка на активный лист (ActiveWorkSheet) активной книги (ActiveWorkBook) Excel (MyExcel)

var i:integer;
    s: single;
    str: string;
    Sheet: OLEVariant;
begin
  i:=100;
  s:=2.12;
  str:='Hello World!';
  Sheet.Range['A1'].Value:=i;
  Sheet.Range['A2'].Value:=s;
  Sheet.Range['A3'].Value:=str;
end;

Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.

Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:

Sheet.Range['A1:A10'].Value:=str;

и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:

var  val: Variant;
     Sheet: OLEVariant;
     i:integer;
begin
  Val:=Sheet.Range['A1:A3'].Value;
  for i:=1 to 3 do
    ShowMessage(val[i,1]);
end;

Если Вам необходимо читать/писать большое количество данных, то наиболее быстрым способом работы с данными будет использование вариантных массивов. О том, как использовать вариантные массивы при работе с Excel в Delphi рассказывается в статье «Быстрая обработка данных Excel в Delphi.«

Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.

Text

Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.

Column

Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.

Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:

Excel_RangeТо есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.

После того, как диапазоны будут созданы — посмотрим, что вернет нам свойство Column для каждого из диапазонов.

Листинг процедуры создания двух несвязных диапазонов Range следующий:

var Range1,Range2,BigRange: OLEVariant;
begin
{создаем первый диапазон}
  Range1:=Sheet.Range['A1:C4'];
  Range2:=Sheet.Range['E6:H9'];
  BigRange:=Sheet.Range[Range1,Range2];
  ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
{создаем второй диапазон}
  Range1:=Sheet.Range['B7:C13'];
  Range2:=Sheet.Range['E1:H3'];
  BigRange:=Sheet.Range[Range1,Range2];
  ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
end;

Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.

Columns

В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.

Посмотрим как, например, используя это свойство можно изменять столбцы во всем диапазоне Range.

Для демонстрации воспользуемся предыдущим примером, изменим только окончание:

...
BigRange:=Sheet.Range[Range1,Range2];
for i:=1 to BigRange.Columns.Count do
  BigRange.Columns[i].Value:='Столбец №'+IntToStr(i);

Excel_Range_ColumnsВ итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.

Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.

Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:

Range2:=Sheet.Range['E6'];
{записали комментарий}
Range2.AddComment('Это комментарий ячейки области');
{прочитали}
ShowMessage(Range2.Comment.Text);

Address

Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:

Range2:=Sheet.Range['A1:E6'];
Свойство Address будет содержать строку "$A$1:$E$6"

Это свойство удобно использовать, когда Вы оперируете в программе только числовыми значениями (номерами столбцов и строк) и появляется необходимость показать пользователю адреса ячеек из диапазона.

Помимо перечисленных выше свойств к объекту Range применимы все свойства, описанный в статье об изменении внешнего вида ячеек Excel, т.е. borders, color и пр.

3. Методы объекта Excel Range.

Теперь рассмотрим несколько полезных методов, которые могут Вам пригодиться при работе с Excel в Delphi.

Метод Описание
CheckSpelling Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены
PrintPreview Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек
AutoFill Автозаполнение диапазона ячеек на основе данных из другого диапазона
AutoFit Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.
Clear Удаляет все данные из диапазона
ClearComments Удаляет все комментарии в диапазоне Range
ClearContents Удаляет все формулы из диапазона Range
ClearFormats Очищает форматы в диапазоне Range
ClearNotes Очищает все заметки в диапазоне Range
Copy Копирует содержимое диапазона Range в буфер обмена или в другой диапазон
PasteSpecial Специальная вставка диапазона
Cut Вырезает данные и при необходимости вставляет их в новый диапазон
Merge Объединение ячеек диапазона

CheckSpelling

Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены. Замечательной особенностью этого метода является то, что окно замены появляется даже при скрытом окне Excel, то есть, когда свойство Visible у объекта Excel равно false.

Вызывается метод без каких-либо дополнительных параметров:

Range['A1:H6'].CheckSpelling

PrintPreview

Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек. Также как и предыдущий метод PrintPreview не имеет дополнительных параметров. Однако при попытке вызвать метод при скрытом окне Excel в лучшем случае возникнет исключительная ситуация, в худшем — зависание Вашего приложения. Так что перед вызовом:

не забывайте включить свойство Visible у Excel:

AutoFill

Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.

Вызов метода:

Range.AutoFill(Destination, Type)
Параметр Тип Описание
Destination Variant представляет собой объект Range уже заполненных ячеек. Эти ячейки должны входить в автозаполняемый диапазон
Type Integer тип автозаполнения (возможные значения см. ниже)

Рассмотрим применение метода на примере.

Sheet.Range['A1'].Value:=1;
Sheet.Range['A2'].Value:=2;
Source:=Sheet.Range['A1:A6'];
Range2:=Sheet.Range['A1:E6'];
Source.AutoFill(Range2, xlFillDefault)

В результате лист Excel примет следующий вид:

Excel_Range_AutoFillКак видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.

При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.

При использовании метода мы использовали одну из констант в параметре Type xlFillDefault = 0. Используя её мы скопировали данные один-к-одному. Дополнительно Вы можете использовать следующие константы при автозаполнении:

Имя Значение Описание
xlFillDefault 0 скопировать данные один-к-одному
xlFillDays 5 копирование дней недели с расширением, т.е., если Вы запишете в ячейку слово «Понедельник» и попробуете провести автозаполнение ещё на 2 строки, то во второй и третьей строке появятся «Вторник» и «Среда»
xlFillCopy 1 копирует все данные и форматы, повторяя при необходимости
xlFillFormats 3 копирует только форматы источника
xlFillMonths 7 копирует названия месяцев. Работает аналогично xlFillDays
xlFillSeries 2 копирует данные с расширением, например 1,2,3 будут при копировании расширены до 4,5,6 и т.д. Также копирует форматы данных
xlFillValues 4 копирует только значения
xlFillWeekdays 6 копирует дни рабочей недели, работает аналогично xlFillDays, но только до пятницы
xlFillYears 8 копирует года. Работает аналогично xlFillDays
xlGrowthTrend 10 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее, но умноженное на некоторую величину. Например 1,2 раскопируются в 4, 8, 16 и т.д. Формат данных также копируется
xlLinearTrend 9 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее + некоторая величина. Например 1,2 раскопируются в 3, 4, 5 и т.д. Формат данных также копируется

AutoFit

Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.

Пример вызова:

Sheet.Range['A1'].Value:=1234567891012;
Sheet.Range['A2'].Value:=23456789;
Source:=Sheet.Range['A1:A2'];
Source.Columns.AutoFit

Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.

Методы очистки данных диапазона Range

Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.

1. Clear

Удаляет все данные из диапазона.

Пример вызова:

2. ClearComments

Удаляет все комментарии в диапазоне Range.

Пример вызова:

3. ClearContents

Удаляет все формулы из диапазона Range

Пример вызова:

4. ClearFormats

Очищает форматы в диапазоне Range

Пример вызова:

5. ClearNotes

Очищает все заметки в диапазоне Range

Пример вызова:

Методы работы с буфером обмена Excel

1. Copy

Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.

Попробуем реализовать работу метода следующим образом: заполним столбец А некоторыми значениями, а затем скопируем его сначала в буфер, а потом в столбец Е:

Sheet.Range['A1'].Value:=1;
Sheet.Range['A2'].Value:=2;
Sheet.Range['A3'].Value:=3;
Sheet.Range['A4'].Value:=4;
Sheet.Range['A5'].Value:=5;
Sheet.Range['A6'].Value:=6;
Source:=Sheet.Range['A1:A6'];
Source.Copy; //скопировали в буфер
Range2:=Sheet.Range['E1:E6'];
Source.Copy(Range2)//скопировали в новый диапазон

А для того, чтобы вставить данные из буфера обмена существует ещё один метод

2. PasteSpecial

Вызов метода:

MyRange.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
Параметр Тип Описание
Paste Integer определяет какая часть данных диапазона будет вставлена (возможные значения см. ниже)
Operation Integer операция, которая будет выполнена при вставке данных (возможные значения см. ниже)
SkipBlanks boolean True, для того чтобы пустые ячейки из буфера обмена не вставлялись в диапазон назначения. Значение по умолчанию False
Transpose boolean транспонирование столбцов и строк после вставки. По умолчанию устанавливается значение False

При определении параметра Paste следует использовать следующие константы:

Имя Значение Описание
xlPasteAll -4104 Вставка всех данных
xlPasteAllExceptBorders 7 Вставка всего содержимого за исключением вида границ диапазона
xlPasteAllUsingSourceTheme 13 Вставка всего содержимого, используя тему оформления источника
xlPasteColumnWidths 8 Копирует ширину столбцов
xlPasteComments -4144 Вставка комментариев
xlPasteFormats -4122 Вставка форматов данных
xlPasteFormulas -4123 Вставка формул
xlPasteFormulasAndNumberFormats 11 Вставка формул и чисел
xlPasteValidation 6 Вставка проверок
xlPasteValues -4163 Вставка значений
xlPasteValuesAndNumberFormats 12 Вставка значений и чисел

При использовании параметра Operation следует использовать следующие константы:

Имя Значение Описание
xlPasteSpecialOperationAdd 2 К скопированным данным будут добавлены значения из целевых ячеек
xlPasteSpecialOperationDivide 5 Скопированные данные будут разделены на значения в целевых ячейках
xlPasteSpecialOperationMultiply 4 Скопированные данные будут умножены на значения в целевых ячейках
xlPasteSpecialOperationNone -4142 При вставке значений никакие операции не будут применяться
xlPasteSpecialOperationSubtract 3 Из скопированных данных будут вычитаться значения целевых ячеек

Теперь рассмотрим применение метода на примере. В качестве исходных данных возьмем данные из предыдущего примера, но для вставки используем метод PasteSpecial:

...
Range2.PasteSpecial(Operation:=xlPasteSpecialOperationAdd);

После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.

3. Cut

Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.

Merge

Объединение ячеек диапазона.

Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:

Параметр Тип Описание
Across boolean True, чтобы объединить ячейки в каждой строке указанного диапазона как отдельные объекты. Значение по умолчанию False

Например, объединим ячейки в диапазоне Range2 из предыдущего примера:

После выполнения этой операции в диапазоне останется только верхнее значение, т.е. 1.

Дополнительные методы автозаполнения ячеек диапазона Range

В отдельную группу методов можно выделить 4 метода автозаполнения ячеек диапазона:

  1. FillDown
  2. FillUp
  3. FillRight
  4. FillLeft

Принцип действия этих методов один и тот же за исключением направления автозаполнения.

Например, давайте запишем в ячейку A1 какое-нибудь значение и воспользуемся методами FillDown и FillRight:

Sheet.Range['A1'].Value:=1;
Sheet.Range['A1:A6'].FillDown;
Sheet.Range['A1:F1'].FillRight;

После этого в строк 1 и столбце A появятся числа 1. Аналогичным образом можно заполнять не только строки или столбцы, но и таблицы целиком — достаточно знать в какую сторону двигаться при автозаполнениии и применять соответствующие методы Excel для Range.

Вот в принципе краткий обзор возможностей работы с объектов Range в Excel. В целом можно отметить, что работа с этим объектом в Delphi один из самых эффективных способов организации пресылки/получения данных между Excel и Delphi, не считая работы через XML формат.

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

0
0
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Студворк — интернет-сервис помощи студентам

Тут иногда бывают вопросы о том, как можно из Delphi работать с документами Excel. Решил написать такую инструкцию, где рассказано об основных действиях.

Для работы с OLE нужно к строке Uses добавить модуль ComObj. Так же нужно объявить переменную типа Variant.

Delphi
1
2
Uses ComObj;
Var Ap : Variant;

Что бы начать работу с Экселем, нужно создать OLE объект:
Ap := CreateOleObject(‘Excel.Application’);

После этого нужно либо создать новую книгу:
Ap.Workbooks.Add;
либо открыть файл:
Ap.Workbooks.Open(<имя файла>);
Что бы открыть файл только для чтения, нужно указать:
Ap.Workbooks.Open(<имя файла>,0,True);
где True и указывает, что файл открывается только для чтения.

По умолчанию окно Excel не будет отображаться… что бы оно появилось, нужно выполнить
Ap.Visible := True;
Но это желательно делать в последний момент, т.к. когда окно видимое, то все изменения в нём происходят медленнее. Поэтому, лучше оставить его невидимым, сделать там все необходимые изменения, и только после этого сделать его видимым или закрыть. Если вы его оставите невидимым, то процесс EXCEL.EXE останется висеть в памяти, даже когда будет закрыто ваше приложение.

Что бы закрыть Excel, выполните Ap.Quit или Ap.Application.Quit. Честно говоря, я не знаю, чем они отличаются.
Что бы при закрытии не выдавался запрос на сохранение файла, можно отключить сообщения:
Ap.DisplayAlerts := False;

Что бы записать или прочитать содержимое ячейки можно использовать Ap.Range[<имя ячейки>] или Ap.Cells[<позиция по Y>,<позиция по X>]
Ap.Range[‘D1’] := ‘Ляляля’;
Ap.Cells[1,4] := ‘Ляляля’;

Эти две строки выполняют одно и тоже действие: записывают строку «Ляляля» в ячейку D1
Читать значение из ячейки таким же образом:
S := Ap.Range[‘D1’];
или
S := Ap.Cells[1,4];
Так же можно записывать значение сразу в несколько ячеек… можно перечислить через точку с запятой или указать диапазон через двоеточие:

Delphi
1
2
3
4
5
6
7
8
Ap.Range['A2;B5;D1'] := 'Ляляля'; // записывает строку в 3 ячейки: A2, B5 и D1
Ap.Range['A2:D5'] := 'Ляляля'; // записывает строку во все ячейки диапазона A2:D5
Ap.Range[Ap.Cells[2,1],Ap.Cells[5,4]] := 'Ляляля'; // Тоже самое, что и предыдущая строка
Ap.Cells := 'Ляляля'; // Изметятся все ячейки
Ap.Rows['2'] := 'Ляляля'; // Изменятся все ячейки второй строки
Ap.Rows[2] := 'Ляляля';  // Тоже самое
Ap.Columns['B'] := 'aaa';  // Изменятся все ячейки в столбце B
Ap.Columns[2] := 'aaa';  // Тоже самое

Изменение свойств текста
Всё это можно применять как к отдельным ячейкам, так и к группам ячеек, строк, столбцов и т.п. Я буду показывать примеры на Ap.Cells… но Вам никто не мешает использовать Ap.Range[‘D5’], Ap.Range[‘A2:E8’], Ap.Columns[‘B:F’] и т.п.

Delphi
1
2
3
Ap.Cells.Font.Bold := True;  // Жирный шрифт
Ap.Cells.Font.Italic := True; // Курсив
Ap.Cells.Font.Underline := True; // Подчёркивание

Изменение цвета фона ячеек:

Delphi
1
2
Ap.Rows[1].Interior.Color := rgb(192, 255, 192); // Первую строку закрашиваем в зелёный цвет, используя RGB
Ap.Cells[2,1].Interior.Color := clRed; // Ячейку A2 закрашиваем в красный цвет, используя константу clRed

Наверное, вы обращали внимание, что в новом документе появляются 3 листа (их список отображается внизу программы Excel). По умолчанию, мы работаем с активным листом (сразу после создания это первый лист). Но при желании, мы можем использовать и другие листы. Доступ к ним осуществляется с помощью Worksheets[<номер листа>]. Обратите внимание, что нумеруются они начиная с 1 (а не с 0, как привыкли все программисты).

Delphi
1
2
Ap.Worksheets[1].Name := 'Первый лист'; // Изменить название первого листа
Ap.Worksheets[2].Name := 'Ещё один лист'; // Изменить название второго листа

Свойства страницы

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Колонтитулы:
Ap.Worksheets[1].PageSetup.LeftFooter := 'Левый нижний колонтитул';
Ap.Worksheets[1].PageSetup.LeftHeader := 'Левый верхний колонтитул';
Ap.Worksheets[1].PageSetup.CenterFooter := 'Центральный нижний колонтитул';
Ap.Worksheets[1].PageSetup.CenterHeader := 'Центральный верхний колонтитул';
Ap.Worksheets[1].PageSetup.RightFooter := 'Правый нижний колонтитул';
Ap.Worksheets[1].PageSetup.RightHeader := 'Правый верхний колонтитул';
 
Ap.Worksheets[1].PageSetup.Draft := True; // Для черновой печати
Ap.Worksheets[1].PageSetup.BlackAndWhite := True;  // Для чёрно-белой печати
Ap.Worksheets[1].PageSetup.PrintGridlines := True; // При печати будет видна сетка
Ap.Worksheets[1].PageSetup.PrintHeadings := True;  // При печати будут печататься названия столбцов и номера строк
Ap.Worksheets[1].PageSetup.FirstPageNumber := 5;   // Начать нумерацию страниц с пятой
Ap.Worksheets[1].PageSetup.Orientation := 1;  // Ориентация бумаги: 1=Книжная, 2=Альбомная
Ap.Worksheets[1].PageSetup.PaperSize := 9; // Указать размер бумаги. 8=А3, 9=А4, 11=А5

Ниже приведён более полный список размеров бумаги из модуля ExcelXP:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const
  xlPaper10x14 = $00000010;
  xlPaper11x17 = $00000011;
  xlPaperA3 = $00000008;
  xlPaperA4 = $00000009;
  xlPaperA4Small = $0000000A;
  xlPaperA5 = $0000000B;
  xlPaperB4 = $0000000C;
  xlPaperB5 = $0000000D;
  xlPaperCsheet = $00000018;
  xlPaperDsheet = $00000019;
  xlPaperEnvelope10 = $00000014;
  xlPaperEnvelope11 = $00000015;
  xlPaperEnvelope12 = $00000016;
  xlPaperEnvelope14 = $00000017;
  xlPaperEnvelope9 = $00000013;
  xlPaperEnvelopeB4 = $00000021;
  xlPaperEnvelopeB5 = $00000022;
  xlPaperEnvelopeB6 = $00000023;
  xlPaperEnvelopeC3 = $0000001D;
  xlPaperEnvelopeC4 = $0000001E;
  xlPaperEnvelopeC5 = $0000001C;
  xlPaperEnvelopeC6 = $0000001F;
  xlPaperEnvelopeC65 = $00000020;
  xlPaperEnvelopeDL = $0000001B;
  xlPaperEnvelopeItaly = $00000024;
  xlPaperEnvelopeMonarch = $00000025;
  xlPaperEnvelopePersonal = $00000026;
  xlPaperEsheet = $0000001A;
  xlPaperExecutive = $00000007;
  xlPaperFanfoldLegalGerman = $00000029;
  xlPaperFanfoldStdGerman = $00000028;
  xlPaperFanfoldUS = $00000027;
  xlPaperFolio = $0000000E;
  xlPaperLedger = $00000004;
  xlPaperLegal = $00000005;
  xlPaperLetter = $00000001;
  xlPaperLetterSmall = $00000002;
  xlPaperNote = $00000012;
  xlPaperQuarto = $0000000F;
  xlPaperStatement = $00000006;
  xlPaperTabloid = $00000003;
  xlPaperUser = $00000100;

Распечатать

Delphi
1
Ap.Worksheets[1].PrintOut;

Выделение
Excel.Range[Excel.Cells[1, 1], Excel.Cells[5, 3]].Select;
а также любые другие комбинации выбора ячейки с окончанием .select — выбор 1 или группы ячеек

С выбранными ячейками возможны следующие преобразования:

1) объединение ячеек
Excel.Selection.MergeCells:=True;
2) перенос по словам
Excel.Selection.WrapText:=True;
3) горизонтальное выравнивание
Excel.Selection.HorizontalAlignment:=3;
при присваивании значения 1 используется выравнивание по умолчанию, при 2 — выравнивание слева, 3 — по центру, 4 — справа.
4) вериткальное выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые значения аналогичны горизонтальному выравниванию.
5) граница для ячеек
Excel.Selection.Borders.LineStyle:=1;
При значении 1 границы ячеек рисуются тонкими сплошными линиями.
Кроме этого можно указать значения для свойства Borders, например, равное 3. Тогда установится только верхняя граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает различную комбинацию граней ячеек.
В обоих случаях можно использовать значения в диапазоне от 1 до 10. ]

//9 и 11 — лучшие

\\\\\\\\\\\\\\\\

Установка пароля для активной книги может быть произведена следующим образом:

Delphi
1
2
3
4
5
6
try
// попытка установить пароль
Excel.ActiveWorkbook.protect('pass');
except
// действия при неудачной попытке установить пароль
end;

где pass — устанавливаемый пароль на книгу.

Снятие пароля с книги аналогично, использовуем команду

Delphi
1
Excel.ActiveWorkbook.Unprotect('pass');

где pass — пароль, установленный для защиты книги.

Установка и снятие пароля для активного листа книги Excel производится командами

Delphi
1
2
Excel.ActiveSheet.protect('pass'); // установка пароля
Excel.ActiveSheet.Unprotect('pass'); // снятие пароля

где pass — пароль, установленный для защиты книги.
Вспомогательные операции в EXCEL

Удаление строк со сдвигом вверх:

Delphi
1
2
Excel.Rows['5:15'].Select;
Excel.Selection.Delete;

при выполнении данных действий будут удалены строки с 5 по 15.

Установка закрепления области на активном листе Excel

Delphi
1
2
3
4
5
6
// снимаем закрепление области, если оно было задано
Excel.ActiveWindow.FreezePanes:=False;
// выделяем нужную ячейку, в данном случае D3
Excel.Range['D3'].Select;
// устанавливаем закрепление области
Excel.ActiveWindow.FreezePanes:=True;

Спасибо VampireKB за дополнения

Создание документа

Внимание!!! Всегда когда создаете объект интерфейса, заключайте  процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;

Далее идет краткий справочник по основным функциям работы с EXCEL

try
// создаем обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);

// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;

// создаем новый документ рабочую книгу
excel.WorkBooks.Add;

// или загружаем его из директории с программой
excel.WorkBooks.Open(GetCurrentDir() + ‘отчет.xls’);

{ GetCurrentDir()- возвращает путь к директории с программой}

// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;

//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;

// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;

// Задаем название первому и второму листу
excel.WorkBooks[1].WorkSheets[1].Name := ‘Отчет1’;
excel.WorkBooks[1].WorkSheets[2].Name := ‘Отчет2’;

//задаем формат числа для первой и четвертой колонки формат числа
excel.WorkBooks[1].WorkSheets[1].Columns[1].NumberFormat := ‘0,00’;
excel.WorkBooks[1].WorkSheets[1].Columns[4].NumberFormat := ‘0,0’;

// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;

// задаем начертание, цвет, размер и тип шрифта для первого ряда
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Bold := True; //жирный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Color := clRed;  // цвет красный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Size := 12;  //размер 12
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Name := ‘Times New Roman’;  //шрифт

//присваиваем ячейке 1,4 и 2,4 значения (1 — ряд, 4 — колонка)
excel.WorkBooks[1].WorkSheets[1].Cells[1, 4] := ‘А так можно внести значение в ячейку’;
excel.WorkBooks[1].WorkSheets[1].Cells[2, 4] := ‘А так можно внести значение в ячейку’;

//ввод в ячейку ‘A12’ формулы ‘=b5+c4’
excel.WorkBooks[1].WorkSheets[1].Range[‘A12′].Formula:=’=b5+c4’;

// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;

// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;

// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;

// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;

// Обьединяем ячейки ‘A1:A8’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:A8’].Merge;

// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;

// Поворачиваем слова под углом 45 градусов для диапазона ячеек ‘B3:D3’
excel.WorkBooks[1].WorkSheets[1].Range[‘B3:D3’].Orientation := 45;

//рисуем границы  выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии

//рисуем границы  выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;

//рисуем границы  выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

//рисуем границы  выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

//рисуем границы  выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

//рисуем границы  выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;

//автозаполнение выделенного диапазона
//для примера заполним область ячеек ‘A10:C10’ словом ‘привет’
//и размножим его вниз еще на пять ячеек ‘A10:C15’

excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10′].Value:=’привет’;

//выделяем диапазон ячеек ‘A10:C10’
excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10’].Select;

//автозаполняем (копируем) выделенным диапазоном область ячеек ‘A10:C15’
excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C15’],xlFillDefault);

//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;

 //сохраняем документ в формате Excel 97-2003
 excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xls’,xlExcel8);

 //сохраняем документ в текущем формате Excel 2007
 excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xlsx’);

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;

Except

//обрабатываем ошибки
showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;
end;
end;

При работе с листом Excel мы можем использовать следующие варианты:
— работать с областью Range[‘B3:D3’];
— работать с ячейкой Cells[2, 4] где 2 — ряд, 4 — колонка;
— работать с рядами Rows[1] или с диапазоном рядов Rows[‘1:5’];
— работать с колонками Columns[1] или диапазоном колонок Columns[‘A:I’];

Range[‘A1’] и Cells[1, 1] обозначают одно и тоже.

После сформирования документа или возникновении ошибки вы должны правильно освободить интерфейсы.
Иначе при закрытии Excel он скрывается с экрана, но если открыть диспетчер задач он продолжает там висеть и если данный процесс не завершить , то при каждом новом запуске их будет накапливаться больше и больше, пока компьютер не начнет виснуть. Поэтому обязательно необходимо освобождать все интерфейсы с вязанные с Excel с его книгами и листами.

Например так:
//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан

end;

Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.

unit Unit1;

interface

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

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

var
  Form1: TForm1;
  excel: variant; // Переменная в которой создаётся объект EXCEL
  MyData: variant; // Переменная в которой формируется таблица умножения
  i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
// Обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// новый документ
excel.WorkBooks.Add;

//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
  MyData[i,j]:=i*j;

// Обьединяем ячейки ‘A1:I1’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:I1’].Merge;
//Пишем заголовок
excel.WorkBooks[1].WorkSheets[1].Range[‘A1′].Value:=’Таблица умножения’;
// Выравнивам заголовок по центру
excel.WorkBooks[1].WorkSheets[1].Range[‘A1’].HorizontalAlignment := xlCenter;
// задаем ширину  колонок с A по I
excel.WorkBooks[1].WorkSheets[1].Columns[‘A:I’].ColumnWidth := 3;

//выделяем область таблицы умножения [‘A2:I10’] и рисуем границы
excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].select;
//рисуем границы  выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;// толщина линии
//рисуем границы  выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlThin;
//рисуем границы  выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;
//рисуем границы  выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlThin;
//рисуем границы  выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlThin;
//рисуем границы  выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlThin;

//присваиваем диапазону [‘A2:I10’] значения вариантного массива  MyData это значительно ускоряет работу, нежели вывод по //ячеечно

excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].Value:=MyData;

// Делаем его видимым
excel.Visible := true;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
Except
showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
end;
end;

end.

При написании статьи использовался материал с сайта http://vlad2000.h1.ru/Frames/Statyi/page_14.html


Форум программистов Vingrad

Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Как в Excel выделить строку(столбец) 

:(

   

Опции темы

alexe
Дата 18.5.2004, 08:20 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Здравствуйте!
Использую подсоединение к Excel:

procedure TForm1.Button1Click(Sender: TObject);
var
ibook:Excel97.ExcelWorkbook;
isheet:Excel97.ExcelWorkSheet;
begin
xl.Connect;
xl.Visible[0]:=True;
xl.ScreenUpdating[0]:=True;
ibook:=xl.Workbooks.Add(null,0);
isheet:=ibook.Worksheets.Item[‘Лист1’] as Excel97.ExcelWorkSheet;
end;

Пробовал использовать isheet.Columns.Column[1] …. , но выдается ошибка. Пытался использовать данные макроса VB из Exel, но так и не смог адаптировать его для Delphi. Максимум чего добился — выделил все столбцы (isheet.Columns.Select;).
Заранее благодарен!

  Вверх
Cashey
Дата 18.5.2004, 10:28 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бессмертный
****

Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60

Выделение строки (диапазона строк)

Код
XLApp := <object>.application
............................................................
XLApp.rows("02:42").select

Выделение столбца

Код
XLApp.columns(2).select

alexe
Существует, специально созданный для таких вопрос подфорум, зачем надо было помещать этот топик здесь?

Это сообщение отредактировал(а) Cashey — 18.5.2004, 10:41

———————

библия учит любить ближнего, а камасутра обучает как именно

PM Jabber   Вверх
Guest
Дата 18.5.2004, 12:36 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

To Cashey
Подфорум я просмотрел, но основной упор там на программировании в VB, а мне нужно на Delphi, поэтому и посчитал, что вопрос нужно поместить в этот раздел.
Что касается Вашего ответа, то на попытку использовать
xl.columns(2).select (xl: TExcelApplication;)
при компиляции выдается ошибка:
[Error] Unit1.pas(38): Missing operator or semicolon
Я так думаю, что здесь неправильный формат свойства Columns, а вот где узнать правильный — я не знаю (метод перебора возможных написаний не помог).

  Вверх
Akella
Дата 18.5.2004, 13:57 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

Ex1 — компоненте сос траницы Servers
Если, что не понятно, обращайся.

Код
procedure TfmImpExcel.ImportExcel(filename:string);
Var
r:Byte;
iProd,iPrice,iNameRow, iInd,iBook,RowsToCopy,iLastRow,x,i,e:Integer;
sFileName, sProdCol, sNameCol,sPriceCol:String;
bNaydeno, bNaydeno1, bNaydeno2, bNaydeno3:Bool;
iStop:Byte;//если кол-во пустых строк подряд больше 4, то останавливаемся
WorkBk : _WorkBook; //  определяем WorkBook
WorkSheet : _WorkSheet; //  определяем WorkSheet
Range:OleVariant;
sss:WideString;
tOneRecordTime,tMemTime,tBeg,tEnd:TTime;//время
iRowCount:Integer;//для времени
bGoTime:Boolean;//для вычисления времени импорта одной записи
k,l,m:Integer;
begin
{ if (cbAptName.Text='') or (Length(cbAptName.Text)<3) then begin
  beep;
  ShowMessage('Не выбран поставщик');
  cbAptName.SetFocus;
  exit;
end;
}
try
  fmMain.vAbort:=True;//обнуляем переменную для прерывания
 //отменяем полностью все прайсы
 if filename = 'cancel' then fmMain.vAbort:=False;
 if fmMain.vAbort=False then begin//прерываем операцию
   fmMain.vAbort:=True;//обнуляем переменную для прерывания
   fmMain.actButtons.Execute;
   lbWait.Visible:=False;
   lbFileName.Visible:=lbWait.Visible;
   sb3.Panels[0].Text:='Прервано пользователем...';
   memoErrors.Lines.Add(TimeToStr(Time)+' Прервано пользователем');
   memoErrors.Lines.Add(TimeToStr(Time)+' _____________СТОП__________________');
   try
     sb3.Panels[0].Text:='Закрытие Excel...';
     Ex1.Workbooks.Close(0{LOCALE_USER_DEFAULT});
     Ex1.Disconnect;
     Ex1.Quit;
   except
   end;//try-except
    screen.Cursor:=crDefault;
    cbAptName.ItemIndex:=-1;
    application.ProcessMessages;
    Exit;
 end;//if fmMain.vAbort=False then begin

  memoErrors.Lines.Add(TimeToStr(Time)+' Этап 1: "'+fmMain.tAptAName.AsString+'"');
  bNaydeno:=False;
  bNaydeno1:=False;
  bNaydeno2:=False;
  bNaydeno3:=False;
  bGoTime:=True;
  RowsToCopy:=0;
  iLastRow:=0;
  tbImportExcel.Enabled:=False;
  tbToPrep.Enabled:=False;
  lbWait.Visible:=True;
  lbFileName.Visible:=lbWait.Visible;
  //очищаем StringGrid sg1
  sg1.RowCount:=1;
  sg1.Rows[0].Clear;
  sb3.Panels[0].Text:='Открытие Excel...';
  application.ProcessMessages;
  try//попытка открытия файла
    Ex1.Connect;
    Ex1.Workbooks.Open(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam, 0{LOCALE_USER_DEFAULT});
    lbFileName.Caption:='Импорт из '+FileName;
  except;//в случае ошибки все отменяем и обнуляем
    screen.Cursor:=crDefault;
    if cbSound.Checked then
      windows.Beep(2000,1000);
    fmMain.vAbort:=True;//обнуляем переменную для прерывания
    bNaydeno:=False;
    bNaydeno1:=False;
    bNaydeno2:=False;
    RowsToCopy:=0;
    fmMain.actButtons.Execute;//включаем или откл. кнопки
    lbWait.Visible:=True;
    lbFileName.Visible:=lbWait.Visible;
    //очищаем StringGrid sg1
    sg1.RowCount:=1;
    sg1.Rows[0].Clear;
    ShowMessage('Не возможно открыть файл "'+FileName+'"');
    cbAptName.ItemIndex:=-1;
    pb1.Visible:=False;
    exit;
  end;//try-except Ex1.Connect
  screen.Cursor:=crHourGlass;
  pb1.Position:=0;
  pb1.Visible:=True;
  sb3.Panels[0].Text:='Поиск рабочей книги и листа...';
  application.ProcessMessages;
  //ищем нужную книгу
  sFileName:=ExtractFileName(FileName);
  For iInd:=1 to ex1.Workbooks.Count do begin
    if ex1.Workbooks.Item[iInd].Name=sFileName then break;
  end;//For iInd:=1 to ex1.Workbooks.Count do begin
  // Выбираем WorkBook
  WorkBk := ex1.WorkBooks.Item[iInd];
  // Определяем WorkSheet
  if WorkBk.Worksheets.Count>1 then begin//если кол-во листов больше 1
    For x:=0 to memoSheets.Lines.Count-1 do begin
     For iBook:=1 to WorkBk.Worksheets.Count do begin
       WorkSheet:=WorkBk.WorkSheets.Get_Item(iBook) as _WorkSheet;
       if WorkSheet.Name = memoSheets.Lines[x] then begin
         bNaydeno3:=True;//нашли лист
         WorkSheet.Activate(0{LOCALE_USER_DEFAULT});//активираем лист
       end;//if WorkSheet.Name = memoSheets.Lines[x] then begin
       if bNaydeno3 then break;
     end;//For iBook:=1 to WorkBk.Worksheets.Count do begin
     if bNaydeno3 then break;
    end;//For x:=0 to memoSheets.Lines.Count-1 do begin
    //если не находим лист из списка ключевых слов, выдаем сообщение
    if bNaydeno3=false then begin
      beep;
      if cbDontShowErrors.Checked = false then
        ShowMessage('<Не найден лист с данными>'+#13+#13+
        '1.Откройте прайс, посмотрите название листа с препаратами, добавьте в'+#13+
        'ключевые слова название листа с препаратами и повторите импорт'+#13+
        '___________________________________________________________________________________'+#13+
        '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
        memoErrors.Lines.Add(TimeToStr(Time)+' Не найден лист с препаратами.');
        memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
        memoErrors.Lines.Add('___________________________________________');
      cbAptName.ItemIndex:=-1;
      exit;
    end;//if bNaydeno3=false then begin
  end else//if
    WorkSheet:=WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;;

  sb3.Panels[0].Text:='Поиск последней строки...';
  application.ProcessMessages;
  if Find('99999',iNameRow,sNameCol, WorkSheet) then begin
   iLastRow:=iNameRow-1;//в столбце с наименованием ищем "99999"-конец импорта
  end else begin     //и запоминаем в iRows
   try//если не находим 99999 то ищем последнюю заполненную ячейку
     WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
     // Получаем значение последней строки
     iLastRow:=(ex1.ActiveCell.Row)-1;
    except
      try
        WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Select;
        // Получаем значение последней строки
        iLastRow:=(ex1.ActiveCell.Row);
      except
        iLastRow:=0;
      end;//try-except
    end;//try-except
  end;
  if iLastRow=0 then begin
     memoErrors.Lines.Add(TimeToStr(Time)+' Не найден признак окончания, импортируем 6000 строк');
     iLastRow:=6000;
  end;//if iRows=0 then begin
  //ищем наименование препаратов
  For r:=0 to memoNames.Lines.Count-1 do begin
    bNaydeno:=False;
    if Find(memoNames.Lines[r],iNameRow,sNameCol,WorkSheet) then begin
     bNaydeno:=True;
     //количество строк для копирования
     RowsToCopy:=iLastRow-iNameRow;
     break;
    end;//if Find(memoNames.Lines[r],iNameRow,sNameCol) then begin
  end;//For r:=0 to memoNames.Lines.Count-1 do begin
  //показываем кол-во строк для копирования
  memoErrors.Lines.Add(TimeToStr(Time)+' Записей для импорта '+IntToStr(RowsToCopy));
  if bNaydeno=false then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с наименованием препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с наименованиями препаратов, добавьте в'+#13+
      'ключевые слова название столбца с наименованием и повторите импорт'+#13+
      '___________________________________________________________________________________'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с наименованием препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno=false then begin
  //ищем цену препаратов

  For r:=0 to memoPrices.lines.Count-1 do begin
    bNaydeno1:=False;
    if Find(memoPrices.lines[r],iPrice,sPriceCol,WorkSheet) then begin
     bNaydeno1:=True;
     break;
    end;//if Find(memoPrices.lines[r],iPriceRow,sPriceCol) then begin
  end;//For r:=0 to memoPrices.lines.Count-1 do begin
  if bNaydeno1=false then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с ценами препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с ценами препаратов, добавьте в'+#13+
      'ключевые слова название этого столбца и повторите импорт.'+#13+
      '___________________________________________________________________________________'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с ценами препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno1=false then begin
  //ищем производителя препаратов
  For r:=0 to memoProd.Lines.Count-1 do begin
    bNaydeno2:=False;
    if Find(memoProd.Lines[r],iProd,sProdCol,WorkSheet) then begin
     bNaydeno2:=True;
     break;
    end;//if Find(memoProd.Lines[r],iProdRow,sProdCol) then begin
  end;//For r:=0 to memoProd.Lines.Count-1 do begin
  if bNaydeno2=False then begin
    beep;
    if cbDontShowErrors.Checked = false then
      ShowMessage('<Не найден столбец с производителем препаратов>'+#13+#13+
      '1.Откройте прайс, посмотрите название столбца с производителями препаратов,'+#13+
      'добавьте в ключевые слова название этого столбца и повторите импорт'+#13+
      '-----------------------------------------------------------------------------'+#13+
      '2.Откройте прайс, выберите лист с препаратами, затем выберите меню "Файл->Сохранить"');
      memoErrors.Lines.Add(TimeToStr(Time)+' Не найден столбец с производителем препаратов.');
      memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен неудачно');
      memoErrors.Lines.Add('___________________________________________');
    cbAptName.ItemIndex:=-1;
    exit;
  end;//if bNaydeno2=False then begin
   //если все найдено выполняем импорт
   pb1.Max:=RowsToCopy;
   sb3.Panels[0].Text:='Импорт начат...';
   application.ProcessMessages;
   iStop:=0;
//начинаем импорт со строки iNameRow
   iRowCount:=RowsToCopy;//для определения времени
   k:=GetTickCount;
   if bGoTime then tBeg:=GetTickCount;
   For e:=0 to RowsToCopy do begin
   Dec(iRowCount);
     if (WorkSheet.Cells.Item[iNameRow,sNameCol].Value='') or
      (WorkSheet.Cells.Item[iNameRow,sNameCol].Value=' ') then
      Inc(iStop)//если пустая строка, то увеличиваем на 1
     else
      iStop:=0;//если следующая не пустая то обнуляем и продолжаем импорт
     //если начались пустые строки то прекращаем импорт
     if iStop>4 then break;
     //наименование препарата
     sg1.Cells[1,e]:=WorkSheet.Cells.Item[iNameRow,sNameCol].Value;
//      sb3.Panels[0].Text:='Импорт ячейки ['+sNameCol+IntToStr(iNameRow)+'] - препарат';
//      application.ProcessMessages;
     //цена
     sg1.Cells[2,e]:=WorkSheet.Cells.Item[iNameRow,sPriceCol].Value;
     sg1.Cells[2,e]:=DelProb(sg1.Cells[2,e]);//удаляем пробелы
//      sb3.Panels[0].Text:='Импорт ячейки ['+sPriceCol+IntToStr(iNameRow)+'] - цена';
//      application.ProcessMessages;
     //производитель
     sg1.Cells[3,e]:=WorkSheet.Cells.Item[iNameRow,sProdCol].Value;
//      sb3.Panels[0].Text:='Импорт ячейки ['+sProdCol+IntToStr(iNameRow)+'] - производитель';
//      application.ProcessMessages;
     Inc(iNameRow);
     if sg1.RowCount=e then sg1.RowCount:=sg1.RowCount+1;
     pb1.Position:=e;
     //прерываем по желанию пользователя
     if fmMain.vAbort=False then begin//прерываем операцию
       fmMain.vAbort:=True;//обнуляем переменную для прерывания
       fmMain.actButtons.Execute;
       lbWait.Visible:=False;
       lbFileName.Visible:=lbWait.Visible;
       sb3.Panels[0].Text:='Прервано пользователем...';
       memoErrors.Lines.Add(TimeToStr(Time)+' Прервано пользователем');
       memoErrors.Lines.Add('___________________________________________');
       try
        Ex1.Workbooks.Close(0{LOCALE_USER_DEFAULT});
        Ex1.Disconnect;
        Ex1.Quit;
       except
       end;//try-except
//        screen.Cursor:=crDefault;
       application.ProcessMessages;
       cbAptName.ItemIndex:=-1;
       Exit;
      end;//if fmMain.vAbort=False then begin

      if bGoTime then tEnd:=GetTickCount;
      if bGoTime then l:=GetTickCount;;
      if bGoTime then begin//первый раз вычисляем время импорта одной записи
        tOneRecordTime:=(tEnd-tBeg);
        m:=(l-k);
        bGoTime:=False;
      end;
      tMemTime:=((RowsToCopy - iNameRow) / m) / 1000;
//       ShowMessage(TimeToStr(tMemTime));
//       tMemTime:=iRowCount * tOneRecordTime;//вычисляем время
      sb3.Panels[2].Text:='Осталось: '+TimeToStr(tMemTime);
      application.ProcessMessages;
   end;//For e:=0 to RowsToCopy do begin
   memoErrors.Lines.Add(TimeToStr(Time)+' Этап 2: копирование данных во временную таблицу');
   fmMain.actXlsToTemp.Execute;//копирование во временную таблицу
   fmMain.tTemp.FlushBuffers;
   memoErrors.Lines.Add(TimeToStr(Time)+' Импорт завершен');
   memoErrors.Lines.Add('___________________________________________');
   if cbSound.Checked then  windows.Beep(1200,2000);
finally
 try
  sb3.Panels[0].Text:='Закрытие Excel...';
  application.ProcessMessages;
  Ex1.Quit;
  Ex1.Disconnect;
 except
  sb3.Panels[0].Text:='Ошибка закрытия Excel';
  application.ProcessMessages;
 end;//try-закрытие excel
 //включаем кнопки
 fmMain.actButtons.Execute;
 //прячем процессбар
 pb1.Visible:=false;
 sg1.RowCount:=1;
 sg1.Rows[0].Clear;
 lbWait.Visible:=False;
 lbFileName.Visible:=lbWait.Visible;
 screen.Cursor:=crDefault;
 cbAptName.ItemIndex:=-1;
 VarClear(Range);
 sb3.Panels[0].Text:='Импорт завершен.';
end;//try-finally
end;//procedure

Function TfmImpExcel.Find(sText:String;Var iRow:Integer;Var sCol:String;WorkSheetF:_WorkSheet):Bool;
Var
UsedRange, Range: OLEVariant;
t,y:Integer;//вспомогат для импорта
FirstAddress: string;
begin //поиск
 Result:=False;
 UsedRange := WorkSheetF.Range['A1','Z5000'];
 Range := UsedRange.Find(What:=sText, LookIn := xlValues, LookAt := xlWhole,SearchDirection := xlNext);
//  if not VarIsEmpty(Range)then begin
 if not VarIsClear(Range) then begin
   try
     FirstAddress := Range.Address;
     //вычисляем номер строки из полученного адреса(абсолютные координаты)
     //он начинается после второго значка доллара
     t:=PosEx('$',FirstAddress,2);
     iRow:=StrToInt(Copy(FirstAddress,t+1,length(FirstAddress)-t));
     //вычисляем номер столбца из полученного адреса(абсолютные координаты)
     //буква нач. со второго символа
     y:=PosEx('$',FirstAddress,2);
     sCol:=Copy(FirstAddress,2,y-2);
     Result:=true;
     VarClear(Range);
     VarClear(UsedRange);
   except
     Result:=False;
   end;//try-except
 end;//if
end;

PM MAIL   Вверх
Guest
Дата 18.5.2004, 14:44 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

To dsergey
Спасибо за код, нашел кое-что интересное, обязательно попробую, НО так и не нашел, как же выделить ВСЮ колонку (может проглядел!?), а не отдельную ячейку или диапазон. Может быть плохо объясняю, что нужно…
Мне нужно скрывать определенные столбцы в результате выполнения программы. Если я правильно понимаю, перед скрытием нужно этот самые столбцы выделить. А во всех примерах, которые я нашел, оперируют с отдельными ячейками (диапазоном) и нигде не видел, чтобы работали со всем столбцом (строкой). Хотел вытащить нужную функцию из макроса, но так и не смог его извернуть для Delphi, все время получал ошибки.

  Вверх
Akella
Дата 19.5.2004, 14:45 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

Для удаления я использую удаление не колонки а диапазона.
Range.Delete

тебе этот код о чем-нибудь говорит попробуй перевести на Delphi, я тоже попробую, посмотрим, что получится
Columns(«C:C»).Select
Selection.Delete Shift:=xlToLeft

PM MAIL   Вверх
Akella
Дата 20.5.2004, 08:42 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

я попробовал так
Var
Sheets,Colums:Variant;
begin

Sheets.Colums(‘D:D’).Delete

нормально удалилось.

У меня кстати Off XP

PM MAIL   Вверх
alexe
Дата 20.5.2004, 08:51 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

To dsergey
Пробовал по-всякому до этого и сегодня полтара часа убил на это. Сыплет ошибками, хоть тресни, причем никак не могу узнать, что в качестве параметров передавать.
Зато набрел на кое-что интересное. Если не упираться в выбор колонки, а сразу попытаться скрыть, то ошибки выдаются уже другие smile.gif)
Если набрать
isheet.Columns.Hidden[‘1′,’1’] ;
то выдается несовместимость типов Integer и Char на этапе компиляции.
Если набрать
isheet.Columns.Hidden[1,1] ; или isheet.Columns.Hidden[1] ;
то выдается EVariantError «Variant is not an array».
Может так что-нибудь получится, но описание свойства Hidden в модуле excel97.pas:
property Hidden: OleVariant dispid 268;
меня ни на какие мысли не наводит sad.gif(
Может быть знаешь, какие параметры нужны?
Единственно, чего добился вразумительного, то это возможность выбора строки, хотя сам механизм выбора опять же непонятен
isheet.Range[‘1:1′,’1:1’].select;
Если менять любое (!) число, то это определяет количество выбираемых строк, причем выбирается любое (!) наибольшее из значений.
В общем, вопросов только прибавилось…

Поздно обновился. У меня Office 97.
Попробовал sheets.Columns[‘d:d’].delete ;
Получил EVariantError «Variant does not reference an automation object»
А объявления Sheets,Colums:Variant;
достаточно, или нужны какие-либо еще. Подключение к Excel прежнее, добавил в код только пробуемую строку(без добавок), ну и описание в var соответственно.

Это сообщение отредактировал(а) alexe — 20.5.2004, 09:14

  Вверх
Akella
Дата 21.5.2004, 08:03 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

Процедура экспорта таблицы в Excel
tRekv, tZay — таблицы
Excel — объявлено в начале модуля (Excel:Variant)
dbGridZay — TDBGrid (проверка, какие столбцы скрытые перед экспортом)

Код
procedure TfmMain.actZayToExcelExecute(Sender: TObject);
Var
UsedRange, Range, Sheets, Columns:Variant;
iColForRekv, iColSum, iColCount, iBegRow, iBegRowTitle, vRow:Integer;
s:String;
FirstAddress: string;
dDate:TDate;
begin
if not VarIsEmpty(Excel) then begin
 Excel.Quit;
 Excel := Unassigned;
end;//if
begin
 try
   Screen.Cursor:=crHourGlass;
   tZay.DisableControls;
   sb2.Panels[0].Text:='Открытие Excel...';
   application.ProcessMessages;
   Try//открываем Excel и создаем раб.книгу
     Excel:=CreateOleObject('Excel.Application');
     Excel.SheetsInNewWorkbook:=1;
     Excel.WorkBooks.Add;
     Sheets:=Excel.Workbooks[1].Sheets[1];
   Except
     SysUtils.beep;
     Screen.Cursor:=crDefault;
     sb2.Panels[0].Text:='Ошибка открытия Excel...';
     application.ProcessMessages;

     ShowMessage('Не могу открыть Excel!');
     Exit;
   end;//try-except
   //Название заявки
   sb2.Panels[0].Text:='Заполнение реквизитов...';
   application.ProcessMessages;

   tRekv.Open;

   iBegRowTitle:=1;
   //рисуем border
   Range:=Sheets.Range['B1'];
   Range.Borders[4].LineStyle := 1;
   //название поставщика
   Sheets.Cells[iBegRowTitle,2]:=lcbApt.Text;
   Range:=Sheets.Cells[iBegRowTitle,2];
   Range.HorizontalAlignment := xlCenter;
   Range.VerticalAlignment := xlCenter;
   Inc(iBegRowTitle);
   //подписываем под название поставщика
   Sheets.Cells[iBegRowTitle,2]:='/поставщик/';
   Range:=Sheets.Cells[iBegRowTitle,2];
   Range.HorizontalAlignment := xlCenter;
   Range.VerticalAlignment := xlCenter;

   iColForRekv:=4;//колонка для реквизитов
   Dec(iBegRowTitle,2);//строке для реквизитов
   if tRekvRNameUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:=tRekvRName.AsString;
   end;
   if tRekvRAddressUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:=tRekvRAddress.AsString;
   end;
   if tRekvRTelUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Тел/Факс: '+tRekvRTel.AsString;
   end;
   if tRekvREMailUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='e-mail: '+tRekvREMail.AsString;
   end;
   if tRekvROKPOUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='ОКПО: '+tRekvROKPO.AsString;
   end;
   if tRekvRINNUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='ИНН: '+tRekvRINN.AsString;
   end;
   if tRekvRSvidNdsUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='№ свид плат. НДС: '+tRekvRSvidNds.AsString;
   end;
   if tRekvRBankUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Банк: '+tRekvRBank.AsString;
   end;
   if tRekvRGorBankUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='город банка: '+tRekvRGorBank.AsString;
   end;
   if tRekvRMFOUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='МФО: '+tRekvRMFO.AsString;
   end;

   if tRekvRRSUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Р/счет: '+tRekvRRS.AsString;
   end;
   if tRekvRLicenzeUse.AsBoolean = true then begin
     Inc(iBegRowTitle);
     Sheets.Cells[iBegRowTitle,iColForRekv]:='Лицензия: '+tRekvRLicenze.AsString;
   end;
   Inc(iBegRowTitle);

   Sheets.Cells[iBegRowTitle,3]:='ЗАЯВКА';
   Range:=Sheets.Cells[iBegRowTitle,3];
   Range.Font.Bold:=True;

   Inc(iBegRowTitle);
   Sheets.Cells[iBegRowTitle,3]:='на '+ DateToStr(dtpZayBegin.Date);
   Inc(iBegRowTitle,2);
   sb2.Panels[0].Text:='Создание заголовков...';
   application.ProcessMessages;
   //заголовки столбцов
   iBegRow:=iBegRowTitle;//начальная строка для преператов
   vRow:=iBegRow+1;
   tZay.First;
   For iColCount:=0 to dbGridZay.Columns.Count-1 do begin
     Sheets.Cells[iBegRow,iColCount+1]:=dbGridZay.Columns[iColCount].Title.Caption;
     Sheets.Cells[iBegRow,iColCount+1].ColumnWidth:=dbgridzay.Columns[iColCount].Width div 6;
     Range:=Sheets.Cells[iBegRow,iColCount+1];
     Range.Font.Bold:=True;
     //рисуем border
     Range.Borders[1].LineStyle := 1;
     Range.Borders[2].LineStyle := 1;
     Range.Borders[3].LineStyle := 1;
     Range.Borders[4].LineStyle := 1;
   end;
   //заполнение таблицы
   sb2.Panels[0].Text:='Отправка данных...';
   application.ProcessMessages;
   while not tZay.Eof do begin
     For iColCount:=0 to dbGridZay.Columns.Count-1 do begin
       Range:=Sheets.Cells[vRow,iColCount+1];
       Case tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).DataType of
         ftFloat   : begin
                       Range.NumberFormat := '0,000';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsFloat
                     end;
         ftString  : begin
                       Range.NumberFormat := '@';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsString;
                     end;
         ftInteger : begin
                       Range.NumberFormat := '0';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsInteger;
                     end;
         ftAutoinc : begin
                       Range.NumberFormat := '0';
                       Sheets.Cells[vRow,iColCount+1]:=
                       tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsInteger;
                     end;

         ftDate    : begin
                       Range.NumberFormat := '@';
                       dDate:=tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsDateTime;
                       Sheets.Cells[vRow,iColCount+1]:=FormatDateTime('dd.mm.yyyy',dDate);
                     end
       else
         Range.NumberFormat := '@';
         Sheets.Cells[vRow,iColCount+1]:=
         tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsString;
       end;//case-else
       try
       if tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).DataType = ftFloat then
        if tZay.FieldByName(dbGridZay.Columns[iColCount].FieldName).AsFloat = 0 then
           Sheets.Cells[vRow,iColCount+1]:=' ';
       except
       end;

       //рисуем border
       Range.Borders[1].LineStyle := 1;
       Range.Borders[2].LineStyle := 1;
       Range.Borders[3].LineStyle := 1;
       Range.Borders[4].LineStyle := 1;
     end;// FOR
     Inc(vRow);
     tZay.Next;
   end;//WHILE
   if (StrToFloat(dbGridZay.Columns[5].Footer.Value)<>0) AND
   (dbGridZay.Columns[5].Visible)  then begin
     iColSum:=dbGridZay.Columns[5].Index+1;//колонка для суммы
     Sheets.Cells[vRow,2]:='ИТОГО:';
     Range:=Sheets.Cells[vRow,iColSum];
     Range.HorizontalAlignment := xlRight;
     Range.VerticalAlignment := xlCenter;
     Range.NumberFormat := '0,000';
     try
      Sheets.Cells[vRow,iColSum]:=StrToFloat(dbGridZay.Columns[5].Footer.Value);
     except
      Range.NumberFormat := '@';
      Sheets.Cells[vRow,iColSum]:=dbGridZay.Columns[5].Footer.Value;
     end;
   end;

   sb2.Panels[0].Text:='Удаление лишних полей...';
   application.ProcessMessages;

   //удаляем лишние столбцы (по умолчанию со сдвигом влево)
   For iColCount:= dbGridZay.Columns.Count-1 downto 0 do begin
     if dbGridZay.Columns[iColCount].Visible=False then begin
       UsedRange := Sheets.Range['A1','Z100'];//диапазон поиска заголовка
       Range := UsedRange.Find(What:=dbGridZay.Columns[iColCount].title.Caption, LookIn := xlValues, LookAt := xlWhole,SearchDirection := xlNext);
       if not VarIsEmpty(Range) then begin
         try
           FirstAddress := Range.Address;
           s:=StringReplace(FirstAddress,'$','',[rfReplaceAll]);
           Range:=Sheets.Range[s+':'+Copy(s,1,1)+IntToStr(vRow)];
           Range.Delete;
         except

         end;//try
       end;//if not VarIsEmpty(Range)then begin
     end;//if dbGridZay.Columns[iColCount].Visible=False then begin
   end;//for delete
   sb2.Panels[0].Text:='Экспорт завершен...';
   application.ProcessMessages;
  finally
   tZay.EnableControls;
   Screen.Cursor:=crDefault;
   tRekv.Close;
   Excel.Visible:=True;
  end;//finally
end;

Добавлено @ 08:04
Переходи на Delphi7 и OfficeXP

PM MAIL   Вверх
Guest
Дата 21.5.2004, 09:05 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Большое спасибо за информацию!
Кажется, количество полученной информации должно вот-вот перерасти в новое качество smile.gif
Самое главное, в цикле статей «Заметки программиста» из журнала Компьютер-Пресс нашел очень интересный факт:
«… использование вариантов (позднее связывание) проще, удобнее, а главное — намного понятнее, чем непосредственная работа с интерфейсами (раннее связывание).»
Автор статьи, используя раннее связывание, как и я, пытался выполнить действие с колонкой, но так и не смог. Что, в общем-то, и подтверждается моей практикой. Короче говоря, пора переходить на позднее связывание, что я и вижу в твоих работающих (!) примерах.
А на счет перехода на Office XP, это, к сожелению, технически невозможно. Вот поставить себе новую версию Delphi 6 или 7 в планах есть, но пока не знаю, что лучше по нетребовательности к ресурсам (у меня Celeron 1ГГц / 128 МБ DIMM / Win98SE и необходимость одновременной работы, помимо Delphi, с 2-3 сессиями Access одновременно) и по устойчивости в работе. Так что пока собираю информацию. Но это так, мысли вслух.
Еще раз большущее спасибо!!!

  Вверх
Akella
Дата 21.5.2004, 10:13 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

Добавь 128 памяти, и переходи на WinXP. А процессор для программирования у тебя вполне нормальный.

Я работаю и с ранним связыванием, и с позним связыванием.
Так получилось.
Импорт из Excel — через компоненту на странице Servers,
Экспорт в Excel — через Ole

PM MAIL   Вверх
Гость_alexe
Дата 21.5.2004, 11:11 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

To dsergey
Пока ни на какой Windows перейти не могу. У нас так хитро заморочена сеть, что ПК с Win2k/WinXP пропадают у остальных пользователей в сетевом окружении.
Подскажи, пожалуйста, а сильно придется «переучиваться» при переходе с Delphi 5.5 на 7, и, самое главное, нет ли каких неприятных «особенностей» у 7 версии. У меня жесткая привязка к Office 97, точнее к Access 97, поэтому если 7 версия вдруг не поддерживает Access 97, то придется переходить на 6.

  Вверх
Akella
Дата 25.5.2004, 08:22 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Творец
****

Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329

Delphi 7 поддерживает и 97, и 2000, и XP.
Переход на Delphi 7 безболезненный, по крейней мере пока о проблемах не слышал не от кого.
Так что дерзай.

а в модуле я могу указать в секции uses Excel97 или Excel2000, или ExcelXP, или и то, и другой, и можно без хлеба. Только некоторые параметры нужно менять, как, например, при открытии файла количество параметров разное.

hehe.gif rolleyes.gif hehe.gif rolleyes.gif

Это сообщение отредактировал(а) dsergey — 25.5.2004, 08:24

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

Для работы с Excel в Delphi, первым делом нужно в Uses указать модуль ComObj.

procedure TForm1.Button1Click(Sender: TObject);

var

XL: Variant;

begin

XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта

XL.WorkBooks.add; // Создание новой рабочей книги

XL.visible := true;

end;

Как обратиться к отдельным ячейкам листа Excel в Delphi

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Value:=’30’;

//Результатом является присвоение ячейке [1,1] первого листа значения 30. Также к ячейке

//текущего листа можно обратиться следующим образом:

XL.Cells[1, 1]:=’30’;

Как добавить формулу в ячейку листа Excel в Delphi

XL.WorkBooks[1].WorkSheets[1].Cells[3,3].Value := ‘=SUM(B1:B2)’;

Форматирование текста в ячейках Excel, производится с помощью свойств Font и Interior объекта Cell:

// Цвет заливки

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Interior.Color := clYellow;

// Цвет шрифта

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Color := clRed;

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Name := ‘Courier’;

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Size := 16;

XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Bold := True;

Работа с прямоугольными областями ячеек, с помощью объекта Range:

XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Value := ‘Blue text’;

XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Font.Color := clBlue;

//В результате в области A1:C5 все ячейки заполняются текстом ‘Blue text’.

Как выделить группу (область) ячеек Excel в Delphi

XL.Range[‘A1:C10’].Select;

Как установить объединение ячеек, перенос по словам, и горизонтальное или вертикальное выравнивание Excel в Delphi

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//Выделяем группу (область) ячеек

XL.Range[‘A1:C10’].Select;

// объединение ячеек

XL.Selection.MergeCells:=True;

// перенос по словам

XL.Selection.WrapText:=True;

// горизонтальное выравнивание

XL.Selection.HorizontalAlignment:=3;

//вериткальное выравнивание

XL.Selection.VerticalAlignment:=1;

//Возможны следующие значения:

//1 — выравнивание по умолчанию,

//2 — выравнивание слева,

//3 — выравнивание по центру,

//4 — выравнивание справа.

Как задать границы ячеек Excel в Delphi

XL.Selection.Borders.LineStyle:=1;

// значение может быть установлено от 1 до 10

Как выровнять столбцы Excel по ширине, в зависимости от содержания

XL.selection.Columns.AutoFit;

Как удалить столбец Excel в Delphi

Как задать формат ячеек Excel в Delphi

XL.columns[1].NumberFormat := ‘@’; // текстовый формат

XL.columns[1].NumberFormat := ‘m/d/yyyy’; //  формат дата

XL.columns[1].NumberFormat = ‘0.00%’ // формат процентный

XL.columns[1].NumberFormat = ‘h:mm;@’// формат время


Понравилась статья? Поделить с друзьями:
  • Delphi excel вставка формул
  • Delphi excel вставить ячейки
  • Delphi excel вставить картинку
  • Delphi excel все строки
  • Delphi excel буфер обмена