Delphi excel подчеркнуть текст

Обновлено: 05.07.2024

Выручите пжлста.
Как реализовать частичное подчеркивание (например с 6-го по 10-ый символы), если в ячейке содержится не текст, а формула (например ="Итого: "&CуммаПрописью(А1))
ps. Сломали 3 головы уже парвой кнопкой по ярлыку листа
исходный текст
вставьте в модуль листа этот 41001804815208 - ЮMoney бывш.Яндекс-кошелек благодарности за удачные советы и решения можно отправлять прямо сюда)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Насколько я понял это макрос выполняющийся при изменении значения в ячейке А5. Если в ячейку вписывать текст, то работает, а если формулу или числовое значение, то нифига. :`( Такой подход я уже пробовал.
Проблема в том, что если в ячейке формула и Start > 1, то подчеркивание не выполняется. Если Start=1, то не важно чему равен Length - подчеркивается всё содержимое ячейки.
Единственное до чего я добыдлокодился, это
1.копирование значения из исходной ячейки во временную
2.выполнение подчеркивания по нужным параметрам
3.Копирование значения временной ячейки в исходную с сохранением форматирования (Copy-PasteSpecial)
4.Очистка временной ячейки.
Но этот вариант совсем не айс, ибо формула в исходной ячейке теряется.

зы. Может возможно создать такой формат ячейки, который будет выводит значение в ячейке с частичным подчеркиванием? Есть ли в Excel что-то вроде HTML тэгов?

Последний раз редактировалось AesmaDiv; 04.12.2010 в 16:08 .

Кароче пришел к выводу что это таки невозможно. Решил выйти из положения следующим образом:
Есть три ячейки - А1,А2 и А3
В ячейке А1 находится числовое значение (123)
В ячейке А2 находится формула (="Итого: "&СуммаПрописью(А1)), формат ячейки (" ;;;"), т.е. текст скрыт.
В ячейку А3 выводится текст посредством выполнения макроса:

Макрос завязан на изменение ячейки А2 (Спасибо IgorGO), с условием соответствия формата ячейки. Решил обойтись без привязки к адресам ибо адреса могут быть разные и каждый раз лезть в код. ну вы понели.
В результате ячейка А3 отображает - Итого: Сто двадцать три
Однако, каждый раз при изменении значения в А1, нужно щелкать по А2. Не фонтан. Вопрос:

1. Как можно привязать макрос к конкретной ячейке без указания адреса?
2. Как распространить действие этого макроса на всю книгу?

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

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

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

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

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


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

Изменение свойств текста
Всё это можно применять как к отдельным ячейкам, так и к группам ячеек, строк, столбцов и т.п. Я буду показывать примеры на Ap.Cells. но Вам никто не мешает использовать Ap.Range['D5'], Ap.Range['A2:E8'], Ap.Columns['B:F'] и т.п.
Наверное, вы обращали внимание, что в новом документе появляются 3 листа (их список отображается внизу программы Excel). По умолчанию, мы работаем с активным листом (сразу после создания это первый лист). Но при желании, мы можем использовать и другие листы. Доступ к ним осуществляется с помощью Worksheets[<номер листа>]. Обратите внимание, что нумеруются они начиная с 1 (а не с 0, как привыкли все программисты).
Ниже приведён более полный список размеров бумаги из модуля ExcelXP:

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

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

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

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

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

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

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

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

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

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

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

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


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


Существует ли инструкция по размещению проекта Delphi на GitHub?
После создания репозитория непонятно, что делать.

Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi
Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi?

Использование БД в Delphi
Привет. Возникла необходимость подключить базу данных к Delphi для хранения вычислений полученных в.

Использование Interop Excel
Добрый день! Есть приложение, которое должно вносить определенные изменения в Excel файл. .

Использование case Delphi
имеется код Case Combobox1.itemIndex of 0:begin Edit1.Clear; Form_login.Visible:=false;.


Использование stringgrid-Delphi
Дан массив А размера N. Сформировать два новых массива В и С: в массив В записать все положительные.

Использование интерфейсов из С++ в Delphi
Здравствуйте. Пытаюсь прикрутить Steamworks API напрямую к делфи, и возникла проблема. Функция.




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

Для полноты картины нужно еще описать способ быстрого форматирования ячеек и показать скорость работы XLSReadWrite
Я для своих задач использую XML SpreadSheet. С радостью пересел бы на что-то иное.

Bogdan , вынеси на форуме просьбу о создании подобного раздела. Если Влад одобрит, то создаст. Можно пообсуждать конечно, в плане даже проверенных, рабочих дистрибутивов, общих вопросов, того-же FireMonkey и т.д. У меня есть пара дистрибутивов, но все руки не доходили, вечерком сегодня попробую, если инстол пройдет нормально, обязательно отпишусь с сылками от куда их брал.

Влад, надеюсь до конца дня скачаешь и отпишешься, ну или хотябы завтра, а скорость у тебя, относительно моей вообще в 3 раза выше ) думаю до завтра точно осилишь оставшиеся 20 % )

// Да прибудет с тобой сила, Влад!

Алекс, это переменная типа Variant

Чтение данных из Excel

ExcelApp.Workbooks.Open(edFile.Text); почему ругается наэту функцию?

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

Я работаю с БД FireBird и экспортирую из рекордсета. и если там попадаются русские буквы, то он не пишет в ячейку вообще ничего

Спасибо за информацию. Вы очень мне помогли.

Рекомендуемая библиотека XLSReadWrite стоит 295 евро. Я как-то не готов пока к такой покупке.
Посоветуйте более доступные аналоги пожалуйста.

Как прочитать из документа EXCEL колонку, содержащую рисунок со штрих кодом, чтобы он прочитался как 13 цифр

Здравствуйте, Владислав. Честно говоря, я-не программист, но уж очень хочется для себя постичь эту тему. Много времени провожу в Вашем блоге, но пока получается стряпать только методом копи-паста. На данный момент работаю над программой, объединяющей данные из 2х документов типа Exele. Задача состоит в том чтоб открыть 2 документа, стартовать с определенной ячейки второго документа, получив ее значение, искать его в первом документе. Оба состоят из длинного списка на одном листе. Т.к. только начинаю программировать, выбрал способ по одной ячейке- скорость не особо важна. Но вот незадача- получив значение из второго документа, не пойму как активировать первый и искать в … Подробнее »

Работа с EXCEL из Delphi.


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

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

Работать будем через модуль ComObj, для этого в uses необходимо добавить модуль ComObj и модуль Excel_TLB (для MS Excel 2007).

Uses ……, ComObj, Excel_TLB;

Модуль Excel_TLB содержит необходимые константы для работы с Excel, его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel они разные.
Внимание. Модуль Excel_TLB в других версиях MS Excel может называться по другому. Перед подключением модуля Excel_TLB, необходимо импортировать библиотеку Excel. Для этого выберите Component->Import Component->Import a Type Library-> находим MS Excel и следуем инструкциям.


В разделе описания переменных мы должны описать переменную типа Variant или OleVariant для подключения интерфейса Excel. Я описал переменную excel.

Form1: TForm1;
excel : variant; // Переменная в которой создаётся объект EXCEL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Работа с EXCEL из Delphi.

Работа с EXCEL из Delphi.

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

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

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

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

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