Remkomplekty.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
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’ем на собственном компьютере, часто, после переноса приложения на другой компьютер, оказывается неработоспособным! Отчего так происходит? В этой статья я собираюсь описать разницу в работе русской версии 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. Значения соответствуют LCID, описанным в MS SDK Help «Language Identifiers». LCID интерфейса пользователя и файла Excel.exe файла может быть неодинаковым (например, после установки MUI). Константа 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)

Почитайте «диалог» на Круглом столе http://www.delphikingdom.com/asp/answer.asp?IDAnswer=15340 — вроде бы все понятно («а все и делов то в запятой»)! А нет, не все! В «International» (в русском «Язык и стандарты») можно установить любые DecimalSeparator и ThousandsSeparator, отличные от принятых по-умолчанию фирмой Microsoft для русской версии Windows. Я, например, всегда меняю принятые по-умолчанию десятичную точку «,» на «.» и разделитель тысяч с » » (пробел) на «‘» (апостроф, как в калькуляторе). Так формат «# ##0,00» у меня работать не будет.

И это еще не все! Заходим в настройки 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):

Читать еще:  Vba excel формат даты

Для получения формата даты можно написать функцию:

Для формата валюты:

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

Delphi excel numberformat

Шустрый

Профиль
Группа: Участник
Сообщений: 103
Регистрация: 22.9.2004
Где: Махачкала

Репутация: нет
Всего: нет

У меня такая проблема: при попытке через Дельфи установить свойство Range.NumberFormat Excel ругается, что нельзя этого делать!

Почему-то, при присвоении Range[some].Value := FloatToStr(somereal); в некоторых случаях Excel игнорирует запятую, разделяющую целую и дробную части. Поэтому я и хочу сначала установить формат ячеек в числовой, потом присваивать вещественные значения.

Шустрый

Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: нет
Всего: 2

Посмотри, на основе типа данных из Query, задаётся тип ячейки Excel

DataModule1.Query1.First;
repeat
i:=i+1;
for j:=0 to MyCol.Count-1 do
case DataModule1.Query1.FieldByName(MyCol.Strings[j]).DataType of
ftFloat:
begin
Excel.ActiveWorkBook.ActiveSheet.cells(i,j+1):=DataModule1.Query1.FieldByName(MyCol.Strings[j]).AsFloat;
end;
ftCurrency :
begin
Excel.range[Excel.Cells[i, j+1], Excel.Cells[i, j+1]].NumberFormat:= ‘# ##0,0000Ё.’ ;
Excel.ActiveWorkBook.ActiveSheet.cells(i,j+1):=DataModule1.Query1.FieldByName(MyCol.Strings[j]).Value
end
else
Excel.ActiveWorkBook.ActiveSheet.cells(i,j+1):=DataModule1.Query1.FieldByName(MyCol.Strings[j]).AsString;
end;
DataModule1.Query1.Next;
until DataModule1.Query1.Eof; >

Это сообщение отредактировал(а) DimassS — 10.5.2006, 02:52

Excel в Delphi. Свойства объекта WorkSheet.

Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.

Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:

  1. Cells — ячейки
  2. Columns — столбцы
  3. Name — название листа
  4. Range — диапазон ячеек
  5. Rows — сроки
  6. StandartHeight — высота строк «по умолчанию»
  7. StandartWidth — ширина столбцов «по умолчанию»
  8. UsedRange — задействованный диапазон ячеек
  9. Comments — комментарии
Читать еще:  Перебор ячеек в excel vba

Всего у листа рабочей книги Excel насчитывается 54 различных свойств, но, как показвает практика, для использования Excel в Dephi достаточно 9-15 различных свойств листа, чтобы получить необходимый результат, обеспечивающий удобство и наглядность представляемых данных.

Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi.

1. Свойство Cells

Возвращает объект диапазона, который представляет собой все ячейки на листе (а не только клетки, которые используются в настоящее время)

Однако использование свойства Cells возможно (и более практично) в другом виде. Вы можете указать сразу за словом Cells номера столбца и строки и, таким образом, получить доступ к конкретной ячейке листа. Например, забегая немного вперед, посмотрим, как можно удалить формулы из ячейки:

Выполнив такую операцию Вы удалите из ячейки С5 формулу (или любое другое содержимое). Как можно заметить, в отличие от работы с таблицами StringGrid Delphi, здесь вначале указывается номер строки, а затем номер столбца (у String Grid напротив — сначала указывается номер столбца, а затем номер строки).

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

Ну, а чтобы показать использование этого свойства на примере, давайте напишем простенькую процедуру копирования таблицы StringGrid в любую область листа Worksheet Excel.

Здесь в качестве параметров процедуры необходимо задать: номера первого столбца (FirstCol) и первой строки (FirstRow) на листе Excel, начиная с которых необходимо копировать данные из таблицы StringGrid (Grid). Заметьте, что вызов свойств Cells у StringGrid и WorkSheet происходит по-разному (см. индексы ячейки).

Естественно, что представленная процедура может с легкостью применяться при копировании небольших таблиц. Однако при импорте больших объемов данных в Excel эта процедура будет очень сильно тормозить работы основной программы. Более скоростной способ импорта данных из Excel в Delphi и наоборот мы рассмотрим позже, при рассмотрении объекта Range.

2. Свойство Columns

Возвращает объект диапазона, который представляет собой все столбцы на активном листе. Если активный документ не является листом (а, например, диаграммой), то вызов свойства Columns приводит к исключительной ситуации.

Это свойство удобно использовать при редактировании столбцов данных. Например вот так:

Вы сможете изменить шрифт в столбце А на полужирный. Также Вы можете изменять внешний вид столбцов, перерисовывать границы ячеек и т.д.

3. Свойство Name

С этим свойством мы уже сталкивались. Свойство Name возвращает имя рабочего листа книги.

Так мы изменили имя текущего активного листа Excel. Кроме этого, свойство Name удобо использовать при поиске необходимого листа.

4. Свойство Range

Возвращает объект, представляющий собой одну ячейку или диапазон ячеек.

Так, мы получили доступ к ячейке А1 и записали в неё текст. А следующий фрагмент кода демонстрирует быстрый способ экспорта данных из листа Excel в Delphi:

Так, мы за одно обращение к листу считали столбец данных и в дальнейшем, не используя напрямую объект WorkSheet, обработали все данные в вариантном массиве Numbers. Этот способ чтения данных с листа Excel является наиболее скоростным из всех известных мне в настоящее время. Если знаете способ более скоростной — буду очень рад, если поделитесь им.

5. Свойство Rows

Это свойство аналогично свойству Columns, но в отличие от него, возвращает объект, представляющий собой строку листа. С помощью этого свойства Вы также можете изменять внешний вид ячеек листа, изменять шрифт и т.д.

6. Свойства StandartHeight и StandartWidth

Эти свойства позволяют получить значения высоты и ширины ячеек листа «по умолчанию». Свойство доступно только для чтения, т.е. вызов:

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

7. Свойство UsedRange

Возвращает диапазон занятых ячеек листа. Свойство очень удобно использовать, когда необходимо узнать количество занятых строк и столбцов на листе:

и далее, используя эти данные быстро прочитать весь занятый диапазон в вариантный массив для дальнейшей обработки.

8. Свойство Comments

Это свойство возвращает коллекцию комментариев на листе.

удалит второй комментарий из коллекции, а:

добавит в ячейку е5 новый комментарий.

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

Читать еще:  Как вставить промежуточные итоги в excel

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

forum.clarionlife.net

Место общения программистов, форум разработчиков БД на Clarion

[OLE] [Excel] Установка формата ячейки

Модератор: Дед Пахом

Сообщение Гость » 31 Март 2004, 8:44

всемогущий и милостивейший

(С55EE(G); WinXP,98; ExcelXP,2000)

OLE Automation Error
«Нельзя установить свойство NumberFormat класса Range»

то иногда число преобразуется в дату
вопрос — как отключить?

==================================================
3. Я хочу записать в ячейку дробное число
?OLE <'Cells(' & i & ',' & j+1 & ').Value'>= YVol[m#,j]
как обеспечить распознавание числа ^^^^^^^^
как дробного числа с DecimalSeparator = «.» и автоматического приведение его к DecimalSeparator, установленному в системе.
Т.е. чтобы из Clarion в Excel число записывалось именно как число и именно с тем DecimalSeparator, который установлен в системе

Вариант (ExcelXP)
?OLE <'Application.DecimalSeparator'>= ‘».»‘
?OLE <'Application.UseSystemSeparators'>= FALSE
Не работает под Excel2000 (ну нет там таких свойств)
Пробую обойти это так:

но здесь проблема с NumberFormat (см. Выше) (оставить в том виде что есть (текстовом) нельзя, так как на его основе не строятся ChartObjects)

Посоветуйте, плиз: как надо правильно записывать в ячейки Excel дробные числа независимо от настроек системы


Best regards,
Ivan mailto:shkmail@inbox.ru
Написал: ClaList(2)

Сообщение Гость » 01 Апрель 2004, 8:36

елки-палки
ну ответьте хоть что-нибудь по теме
Ведь знаете, а молчите (


Best regards,
Ivan

ГОСПОДА КЛАРИОНИСТЫ!
Если не поможете, начну о вас плохо думать.

помогите, плиз.


Best regards,
Ivan

Раз никто не отвечает, то либо лениво писать, либо некогда. Зачем сразу «плохо думать»

От себя: Конкретно ручками писать работу с Excel через OLE не писал.
Сразу стал писать используя OfficeTemplate. Там это без проблем, например:

С уважением Мартюшев Леонид
mailto:leonid@opfr.komi.com

Ой, как страшно . Глянь в MSDN функцию GetLocaleInfo.

—————————————
C уважением,
Юрий Философов,
Главный программист
Корпорация «Диполь», Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439
Написал: ClaList(2)

Сообщение Гость » 01 Апрель 2004, 11:08

Я при выводе дробного числа в Excel делаю так

Проблем не было. пока
Написал: Ravenous(3)

Сообщение Гость » 01 Апрель 2004, 11:36

Да при чем тут это?
Мне не нужно менять установки в системе.

Мне нужно только
1. Правильно вывести число с десятичной точкой в Excel
2. Задать числовой формат ячейки в Excel

подробности — в предыдущих сообщениях


Best regards,
Ivan

Я не понял, что следующий код не работает?:

С уважением, Ставич Олег
Укрсиббанк г.Харьков
oldstav@ukrsibbank.com

Если правильно понял то проблема десятичной точки тогда
Format(FSN:SNMBR,@n5`2)
Меняет точку на запятую

Liudvikas Jagucanskis
Написал: ClaList(2)

Сообщение Гость » 01 Апрель 2004, 14:31

В случае, когда в качестве системного десятичного разделителя установлена запятая.
НЕ работает вот что

?OLE <'Selection.NumberFormat'>= ‘»0.00″‘
выдает ошибку:
OLE Automation Error
«Нельзя установить свойство NumberFormat класса Range»

то все работает.

и наоборот: использовать «0,00», когда в системе разделителем является точка, тоже нельзя. Ошибки при работе нет, но вот данные в Excel искажаются.

то есть что получается: при записи NumberFormat необходимо еще и проверять: какой разделитель установлен в системе и ручками формировать либо «0,00», либо «0.00» ?
объясните, плиз, я все правильно понимаю.

Но ведь должно работать и через OLE!
А почему именно такая форма шаблона формата?
#,##0.00
ведь если в системе по умолчанию стоит в качестве десятичного разделителя запятая, то и формат определяется как
# ###0,00
а знака для разделителя тысяч в Excel вообще нет — пробел вместо него или же Ваш OfficeTemplate использует свой собственный формат, а потом всю «грязную работу» делает сам — подстраивается под настройки системы?

у Вас в настройках системы какой десятичный разделитель установлен?
(и еще если можно: какой Excel, какая Windows?)


Best regards,
Ivan

Я тут покопался малость и вот что выяснил:

Ошибки при работе нет, но вот данные в Excel искажаются.

то есть что получается: при записи NumberFormat необходимо еще и проверять: какой разделитель установлен в системе и ручками формировать либо «0,00»
либо «0.00» .
объясните, плиз, я все правильно понимаю.

Тогда почему в коде VBA (в макросе Excel) стоит именно «0.00».

Подскажите: как определить какой символ используется в качестве десятичного разделителя? Я так понимаю это через API делать надо?
Приведите пример вызова функции API в Clarion.


Best regards,
Ivan
Написал: ClaList(2)

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