Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

Английская версия 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 можно задавать только по-русски: Перечень цветов по-русски, которые можно задавать в формате: черный, красный, зеленый, синий, фиолетовый, желтый, белый. Список небогатый.

Читать еще:  Sql в excel

Формулы на листе

К счастью, работа со свойствами 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’е «Предварительный просмотр» — оба, и не работает! А как же должно работать?

Припоминая русификацию еще Excel’я 4-й версии, напишем русские эквиваленты:

Сработало! Ну, и теперь добавим распознавание русской версии:

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

Format codeРусский код форматированияОписание
&LВыравнивает последующие символы влево.
&C-«- по центру.
&R-«- вправо.
&EДвойное подчеркивание (double-underline) вкл. или выкл.
&XВерхний индекс (superscript) вкл. или выкл.
&YНижний индекс (subscript) вкл. или выкл.
&BЖирный (bold) вкл. или выкл.
&IНаклонный (italic) вкл. или выкл.
&UПодчеркнутый (underline) вкл. или выкл.
&SЗачеркнутый (strikethrough) вкл. или выкл.
&DТекущая дата.
&TТекущее время.
&FИмя документа (книги).
&AИмя листа.
&PНомер страницы.
&P+number&С+числоНомер страницы + указанное число.
&P-number&С-числоНомер страницы — указанное число.
&&&&Одиночный ampersand.
Печать указанным шрифтом [и начертанием] (не обязательно). Обязательно указывать в двойных кавычках.
&nn&nnПечать шрифтом указанного размера.
&NОбщее количество страниц.

И еще один опыт:

Работает! Т.е. начертания (Style у класса TFont в Delphi) шрифтов можно уверенно писать по-английски. Или заменить на коды форматирования:

Примечание:
для перевода строки в колонтитуле или ячейке используйте симол LF, ASCI код 10 (
#10 ):

Выводы

При работе с русским Excel’ем из Delphi необходимо соблюдать следующие правила:

  • при задании форматов использовать только русские форматы чисел и даты;
  • при цветном форматировании чисел указывать цвета только на русском языке;
  • при записи формул из вариантного массива использовать только русские формулы;
  • при создании колонтитулов использовать только русские коды форматирования;
  • для совместимости с английской версий необходимо проверять LC >Мне не удалось найти документацию, касающуюся моментов описанных выше. Весь материал построен чисто на собственном опыте. И еще: не было возможности проверить на полностью английских версиях Windows и Office.

Все примеры тестировались на Delphi 6, Delphi 7, на русских версиях WindowsXP + OfficeXP, Windows98SE + Office2000 SR?1.

Ссылка на основную публикацию
Adblock
detector