Delphi excel выделить лист

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

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

План статьи:

  • Объекты Microsoft Excel
  • Как активировать лист рабочей книги Excel?
  • Методы  листа книги Excel

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

1. Объекты Microsoft Excel

Объектная модель ExcelНа рисунке я попробовал изобразить объектную модель Excel в миниатюре. Т.е. из этой модели исключены не требующиеся пока нам элементы, например такие, как свойства рабочей книги или выделенные объекты Selection — об этом речь пойдет позже.

Как Вы можете судить по представленной модели, а также и по собственному опыту работы, приложение Excel в общем случае может содержать коллекцию рабочих книг (WorkBooks Collection). Для доступа к конкретной рабочей книге мы с Вами использовали свойства Item коллекции:

WorkBook:=WorkBooks.Item[index]

где index — порядковый номер рабочей книги в коллекции WorkBooks.

И на этом наше первое  знакомство с Excel закончилось. Между тем, каждая отдельная рабочая книга может содержать N листов, каждый из которых состоит из N ячеек, которые могут быть объединены в объекты Range.

На каждой из ступеней этой модели можно останавливаться и изучать её месяцами. Если будет особая необходимость в изучении каких-либо дополнительных свойств и методов — мы обязательно вернемся и изучим. А теперь, приступим к работе в Delphi с листами рабочей книги.

2. Как активировать лист рабочей книги Excel?

Как Вы знаете при создании пустой рабочей книги Excel автоматически добавляет в эту книгу 3 пустых листа. Чтобы работать с конкретным листом (WorkSheet или просто Sheet) этот лист необходимо активировать. Один из способов активации листа рабочей книги Excel в Delphi выглядит следующим образом:

resourcestring
  rsEInvalidSheetIndex = 'Задан неверный индекс для WorkBooks. Активация листа прервана';
  rsEInvalidSheetActivate = 'Активация листа завершена с ошибкой';
 
function ActivateSheet(WBIndex: integer; SheetName: string): boolean;
var
  i: integer;
begin
  Result := false;
  if WBIndex > MyExcel.WorkBooks.Count then
    raise Exception.Create(rsEInvalidSheetIndex);
  try
    for i := 1 to MyExcel.WorkBooks[WBIndex].Sheets.Count do
      if AnsiLowerCase(MyExcel.WorkBooks[WBIndex].Sheets.Item[i].Name)
        = AnsiLowerCase(SheetName) then
      begin
        MyExcel.WorkBooks[WBIndex].Sheets.Item[i].Activate;
        Result := true;
        break;
      end;
  except
    raise Exception.Create(rsEInvalidSheetActivate);
  end;
end;

Здесь в качестве параметров функции задается индекс рабочей книги (WBIndex) в коллекции WorkBooks и название листа.

Если хотите, то можете активировать тот же лист по индексу в коллекции WorkSheets — при этом сама функция немного упрощается (не требуется условие проверки названия листа).

Также, если вы уверены, что в данный момент времени активна необходимая Вам рабочая книга, то можно избежать использования лишней переменной (индекса рабочей книги WBIndex) и активировать лист вот так:

MyExcel.ActiveWorkBook.Sheets.Item[i].Activate;

Теперь рассмотрим более подробно методы, используемые объектом WorkSheet.

3. Методы  листа книги Excel

Теперь рассмотрим более подробно объект WorkSheet.

worksheet MethodsНа рисунке представлены те методы, которые я когда-либо использовал в своей работе.

Всего объект WorkSheet насчитывает 30 различных методов, которые Вы можете использовать.

Метод Описание
Activate Делает текущий лист активным. Работу метода мы уже с Вами рассмотрели
Calculate рассчитывает все открытые книги, конкретный лист в книге, или указанный диапазон ячеек на листе
CheckSpelling проверка орфографии на выбранном листе
SaveAs сохраняет все изменения в файле
Delete удаляет текущий лист WorkSheet
Select выделение листа
Copy копирует лист в другое место в рабочей книге
Paste вставляет содержимое буфера обмена на лист
ChartObjects возвращает объект, который представляет собой либо одну диаграмму (объект ChartObject) или совокупность всех диаграмм (объект ChartObjects) на листе
Move перемещение листа. Этот метод аналогичен методу Copy. Различие лишь в том, что после вcтавки копируемый лист удаляется из книги

Рассмотрим теперь каждый из представленных выше методов.

Ниже, в качестве expression должен выступать лист (WorkSheet), если не сказано иное.

Метод Calculate

Расчёт рабочей книги, листа или диапазона ячеек.

Стоит отметить, что вызов метода Calculate возможен не только для конкретного рабочего листа книги Excel. Рассмотрим варианты вызова метода Calculate.

Как рассчитать все открытые в данный момент книги Excel в Delphi?

var MyExcel: OleVariant;
MyExcel.Calculate

Как рассчитать отдельный лист книги Excel в Delphi?

в приведенном ниже фрагменте кода рассчитывается активный лист

MyExcel.ActiveWorkBook.ActiveWorkSheet.Calculate

Как рассчитать диапазон ячеек листа Excel в Delphi?

Рассчитаем все формулы в столбцах A, B и C:

MyExcel.ActiveWorkBook.ActiveWorkSheet.UsedRange.Columns("A:C").Calculate

Метод CheckSpelling

Вызов метода выглядит следующим образом:

expression.CheckSpelling(CustomDictionary, IgnoreUppercase, AlwaysSuggest, SpellLang)

При этом в качестве expression должен выступать лист (WorkSheet).

Параметр Тип Описание
CustomDictionary  Variant строка, указывающая имя файла пользовательского словаря, который будет рассмотрен, если слово не найдено в основном словаре. Если этот аргумент опущен, то будет использоваться словарь по-умолчанию
IgnoreUppercase Variant True, если необходимо, чтобы Microsoft Excel пропускал слова, которые написаны прописными буквами. False для того, чтобы Microsoft Excel проверить все слова. Если этот аргумент опущен, то используются текущие настройки Excel.
AlwaysSuggest Variant True, для того, чтобы Microsoft Excel отображал список предложений других вариантов написания при обнаружении неправильного написанного слова. False, чтобы Microsoft Excel ожидал ввода правильного написание. Если этот аргумент опущен, то используются текущие настройки.
SpellLang Variant язык словаря.  Может принимать значения одной из констант MsoLanguageID, например для русского языка SpellLang = 1049, для английского (США) SpellLang = 1033 и т.д. Более подробно про идентификаторы языков см. эту статью.

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

MyExcel.ActiveWorkBook.ActiveWorkSheet.CheckSpelling(CustomDictionary:=EmptyParam,  
                                                                        IgnoreUppercase:= false, 
                                                                        AlwaysSuggest:=EmptyParam, 
                                                                        SpellLang:=1033)

в этом случае MS Excel проверит текущий лист, включая проверку слов из прописных букв. Язык проверки — русский. Обратите внимание, что для того, чтобы вызвать метод мы явно указывали, какому параметру какое значение присвоить. Причём для того, чтобы пропустить какой-либо параметр, мы использовали EmptyParam (пустой параметр), который в Delphi представляет собой переменную типа OleVariant.

Понятно, что подобный способ вызова методов (с явным указанием всех параметров) для Вас не совсем удобен и широко не практикуется в программировании на Delphi, но тем не менее только так и никак иначе можно вызывать методы, используемые в Excel.

Метод SaveAs

Сохранение рабочего листа книги Excel.

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

expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru,TextCodepage, TextVisualLayout, Local)
Параметр Тип Описание
FileName Variant строка, представляющая собой имя сохраняемого файла. Необходимо указывать полный путь к файлу, иначе файл будет сохранен в папку Excel.
FileFormat Variant формат файла, который используется при сохранении. По умолчанию файл сохраняется в формате, который вы выбирали в последний раз в Excel.
Password Variant пароль для файла (не более 15 символов). Пароль чувствителен к регистру.
WriteResPassword Variant пароль, который будет использоваться для внесения изменений в рабочую книгу. Если пароль не будет указан, то книга будет открыта в режиме «Только для чтения»
ReadOnlyRecommended Variant если параметр равен True, то при открытии файла на дисплее появится сообщение, в котором рекомендуется, что бы файл был открыт только для чтения.
CreateBackup Variant True, для того, чтобы создать резервный файл
AddToMru Variant True, для того, чтобы добавить имя сохраняемого файла в список недавно открытых файлов в главном меню Excel
TextCodepage и TextVisualLayout Variant в настоящее время не используются и сохранены для обеспечения обратной совместимости
Local Variant не обязательный параметр, по-умолчанию равен False. Значение True — сохранение файлов с языковыми Microsoft Excel (в том числе настройки панели управления).

Как сохранить активный лист рабочей книги Excel в Delphi?

MyExcel.ActiveWorkBook.ActiveWorkSheet.SaveAs('C:MyExcelFile.xls')

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

Если Вам необходимо сохранить файл Excel в другом формате, то в параметре FileFormat можно использовать одно из значений перечислителя xlFileFormat. Некоторые значения xlFileFormat представлены в таблице ниже:

Имя Значение Описание Расширение файла
xlCSV 6 CSV *.csv
xlExcel8 56 Книга Excel 97-2003 *.xls
xlHtml 44 Формат HTML *.htm; *.HTML
xlOpenDocumentSpreadsheet 60 Электронная таблица OpenDocument *.ods
xlOpenXMLWorkbook 51 Книга Open XML *.xlsx

Как сохранить активный лист рабочей книги Excel в заданном формате?

Напишем небольшую процедуру, позволяющую сохранять лист Excel в различных форматах:

const
  xlCSV = 6;
  xlExcel8 = 56;
  xlHtml =44;
  xlOpenDocumentSpreadsheet = 60;
  xlOpenXMLWorkbook = 51;
 
resourcestring
  rsESaveActiveSheet = 'Ошибка сохранения активного листа книги';
 
procedure SaveAs(const AFileName: TFileName; AFileFormat: integer);
begin
 try
   MyExcel.ActiveWorkBook.ActiveSheet.SaveAs(AFileName, AFileFormat);
  except
    raise Exception.Create(rsESaveActiveSheet);
  end;
end;

Метод Delete

Удаление рабочего листа Excel.

Этот метод используется без параметров. Например, представленный ниже код удаляет активный лист рабочей книги:

MyExcel.ActiveWorkBook.ActiveWorkSheet.Delete

Метод Select

Выделение рабочего листа книги Excel.

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

expression.Select(Replace)
Параметр Тип Описание
Replace Variant True, чтобы заменить текущее выделение указанного объекта. False — продлить нынешний отбор включая все ранее выбранные объекты. По умолчанию используется True

Не стоит путать активный лист — тот который отображается в данный момент в книге и выделенный — выделить Вы можете хоть 10 листов (в Excel это делается с зажатым Ctrl), но активный — только один.

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

MyExcel.ActiveWorkBook.WorkSheets.Item[3].Select

Выделяет третий лист книги

Метод Copy

Копирование листа в другое место в рабочей книге.

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

expression.Copy(Before, After)
Параметр Тип Описание
Before Variant  лист до которого будет вставлен копируемый лист.
After Variant лист после которого будет вставлен копируемый лист

При этом, если вы используете параметр Before, то вы не должны использовать After и наоборот. Обращу Ваше внимание, что указывается именно ЛИСТ, а не индекс листа.

Как копировать лист Excel в Delphi?

MyExcel.ActiveWorkBook.WorkSheets.Item[1].Copy(After:=MyExcel.ActiveWorkBook.WorkSheets.Item[2])

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

Метод Paste

Вставка содержимого буфера обмена на лист Excel.

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

expression.Paste(Destination, Link)
Параметр Тип Описание
Destination Variant диапазон ячеек листа, который определяет, где будет вставлено содержимое буфера. Если этот аргумент опущен, используется текущий диапазон. Этот аргумент может быть указан только, если содержимое буфера обмена можно вставить в заданном диапазоне. Если этот параметр задан, то аргумент Link может не указываться
Link Variant True, для того чтобы установить связь с источником вставляемых данных. Если этот параметр задан, Destination не может быть использован. Значение по умолчанию False

Как вставить содержимое буфера обмена на лист Excel в Delphi?

MyExcel.ActiveWorkBook.ActiveSheet.Paste(Destination:=MyExcel.ActiveWorkBook.ActiveSheet.Range("D1:D5"))

В этом случае содержимое буфера будет вставлено в столбец D в строки с 1 по 5. Следует отметить, что если содержимое буфера не удовлетворяет условию, например в буфере только 1 число, то вызывается исключительная ситуация.

Метод ChartObjects

Возвращает объект, который представляет собой либо одну диаграмму (объект ChartObject) или совокупность всех диаграмм (объект ChartObjects) на листе.

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

expression.ChartObjects[Index]
Параметр Тип Описание
index Variant индекс диаграммы в коллекции (нумерация начинается с 1)

Как получить диаграмму на листе Excel в Delphi?

MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects[1]

В этом случае будет получена первая диаграмма на листе.

Метод Move

Перемещение листа. Этот метод аналогичен методу Copy. Различие лишь в том, что после вcтавки копируемый лист удаляется из книги.

Вот та часть методов, которые я использовал когда-либо при работе с Excel в Delphi. Вообще можно сказать, что в Delphi можно управлять MS Excel не хуже, чем при непосредственной работе с этим приложением, главное не забывать, какой метод или свойство за что отвечает :). Ну, а для того, чтобы не забыть, я создал небольшой MindMap, который буду периодически дополнять и обновлять. Перейдя по ссылке, Вы сможете посмотреть объекты Excel, методы ими используемые, параметры методов и их типы в соответствии с типами Delphi. В общем небольшая графическая шпаргалка для любителей поразбираться с Excel в Delphi.

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

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

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

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

0
0
голоса

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

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

XE3 use delphi with excel ole automation.
With this code I open and read / write in the cells, but I can not select different sheets (Sheet1, Sheet3 etc.)

begin
L_vi.Caption: = 'D:  bd1  file_supporto  Vi.xls';
Ex: = createoleobject ('Excel.Application');
Ex.visible: = true;
Ex.workbooks.open (L_vi.Caption);
Ex.cells [1,1]: = 'test';
Sheets: = Ex.Workbooks [1]. Worksheets ['Sheet3'];

Can you help?

thanks

P.S.
i resolved so:

Ex.Workbooks [1]. Worksheets ['Sheet3'].select;

thanks.

TLama's user avatar

TLama

74.7k17 gold badges210 silver badges386 bronze badges

asked Mar 30, 2013 at 10:53

user2225950's user avatar

This works well for me in XE3:

var
  XLApp: OleVariant;
  Sheet: OleVariant;
begin
  XLApp := CreateOleObject('Excel.Application');
  XLApp.Visible := True;
  XLApp.Workbooks.Open('C:TestTesting.xls');
  ShowMessage(XLApp.Workbooks[1].Worksheets[1].Name);  // Sheet1
  Sheet := XLApp.Worksheets.Item['Sheet3']; 
  ShowMessage(Sheet.Name);                             // Sheet3
  Sheet.Select;
  // This also works
  XLApp.WorkSheets.Item['Sheet1'].Select;              // Sheet1
end;

answered Mar 30, 2013 at 16:50

Ken White's user avatar

Ken WhiteKen White

123k14 gold badges222 silver badges438 bronze badges

0

Для работы с 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;@’// формат время



Форум программистов 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: Общие вопросы | Следующая тема »

 
Foxi_ ©
 
(2011-06-01 12:01)
[0]

подскажите пожалуйста,
почему у меня Sheets не работает, при выборе активного листа

var
e_app: Variant;
begin
e_app := CreateOleObject(«Excel.Application»);
e_app.WorkBooks.Open(«D:программафаил.xls»);
e_app.WorkBooks.WorkSheets.Item[«3»].Name;
Edit1.Text := e_app.ActiveSheet.UsedRange.Rows.Count;
Edit2.Text := e_app.ActiveSheet.UsedRange.Columns.Count+1;
e_app.Quit;
end;


 
clickmaker ©
 
(2011-06-01 12:03)
[1]

> e_app.WorkBooks.WorkSheets.Item[«3»].Name;

чтобы это значило?


 
Foxi_ ©
 
(2011-06-01 12:06)
[2]

пытаюсь открыть нужный лист в книге ;-)


 
clickmaker ©
 
(2011-06-01 12:12)
[3]

e_app.WorkBooks.WorkSheets.Item[3].Activate ?


 
Foxi_ ©
 
(2011-06-01 12:17)
[4]

пишет что незнает метода WorkSheets


 
clickmaker ©
 
(2011-06-01 12:20)
[5]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1273


 
OW ©
 
(2011-06-01 13:35)
[6]


> var
> e_app, AcS: Variant;
> begin
> e_app := CreateOleObject(«Excel.Application»);
> e_app.WorkBooks.Open(«D:программафаил.xls»);
AcS := e_app.WorkBooks.WorkSheets.Item[«3»];

> Edit1.Text := AcS.UsedRange.Rows.Count;
> Edit2.Text := AcS.UsedRange.Columns.Count+1;
>
> e_app.Quit;
> end;


 
OW ©
 
(2011-06-01 13:36)
[7]


> AcS := e_app.WorkBooks.WorkSheets.Item[3];


Like this post? Please share to your friends:
  • Delphi excel выделение ячейки
  • Delphi excel вставка формул
  • Delphi excel вставить ячейки
  • Delphi excel вставить картинку
  • Delphi excel все строки