Delphi excel numberformat
Delphi excel numberformat
Программой Delphi создаю отчет в Excel. Необходимо отформатировать ячейку. Макрос Basic выглядит следующим образом:
Selection.NumberFormat = «#,##0.00_р_.»
Подскажите, пожалуйста, как эта команда будет в Delphi?
← →
fishka ( 2002-01-10 15:31 ) [1]
Ну, очень хочется получить ответ. Неужели никто не делает отчеты в Excel и не форматирует ячейки?
← →
Mambet ( 2002-01-11 06:42 ) [2]
var Excel : Variant;
.
Excel := GetActiveOLEObject(«Excel.Application»);
Excel.ActiveSheet.cells[x,y].NumberFormat :=
«0»+DecimalSeparator+»0″;
← →
fishka ( 2002-01-14 09:52 ) [3]
Спасибо за совет, но не получается.
Выдается ошибка:
БНельзя установить свойство NumberFormat класса Range.
Как правильно написать? x,y — это целые числа?
← →
Сергей Иванов ( 2002-01-14 12:45 ) [4]
x, y — это OleVariant
← →
MetallAdm ( 2002-01-14 13:21 ) [5]
var
XL, XArr: Variant;
i : Integer;
j : Integer;
fname,st1:String;
xf:String;
yf:String;
a,b,c:String;
tshor:String;
begin
XArr:=VarArrayCreate([1,10],varVariant);
XL:=CreateOLEObject(«Excel.Application»);
XL.WorkBooks.add;
XL.visible:=true;
j:=2;
XL.Range[«C»+IntToStr(j),CHR(64+10)+IntToStrj)].Value := XArr; — Пихаю текст в выделенный участок можно выделить и столбец
допустим у меня есть уже текст в ентом месте
я его выделяю
XL.Range[«B»+IntToStr(j),CHR(64+10)+IntToStr(j)].Select;
XL.Selection.Font.Bold := True;
XL.Selection.Interior.ColorIndex := 16;
и макросом меняю цвет фона и делаю шрифт жирным
непонятно будет пиши на мыло :))
← →
MetallAdm ( 2002-01-14 13:28 ) [6]
Сорри забыл мыло указать
postmaster@ether.chelny.ru
← →
MetallAdm ( 2002-01-14 13:45 ) [7]
А если конкретней !
XL.Range[«A1″,»B2»].Select;
Выделяется ента облась
и Выделенную область меняешь
XL.Selection.NumberFormat := «0.00»; если числовой 0.00;
XL.Selection.NumberFormat := «#,##0.00$»; если денежный 0.00р
я думаю что понятно и просто
← →
fishka ( 2002-01-14 13:57 ) [8]
Delphi excel numberformat
Написанное приложение, прекрасно работающие с Excel’ем на собственном компьютере, часто, после переноса приложения на другой компьютер, оказывается неработоспособным! Отчего так происходит? В этой статья я собираюсь описать разницу в работе русской версии Excel’я из VBA и через COM интерфейс (библиотеку типов, TLB) из Delphi. Почему возникли расхождения? Ответа на эти вопросы у Microsoft я не нашел…
Примечание:
сравнивались только русская и английская (American English) версии Excel с номером версии 9.0 (MS Office 2000) и выше. Другие версии не рассматривались.
Описание типов объектов, применяемых в примерах:
Используемые в примерах » дополнительные » модули:
OleServer, Excel2000, Office2000 из стандартной поставки Delphi Enterprise версии 6 и выше.
У вас русская версия Excel?
Определить наличие русской версии Excel возможно так:
Английская версия Excel (English United States) вернет 1033 (или $0409), немецкая (German Standard) — $0407. Значения соответствуют LC >msoLanguageIDUI находится в модуле Office2000.pas и описана так:
Примечание:
в Office97 свойство LanguageSettings отсутствует
Далее мы рассмотрим приемы работы с » русским » Excel’ем.
Работа со свойством объекта Range NumberFormat
NumberFormat и NumberFormatLocal четко работают в VBA и полностью соответствуют своему содержанию в названиях, но только не при работе из Delphi. В Excel2000.pas (D7) они описаны как
Но, при попытке записи форматов из Delphi, выясняется, что NumberFormat и NumberFormatLocal ведут себя идентично, причем NumberFormat соответствует NumberFormatLocal (лучше было бы наоборот :). Т.е. в русской версии все форматы нужно писать «по-русски» (можно прямо в NumberFormat, в VBA — нельзя).
Формат даты
Код на VBA (эталон):
Формат чисел. Разделители. (DecimalSeparator, ThousendSeparator)
И это еще не все! Заходим в настройки Excel’я «Сервис/Параметры» переходим на закладку «Международные» и видим опять «Разделитель целой и дробной части», «Разделитель разрядов» и чекбокс «Использовать системные разделители». Т.е. использование системных разделителей не может гарантировать правильного применения при форматировании чисел в Excel’е. Решение: использовать свойство ExcelApplication.International (о нем дальше). Причем, даже при установленном свойстве ExcelApplication.UseSystemSeparators = False и отличных от системных ExcelApplication.DecimalSeparator и ExcelApplication.ThousandsSeparator, ExcelApplication.International отработает корректно.
Далее рассмотрим примеры работы (или не работы), приняв «стандартные» настройки для русских Windows:
Код на VBA (эталон):
Примечание:
в примерах значения записываются в Value2 для предотвращения форматирования «на лету» самим Excel’ем. Так число 123.45, записанное в Value будет автоматически отформатировано Excel’ем в формат валюты, а присвоение Value = Date будет автоматически переведено в формат даты. Запись в Value2 «воспринимает» значение как Double. Подробнее смотрите в справке VBA для Excel’я.
Решения (с использованием ExcelApplication.International):
Для получения формата даты можно написать функцию:
Для формата валюты:
Тот же принцип можно применить к времени и другим типам. Также смотрите другие индексы для свойства International (их там много) в справке VBA. Например, получить «основной» (general) формат можно так:
установить основной формат еще можно установить, записав в NumberFormat «пустую» строку, т.е. указать, что нет форматирования для чисел (даты):
Цвет в формате
К сожалению, не лучше обстоит дело и с цветом в форматах. Т.е. цвет в Delphi можно задавать только по-русски: Перечень цветов по-русски, которые можно задавать в формате: черный, красный, зеленый, синий, фиолетовый, желтый, белый. Список небогатый.
Формулы на листе
К счастью, работа со свойствами Formula и FormulaLocal в VBA и Delphi идентична и соответствуют своим названиям. Хочется отметить только один нюанс (это, кстати, действительно и для VBA) — при написании «русских» формул нужно учитывать системную переменную ListSeparator. Так, если на другом компьютере пользователь изменит его со стандартного для русской версии Windows символа «;» на «,» (например, как это делаю я :), то присвоение Range.FormulaLocal := ‘=округл(A1*B1; 2)’; вызовет ошибку! Поэтому, с учетом «разделителя элементов списка» нужно писать так:
Здесь приятней и проще пользоваться английскими формулами. Но, иногда, существует необходимость писать формулы из вариантного массива…
Примечание:
системные переменные ListSeparator, DateSeparator описаны в модуле System.
Запись формул из Variant-ного массива
Запись в свойство Formula, FormulaLocal, Value, Value2 из Variant-ного массива идентична в русском Excel’е и при работе из Delphi. Но, если мы хотим вставлять формулы прямо из массива, все они должны быть только русскими! Вот здесь то и всплывает необходимость определения наличия русской версии Excel’я (впрочем, это уже касалось задания цвета в свойстве NumberFormat).
Код на Delphi (тут мы применим знание написания русских формул, описанный выше, а именно ListSeparator):
Примечание:
из примера видно, что при записи из Variant-ного массива в Formula, FormulaLocal, Value, Value2 не имеет значения, какой стиль ссылок используется: A1 и R1C1 работают идентично. Но это не относится к свойствам FormulaR1C1 и FormulaR1C1Local, которые принимают формулы ТОЛЬКО в стиле R1C1.
Создание колонтитулов
Давайте запустим запись макроса создания колонтитула (меню в Excel «Сервис/Макрос/Начать запись…» ). Теперь откроем параметры страницы (меню «Файл/Параметры страницы…»). Создадим центральный нижний колонтитул «Лист &[Страница] из &[Страниц]» шрифтом «Arial», «полужирный» и размером 8pt. Слова «Лист» и «из» с начертанием «обычный». После «сокращения» макроса получим:
Т.е. при выводе на печать мы хотим, чтоб в нижний колонтитул по центру выводился текст, к примеру «Лист 1 из 5» .
Примечание:
если вы хотите увидеть работу вашего макроса в действии (чтоб работал PrintPreview), обязательно внесите на лист хоть какие-нибудь данные.
Вроде бы все ясно, осталось только переписать его под Delphi:
Проверяем в Excel’е «Предварительный просмотр» — оба, и не работает! А как же должно работать?
Припоминая русификацию еще Excel’я 4-й версии, напишем русские эквиваленты:
Сработало! Ну, и теперь добавим распознавание русской версии:
Вывод: при вставке кодов форматирования из Delphi в русский Excel должны вставляться только русские коды форматирования. А где их взять? Вот список кодов форматирования, полученных методом пробы:
|
И еще один опыт:
Работает! Т.е. начертания (Style у класса TFont в Delphi) шрифтов можно уверенно писать по-английски. Или заменить на коды форматирования:
Примечание:
для перевода строки в колонтитуле или ячейке используйте симол LF, ASCI код 10 (
#10 ):
Выводы
При работе с русским Excel’ем из Delphi необходимо соблюдать следующие правила:
- при задании форматов использовать только русские форматы чисел и даты;
- при цветном форматировании чисел указывать цвета только на русском языке;
- при записи формул из вариантного массива использовать только русские формулы;
- при создании колонтитулов использовать только русские коды форматирования;
- для совместимости с английской версий необходимо проверять LC >Мне не удалось найти документацию, касающуюся моментов описанных выше. Весь материал построен чисто на собственном опыте. И еще: не было возможности проверить на полностью английских версиях Windows и Office.
Все примеры тестировались на Delphi 6, Delphi 7, на русских версиях WindowsXP + OfficeXP, Windows98SE + Office2000 SR?1.