Delphi and excel copy

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

В прошлые раз мы с Вами остановились на сохранении рабочей книги. В принципе, ничего сложного в запуске 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
голоса

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

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

5 / 5 / 2

Регистрация: 04.10.2010

Сообщений: 205

1

24.06.2015, 22:14. Показов 13406. Ответов 3


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

Всем привет!
Не получается реализовать Cut и Copy (можно и для Range). Хочу на первом листе Excel выделить диапазон ячеек [A1:A10] и вставить его в [B3:B12], к примеру В сети смотрю примеры, но нужный не попадается.



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

25.06.2015, 11:44

2

Лучший ответ Сообщение было отмечено Пётр Нефедов как решение

Решение

Пример. Копирование диапазона «B3:C6» в диапазон «F5:G8».

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
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  exApp, exBook, exSh, exRng : OleVariant;
  Od : TOpenDialog;
begin
  //Диалог выбора файла.
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then //Начальная папка в диалоге выбора файла.
    Od.InitialDir := ExtractFilePath(ParamStr(0)); //Папка, в которой лежит исполняемый файл программы.
  if not Od.Execute then
    Exit;
  if not FileExists(Od.FileName) then
  begin
    MessageBox(Handle, 'Файл с указанным именем не найден. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Запуск экземпляра MS Excel и получение ссылки на интерфейс его корневого объекта 'Excel.Application'.
  exApp := CreateOleObject('Excel.Application');
  //Делаем видимым окно MS Excel.
  exApp.Visible := True;
  //Открытие рабочей книги и получение ссылки на её интерфейс.
  exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
  //Получаем ссылку на интерфейс первого рабочего листа в рабочей книге.
  exSh := exBook.WorkSheets[1];
 
  //Определяем копируемый диапазон. Пускай его адрес будет таким: 'B3:C6'.
  exRng := exSh.Range[exSh.Cells[3, 2], exSh.Cells[6, 3]]; //Или так: exRng := exSh.Range['B3:C6'];
  //Определяем место вставки - в виде верхней левой ячейки в области вставки.
  //Пускай это будет ячейка с адресом 'F5'.
  //Выполняем копирование и вставку.
  exRng.Copy(Destination:=exSh.Cells[5, 6]); //Или так: exRng.Copy(Destination:=exSh.Range['F5']);
 
  ShowMessage('Копирование выполнено.');
end;



0



Пётр Нефедов

5 / 5 / 2

Регистрация: 04.10.2010

Сообщений: 205

25.06.2015, 20:33

 [ТС]

3

Цитата
Сообщение от Mawrat
Посмотреть сообщение

Пример. Копирование диапазона «B3:C6» в диапазон «F5:G8».

Интересно, попробую)
Сделал до этого утром так:

Delphi
1
2
exApp.ActiveWorkBook.WorkSheets[1].Range['A1:A10'].Copy;
exApp.ActiveWorkBook.WorkSheets[1].Range['B5:B15'].PasteSpecial;



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

26.06.2015, 10:23

4

Лучший ответ Сообщение было отмечено Пётр Нефедов как решение

Решение

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

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
44
45
46
procedure TForm1.Button1Click(Sender: TObject);
const
  //Группа констант XlPastType.
  xlPasteValues = -4163; //Вставить только значения.
var
  exApp, exBook, exSh, exRng : OleVariant;
  Od : TOpenDialog;
begin
  //Диалог выбора файла.
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then //Начальная папка в диалоге выбора файла.
    Od.InitialDir := ExtractFilePath(ParamStr(0)); //Папка, в которой лежит исполняемый файл программы.
  if not Od.Execute then
    Exit;
  if not FileExists(Od.FileName) then
  begin
    MessageBox(Handle, 'Файл с указанным именем не найден. Действие отменено.',
      'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Запуск экземпляра MS Excel и получение ссылки на интерфейс его корневого объекта 'Excel.Application'.
  exApp := CreateOleObject('Excel.Application');
  //Делаем видимым окно MS Excel.
  exApp.Visible := True;
  //Открытие рабочей книги и получение ссылки на её интерфейс.
  exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
  //Получаем ссылку на интерфейс первого рабочего листа в рабочей книге.
  exSh := exBook.WorkSheets[1];
 
  //Определяем копируемый диапазон. Пускай его адрес будет таким: 'B3:C6'.
  exRng := exSh.Range[exSh.Cells[3, 2], exSh.Cells[6, 3]]; //Или так: exRng := exSh.Range['B3:C6'];
  //Определяем место вставки - в виде верхней левой ячейки в области вставки.
  //Пускай это будет ячейка с адресом 'F5'.
  //Выполняем копирование и специальную вставку - вставка только значений (Paste:=xlPasteValues).
  exRng.Copy;
  exSh.Cells[5, 6].PasteSpecial(Paste:=xlPasteValues); //Или так: exSh.Range['F5'].PastSpecial(Paste:=xlPasteValues);
  //Если копируемый участок большой, то при закрытии книги MS Excel может
  //вывести диалог с сообщением о том, что в буфере обмена имеется большой
  //блок данных, возможно - изображение.
  //Чтобы этого избежать, можно заменить данные в буфере обмена путём копирования
  //небольшого объёма данных - например, данных одной ячейки. Например, так:
  exSh.Cells[1, 1].Copy;
 
  ShowMessage('Копирование выполнено.');
end;



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.06.2015, 10:23

Помогаю со студенческими работами здесь

Скопировать вставить диапазон
Здравствуйте.
Подскажите пожалуйста почему не работает вставка. Copy работает, выбрав уже мышью…

Как скопировать, удалить, вырезать или вставить файл?
Как скопировать, удалить, вырезать или вставить файл в VB.net

Как вставить, скопировать, вырезать текст в консольном приложении?
Я знаю, что это как бы большой скачок назад после WPF и WinForms, но всё же, понадобилось.

Как…

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

Мне нужно скопировать диапазон ячеек с Лист1 на Лист2 при…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

4

>
Copy&Paste в Excel средствами Delphi
, Не пойму, я копирую данные или нет?.. И вообще..

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
19.05.08, 10:15

    Здрасте!
    Я хочу скопировать строку таблицы Excel с первого листа и перенести ее на другой лист.
    Но я не пойму, что происходит когда ставлю метод «Copy» :

    ExpandedWrap disabled

      procedure TForm1.oleWordOpen();

       var

           exelPath:olevariant; // путь к документу Excel.

           exel,elist,elist2:variant;

      begin

      exelPath:=’D:2008.xls’;

       try

       exel:=CreateOleObject(‘Excel.Application’);

       exel.workbooks.open(exelPath);

       elist:=exel.workbooks[1].worksheets[‘Лист1’];//первый лист

       elist2:=exel.workbooks[1].worksheets[‘Лист2’];//Второй лист

       exel.visible:=true;

       exel.DisplayAlerts:=false;

      except

           ShowMessage(‘Невозможно открыть приложение Excel’);

           exit;

       end;

      elist.rows[3].select;

      {********************************}

      {Вот здесь непойму, что я сделал?}

      {Я чего нибудь скопировал?       }

      {********************************}

       elist.rows[3].copy;

      end.

    Если скопировал строку, то как с ней дальше обращаться?
    Я могу активировать второй лист книги, могу выделить в нем строку или ячейку:

    ExpandedWrap disabled

       elist2.Activate;

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

      elist2.range[‘A4’].select;

      // или

      // выделяется 4 строка

       elist2.rows[4].select;

    Но как всю строку из «Лист1» перенести в «Лист2» незнаю. Уже 3 день мучаюсь… В Excele -самом, макрос написал, все работает, но его методы здесь не проходят практически:

    ExpandedWrap disabled

      Rows(«16:16»).Select

          Selection.Copy

          Sheets(«Лист2»).Select

          Rows(«1:1»).Select

          ActiveSheet.Paste

    В инете по моему случаю мне ничего найти не удалось… :(


    adem



    Сообщ.
    #2

    ,
    19.05.08, 14:48

      Junior

      *

      Рейтинг (т): 2

      Лень это в Delphi проверить, но примерно так:

      ExpandedWrap disabled

        exel.workbooks[1].worksheets[‘Лист1’].Rows[‘1:1’].Copy;

        exel.workbooks[1].worksheets[‘Лист2’].Rows[‘1:1’].Paste;

      Сообщение отредактировано: adem — 19.05.08, 14:48

      Profi

      uborshik



      Сообщ.
      #3

      ,
      19.05.08, 16:09

        adem:

        Цитата

        ‘Method Paste’ not supported by automation object.//Однако..
        (process stopped.Use Step or Ран, //но нафик уже это надо, в моем положении :( …)

        Вот я не могу понять что надо сделать, что б поддерживался метод «Paste» :( , «Copy» то поддерживает …
        Наверняка, что-то есть. Раз Бейсик это может, то почему бы это невмочь Делфи?

        В данный момент, я смог добиться, что бы «програмка» смогла «поячеечно» копировать и вставлять в другой лист, т.е.
        циклом перебирать строку и каждую ячейку копировать в другой лист.
        Хотелось бы обойтись без этого гемороя, но чуствую придется, потому как еще больше вопросов с копированием целой строки предвидится: Там в строке попадаюстся ячейки с датами, а обычным, моим написанным методом, типа, как я хочу сделать, даты выводятся ввиде десятичного числа (или как там это число, типа, 39544 называется) и надо его переводить в «формат времени», если бы получилось моя идея «копи&паста» всей строки, то результат бы был очень странным и не устроит мое начальство, однозначно(хотело видеть,допустим 01.01.2008, а видит, типа, 36789). А «поячеечно», я хотя бы могу контролировать ячейки с датами.
        Наверняка есть способ и эту «занозу» обойти, но у меня знаний маловато :(

        Но все-таки «оч хочеца» узнать, а можно ли целыми строками манипулировать при работе Delphi-Excel …

        Сообщение отредактировано: uborshik — 19.05.08, 16:11

        Profi

        uborshik



        Сообщ.
        #4

        ,
        20.05.08, 08:50

          Все получилось.
          Проанализировав код VB (первый пост), пришел к выводу, что обращаться к методу Paste «от имени» rows (или range), в том виде как я хотел, нельзя.
          Короче вот с такой концовкой, написанного в первом посте кода, все работает:

          ExpandedWrap disabled

            ……………..

            elist.rows[3].select;

            elist2.Activate;

            elist2.rows[‘1:1’].select;

            exel.activeSheet.paste; // exel:=CreateOleObject(‘Excel.Application’);

            end.

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • Delphi: Система, Windows API
          • Следующая тема

          [ Script execution time: 0,0246 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

          Содержание

          1. Excel Copy-Paste from Delphi (OLE) with all the formatting?
          2. Загрузка данных из Excel в Delphi StringGrid или массив
          3. Copy and paste (Delphi)
          4. Overview
          5. Excel в Delphi. Методы объекта WorkSheet (лист).
          6. План статьи:
          7. 1. Объекты Microsoft Excel
          8. 2. Как активировать лист рабочей книги Excel?
          9. 3. Методы листа книги Excel
          10. Метод Calculate
          11. Метод CheckSpelling
          12. Метод SaveAs

          Excel Copy-Paste from Delphi (OLE) with all the formatting?

          I have Excel file (old *.xls format, but that should be irrelevant here) with very complex formatting and data: differently merged cells, cells/ranges with custom backgrounds, fonts and so on. And I am trying programmatically copy/paste rectangular region from on file to other. I am using Delphi (2009, but that should be irrelevant as well), I am using OLE code and Excel_TLB. I have the following code:

          The problem is that my special past is always bad. Sometimes just picture is captured in pasted into new Excel file. Other times nothing happens and just the range is selected in the target Excel, sometimes all the data and some formatting is copied, but the formatting is very strange: gray background colors has been converted to blue colors and the column width/cell height has been lost. I have left some code that I have tried, but still I am searching for the code that can work.

          Is this all dependant on my Excelt_TLB? And what happens if I am generating Excel_TLB from the most up-to-date Excel version and I am including it in my project, but the program is used on the computer with the previous versions of Excel?

          I have also encountered the following erros while experimenting:

          https://learn.microsoft.com/en-us/office/vba/api/excel.worksheet.pastespecial mentions that PasteSpecial on worksheet always pastes as picture, so, that function is not suitable for me. But the configuration structure for the Range.PasteSpecial https://learn.microsoft.com/en-us/office/vba/api/excel.xlpastetype is far more rich than I have in Excel_TLB. My TLB has notes:

          Maybe it is a bit old? But I am afraid to generate new Excelt_TLB as I can loose compatibility with the legacy versions of Excel.

          Well, I don’t need the most up-to-date Excel_TLB, because I can use Integer constants instead of named constants that are defined in the latest Excel_TLB only, so — I can call code:

          But it is still of no value — hyperlink to the original cells are pasted in the new Excel. So — this is not solution as well.

          I repeated this sequence of copy-paste manually and recorded VB macro — this macro is exactly the Delphi code which I am trying to run:

          Источник

          Загрузка данных из Excel в Delphi StringGrid или массив

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

          В данной статье рассматривается один из наиболее удобных способов работы с подгружаемыми из Excel данными. Значения всех ячеек страницы Excel вносятся в двумерный массив типа Variant. Затем с этим массивом уже можно работать любыми привычными способами.

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

          * Метод SpecialCells используется для выделения определенных ячеек на основании оценки их содержимого или других характеристик. Применяемое здесь значение параметра-константы xlCellTypeLastCell указывает методу выделить последнюю ячейку используемого диапазона, т.е. саму нижнюю правую ячейку в диапазоне, где введено хоть какое-то значение. Это позволяет копировать не все ячейки листа, а лишь диапазон, содержащий какие-либо данные.

          Для использования команд работы с OLE-объектами для этого кода нужно добавить библиотеку:

          После указанных операций данные введены в массив, из которого их можно перенести в компонент StringGrid или использовать их по своему усмотрению. Стоит заметить, что в полученном таким образом массиве данные индексы располагаются в следующем порядке: [номер строки, номер столбца]. Это видно из следующего примера вывода данных массива в компонент StringGrid.

          Источник

          Copy and paste (Delphi)

          This demo is available in your FlexCel installation at DemoDelphiModules10.API40.Copy And Paste and also at https:​//​github.​com/​tmssoftware/​TMS-​FlexCel.​VCL-​demos/​tree/​master/​Delphi/​Modules/​10.​API/​40.​Copy And Paste

          Overview

          ExcelFile has a group of methods allowing you to copy/paste from/to FlexCel to/from Excel in native Excel format. All methods copy and paste the data on BIFF8 and Tabbed-Text format, to allow for copying/pasting from other sources besides Excel.

          Copying and pasting in native BIFF8 format is a great advance over copying/pasting on plain text only. It allows you to keep cell formats/colors/rounding decimals/merged cells/etc. It allows a new world of interoperation between your applications and Excel. Your users will be able to interchange data back and forward between your application and Excel just by copying and pasting. But keep in mind that it has its limitations too:

          It can’t copy/paste images

          It can’t copy/paste strings longer than 255 characters

          It can’t copy the data on multiple sheets.

          I would like to say that these limitations are not FlexCel’s fault. The BIFF8 specification is correctly implemented, those are limitations on Excel’s part.

          Of course, Excel can copy and paste everything without problems, but this is so because Excel doesn’t use the clipboard to do the operation. If you close all instances of Excel, open a Worksheet, copy some cells to the clipboard, close Excel and open it again you will run into the same limitations. Copy/paste limitations on Excel don’t show when it is kept in memory.

          Источник

          Excel в Delphi. Методы объекта WorkSheet (лист).

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

          План статьи:

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

          1. Объекты Microsoft Excel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          Метод Calculate

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

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

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

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

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

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

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

          Метод CheckSpelling

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

          При этом в качестве 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?

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

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

          Метод SaveAs

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

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

          Параметр Тип Описание
          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?

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

          Если Вам необходимо сохранить файл 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 в различных форматах:

          Источник

           
          s_t_d
           
          (2010-02-03 12:44)
          [0]

          Уважаемые Мастера, если можно, пожалуйста подскажите. При работе приложения необходимо вывести результаты в Excel. Простейшим манипуляциям с MS_Excel (создать приложение, открыть/закрыть книгу, занести данные в ячейку) я научился.  Но вот потребовальсь в открытой раб.книге создать копию раб.листа. И вот это не получается. Макрорекодер MS_Excel пишет: »  Sheets(«Лист1»).Select    Sheets(«Лист1»).Copy After:=Sheets(3)   «… Попытка интерпретировать это в Delphi так:
           v.Workbooks[wb].Worksheets[ws].Select;
           v.Workbooks[wb].Worksheets[ws].Copy;
          к успеху не привела… Пожалуйста посоветуйте, как быть.


           
          12 ©
           
          (2010-02-03 13:06)
          [1]

          еще раз вставить на другой лист?


           
          oldman ©
           
          (2010-02-03 13:13)
          [2]


          >  v.Workbooks[wb].Worksheets[ws].Select;
          >  v.Workbooks[wb].Worksheets[ws].Copy;

          А где Paste?


           
          oldman ©
           
          (2010-02-03 13:21)
          [3]


          > Макрорекодер MS_Excel пишет: »  Sheets(«Лист1»).Select  
          >   Sheets(«Лист1»).Copy After:=Sheets(3)  

          Мне пишет:

          Sheets(«Лист1»).Select
          Cells.Select
          Selection.Copy
          Sheets.Add
          Cells.Select
          ActiveSheet.Paste


           
          s_t_d
           
          (2010-02-03 19:54)
          [4]

          >oldman ©   (03.02.10 13:13) [2]
          Видимо, плохо сформулировал вопрос…Но речь идет именно о СОЗДАНИИ КОПИИ раб.листа (это шаблон документа), а не о записи одних и тех же данных на разные листы…


           
          s_t_d
           
          (2010-02-03 21:43)
          [5]

          Добился. Вот так получилось.
           v.Workbooks[wb].Worksheets[ws].Select;
           v.Workbooks[wb].Worksheets[ws].Copy(After:=v.Workbooks[wb].Worksheets[ws]);
            где wb — имя книги, ws — имя копируемого листа


          Понравилась статья? Поделить с друзьями:
        • Delphi adoquery в excel
        • Delete the wrong word in each of the pairs of italics
        • Delphi ado and excel
        • Delete the table in word
        • Delete the comments in excel