Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  23:47[Войти] | [Зарегистрироваться]

Русский Excel и установка NumberFormat

дата публикации 26-02-2004 18:09

Русский Excel и установка NumberFormatМатериал является дополнением к статье "Особенности работы с "русским" Excel'ем"

Задавать NumberFormat и колонтитулы теперь можно по-английски!

Решение заключается в том, чтоб "профиксить" вызов DispCall из модуля ComObj.pas.
При вызове Invoke, ему передается LocaleID равный 0 (Language Neutral)

(строка 1893, код PUSH EDX { LocaleID }). 
Если заменить LocaleID на $0409 (US English), то все начинает работать как нужно!

Для того чтоб это реализовать, написан модуль TrDispCall.pas. Теперь, если его включить в uses, все выглядит так:

...
// TrDispCall нужно писать ПЕРВЫМ (!!!) в uses, а потом уже
// все модули, использующие ComObj (напр. Excel2000)
uses ... TrDispCall, Excel2000;

procedure TForm1.Button1Click(Sender: TObject);
const
  lcid = LOCALE_USER_DEFAULT;
var
  XL: TExcelApplication;
  WB: TExcelWorkbook;
  ASheet: TExcelWorksheet;
  LocaleID: Integer;
begin
  XL := TExcelApplication.Create(Self);
  WB := TExcelWorkbook.Create(Self);
  ASheet := TExcelWorksheet.Create(Self);
  //  установим LocaleID = $0409 - US English
  LocaleID := DispCallLocaleID($0409); 
  try
    XL.Connect;
    WB.ConnectTo(XL.Workbooks.Add(EmptyParam, lcid));
    ASheet.ConnectTo(WB.ActiveSheet as _WorkSheet);
    XL.Visible[lcid] := True;
    // число
    ASheet.Range['A1:B5', EmptyParam].Value2 := 123456.78;
    ASheet.Range['A6:B10', EmptyParam].Value2 := -123456.78;
    // "американский" формат
    ASheet.Range['A1:A10', EmptyParam].NumberFormat :=
      '#,##0.00;[red]-#,##0.00; "пусто";[blue]"Текст!!!:" @'; // OK
    // "русский" формат
    ASheet.Range['B1:B10', EmptyParam].NumberFormatLocal :=
      Format('#%0:s##0%1:s00;[красный]-#%0:s##0%1:s00;' +
        '"пусто";[синий]"Текст!!!:" @',
        [ThousandSeparator, DecimalSeparator]); // OK
    ASheet.Range['A5:B5', EmptyParam].Value2 := 0;
    ASheet.Range['A6:B6', EmptyParam].Value2 := 'просто текст';
    // дата
    // "американский" формат
    with ASheet.Range['C1:C10', EmptyParam] do begin
      Value2 := Date;
      NumberFormat := 'd/mm/yy'; // OK
    end;
    // "русский" формат
    with ASheet.Range['D1:D10', EmptyParam] do begin
      Value2 := Date + 1;
      NumberFormatLocal := Format('ДД%0:sММ%0:sГГ', [DateSeparator]); // OK
    end;
    WB.Saved[lcid] := True;
    XL.ScreenUpdating[lcid] := True;
  finally
    ASheet.Free;
    WB.Free;
    XL.Free;
    DispCallLocaleID(LocaleID); // восстановим LocaleID = 0 (по-умолчанию)
  end;
end;

Автор идеи Евгений Федоров.



К материалу прилагаются файлы:


Смотрите также материалы по темам:
[Локализация, проблемы с кодировками] [Формулы, макросы]

 Обсуждение материала [ 21-05-2011 09:05 ] 8 сообщений
  
Время на сайте: GMT минус 5 часов

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

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

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

Яндекс цитирования