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

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

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

Обсуждение материала
Особенности работы с «Русским» Excel'ем
Полный текст материала


Другие публикации автора: Александр Шабля

Цитата или краткий комментарий:

«... Написанное приложение, прекрасно работающее с Excel'ем на собственном компьютере, часто, после переноса приложения на другой компьютер, оказывается неработоспособным! Отчего так происходит? ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]872.7%
 
  Ничего особенно нового и интересного
[2]19.1%
 
  Написано неверно (обязательно укажите почему)
[3]218.2%
 
Всего проголосовали: 11

Оценка стиля изложения

  Все понятно, материал читается легко
[1]872.7%
 
  Есть неясности в изложении
[2]218.2%
 
  Непонятно написано, трудно читается
[3]19.1%
 
Всего проголосовали: 11




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

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 26

23-05-2008 04:36
сообщение от автора материала
Хочу сразу заметить, что особенности работы из Delphi с Excel 2007 версии и следующими версиями пока не тестировались... Если кто что заметит "особенного", пишите в комментарии. Спасибо :)


23-05-2008 04:18
Комментарий относительно РУССКОГО Excel 2007!!!

if XL.LanguageSettings.LanguageID[msoLanguageIDUI] = $0419
  then ASheet.PageSetup.CenterFooter := // русские коды форматирования
    '&"Arial"&8Лист &"Arial,полужирный"&С' +
    '&"Arial,обычный" из &"Arial,полужирный"&К'
  else ASheet.PageSetup.CenterFooter := // английские коды форматирования
    '&"Arial"&8Лист &"Arial,bold"&P' +
    '&"Arial,normal" из &"Arial,bold"&N';



Не работаю русские коды форматирования! Все свои функции писал под Excel 2003 (русский) и данный код работал. При формировании документа в Excel 2007 (русский) отрабатывают только английские коды форматирования. Совместимость потерялась...


02-12-2006 19:03
Спасибо за статью - выручила при объединении таблиц с макросами в одну


22-09-2006 07:14
сообщение от автора материала
утверждения про Formula и FormulaLocal ошибочны

Обоснуй


22-09-2006 06:57
утверждения про Formula и FormulaLocal ошибочны


16-07-2005 16:41
сообщение от автора материала
Zmiy
ASheet.Range['A1:A10', EmptyParam].NumberFormat :='#,##0.00 $', для типа Currency дает при запуске ошибку

Конечно, если у вас разделитель тысяч не запятая. Да и знак доллара (и все неслужебные символы и текст) нужно в двойных ковычках писать. И, если у вас русский Excel и региональные насройки, то тоже не будет работать. Вы статью читали?

Сообщение не подписано
RusExcel.zip не доступен по адресу

Видимо связано с переeздом сайта. Если чего, то пишитe мне - вышлю.


14-07-2005 05:43
RusExcel.zip не доступен по адресу
http://delphi.mtu-net.ru/zip/rusexcel.zip
Сообщение не подписано


13-07-2005 05:35
ASheet.Range['A1:A10', EmptyParam].NumberFormat :='#,##0.00 $', для типа Currency дает при запуске ошибку
   с текстом "Нельзя установить свойство NumberFormat класса Range".
 Zmiy


12-11-2004 09:59
Извините я не подписался, не посмотрел.


12-11-2004 09:49
Нашел свою ошибку.
У мнея в программе текст в шапке прописывался в событии OnDrawCell, там задавались данные шапки и текст, из-за этого строка шапки оказывалась пустой. Надо то было всего лишь проследить изменения переменной и всего делов. :))
Бывает, когда голова не сооброжает.:)
Спасибо, что уделил внимание.
Но почему так происходит я так пока и не понял.
:((
Сообщение не подписано


11-11-2004 13:41
сообщение от автора материала
Это я не подписался...


11-11-2004 13:34
Проверил - прекрасно работает! Вот только небыло данных - пришлось свои изобретать ;)

procedure TForm1.FormCreate(Sender: TObject);
var R, C: Integer;
begin
  for C := 0 to sgAccount.RowCount - 1 do
    for R := 0  to sgAccount.ColCount - 1 do
      sgAccount.Cells[C, R] := IntToStr((C + 1) * (R + 1));
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  lcid = LOCALE_USER_DEFAULT; // locale ID
var
  XL: TExcelApplication;
  WB: TExcelWorkbook;
  ASheet: TExcelWorksheet;
  MyVar: Variant;
//  IsRusXL, IsExcel2kXP: Boolean;
  i, j :integer;

begin
  XL := TExcelApplication.Create(Self);
  WB := TExcelWorkbook.Create(Self);
  ASheet := TExcelWorksheet.Create(Self);
  // все строки и колонки из StringGrid'a (и фиксированные тоже)
  MyVar := VarArrayCreate([0, sgAccount.RowCount - 1, 0, sgAccount.ColCount - 1], varVariant);
  try
    XL.Connect;
    WB.ConnectTo(XL.Workbooks.Add(EmptyParam, lcid));
    ASheet.ConnectTo(WB.ActiveSheet as _WorkSheet);
    XL.Visible[lcid] := True;

// это я убрал, т.к. вы формулы все равно не вставляете, я так думаю ;)
{    IsRusXL := (XL.LanguageSettings.LanguageID[msoLanguageIDUI] = $0419);

    IsExcel2kXP := InRange(StrToFloatDef(StringReplace(XL.Version[lcid],
      '.', DecimalSeparator, []), 0), 9, 10);}

    for i := 0 to sgAccount.RowCount - 1  do
      for j := 0 to sgAccount.ColCount - 1 do
        MyVar[i, j] := sgAccount.Cells[j, i];

    with ASheet.Range['A1', ASheet.Cells.Item[sgAccount.RowCount, sgAccount.ColCount]] do begin
//      Clear; <-- не нужно!
      { FormulaLocal - работает для русских формул для Excel2000/XP/2003 }
      FormulaLocal := MyVar;
    end;
  finally
    VarClear(MyVar);
    ASheet.Free;
    WB.Free;
    XL.Free;
  end;
end;

Если все равно не работает, то попробуйте начинать не с нуля:
MyVar := VarArrayCreate([1, sgAccount.RowCount, 1, sgAccount.ColCount], varVariant);
и тогда...
    for i := 0 to sgAccount.RowCount - 1  do
      for j := 0 to sgAccount.ColCount - 1 do
        MyVar[i + 1, j + 1] := sgAccount.Cells[j, i];

Если не получится - пишите на мыло!
С уважением,
Сообщение не подписано


11-11-2004 12:31
Александр. Пример прекрасный. Но у меня возникла проблема при передаче данных из StringGrid. Не передается шапка, фиксированная строка.
Передача идет через VarArray:

var
  XL: TExcelApplication;
  WB: TExcelWorkbook;
  ASheet: TExcelWorksheet;
  MyVar: Variant;
  IsRusXL, IsExcel2kXP: Boolean;
  LRow, i, j :integer;
  AS1 : string;

begin
  LRow := sgAccount.RowCount;
  XL := TExcelApplication.Create(Self);
  WB := TExcelWorkbook.Create(Self);
  ASheet := TExcelWorksheet.Create(Self);
  MyVar := VarArrayCreate([0,LRow-1,0,20 ], varVariant); // LRow строк, 21 колонка
  try
    XL.Connect;
    WB.ConnectTo(XL.Workbooks.Add(EmptyParam, lcid));
    ASheet.ConnectTo(WB.ActiveSheet as _WorkSheet);
    XL.Visible[lcid] := True;

    IsRusXL := (XL.LanguageSettings.LanguageID[msoLanguageIDUI] = $0419);

    IsExcel2kXP := InRange(StrToFloatDef(StringReplace(XL.Version[lcid],
      '.', DecimalSeparator, []), 0), 9, 10);

    for i := 0 to LRow-1  do
        for j := 0 to 20 do
        begin
        MyVar[i,j] := sgAccount.Cells[j,i];
        end;

     AS1 := 'A1:U' +inttostr(LRow);
    with ASheet.Range[AS1, EmptyParam] do begin
      Clear;
      { FormulaLocal - работает для русских формул для Excel2000/XP/2003 }
      FormulaLocal := MyVar;
    end;
  finally
    ASheet.Free;
    WB.Free;
    XL.Free;
    VarClear(MyVar);
  end;


Excel 2003.
Из-за чего может это быть? Может я что не учел?
Буду признателен за помощь.


11-11-2004 10:55
сообщение от автора материала
2 Владимир Коднянко
Вы, конечно, извините, но я испытавыл у себя на Excel'ях версии 2k, 2002 (XP) и 2003 (благо есть такая возможность - компов в отделе много), на D6 и D7 - все работает, спасибо Евгению Федорову! Посмотрите, может вызов Invoke происходит у Вас не из TrDispCall?

uses TrDispCall, Windows, Messages, SysUtils,
        {$IFNDEF D5} Variants,{$ENDIF} Classes,Graphics,
        Controls,Forms,Dialogs,StdCtrls;

Попробуйте перенести TrDispCall в implementation.

uses OleServer, TrDispCall, Excel2000, Office2000...


Если не получится - готов выслать тестовый проект по почте.

С уважением,


10-11-2004 23:36
1. Почему Вы решили, что статью читал невнимательно. Вот uses, юзее не придумаешь:
   uses TrDispCall, Windows, Messages, SysUtils,
        {$IFNDEF D5} Variants,{$ENDIF} Classes,Graphics,
        Controls,Forms,Dialogs,StdCtrls;
   Тем не менее, результат прежний.
2. Повторю, в справке по установленному у меня Excel'ю написано "Microsoft Excel 2002".
   Не принимайте это близко к сердцу. Просто пишу о том, что есть.
   Уважающий Вас В.Коднянко


10-11-2004 14:29
сообщение от автора материала
Отвечаю…
1. При выходе из демонстрационной программы не происходит автоматического закрытия Excel. Присходится ее закрывать отдельно.
А с чего Вы взяли, что Excel в примере должен закрываться автоматически? Не должен :)

Пример 1. Кнопка "VariantArray".
   Ошибка в операторе:
   IsExcel2kXP := InRange(StrToFloatDef(StringReplace(XL.Version[lcid],
      '.', DecimalSeparator, []), 0), 9, 10);
   Ошибка исключения с текстом "Недопустимое число параметров"

Не знаю что и сказать, может Вы подключили ExcelXP или Excel97?

Пример 2. Кнопка "Get XL Ver.". Та же ошибка.
См. выше.

Пример 3. Процедура выложенная во второй статье дает при запуске ошибку
   с текстом "Нельзя установить свойство NumberFormat класса Range".
   Ошибка в операторе
   ASheet.Range['A1:A10', EmptyParam].NumberFormat :=
      '#,##0.00;[red]-#,##0.00; "пусто";[blue]"Текст!!!:" @'; // OK


А для этого нужно внимательно читать вторую статью :). Этот фрагмент работать в русском Excel'е не будет, пока не подключить TrDispCall, причем TrDispCall нужно писать ПЕРВЫМ (!!!) в uses, а потом уже все модули, использующие ComObj (напр. Excel2000)


10-11-2004 03:17
К сожалению, не все хорошо в материале при его испытании.
Это относится к обеим статьям.
Проверка проводилась по демонстрационной программе, выложенной в в первой статье
в виде гиперссылки для скачивания.

1. При выходе из демонстрационной программы не происходит
   автоматического закрытия Excel.
   Присходится ее закрывать отдельно.

2. Ряд функций, запускаемых кнопками, просто глючат.

   Пример 1. Кнопка "VariantArray".
   Ошибка в операторе:
   IsExcel2kXP := InRange(StrToFloatDef(StringReplace(XL.Version[lcid],
      '.', DecimalSeparator, []), 0), 9, 10);
   Ошибка исключения с текстом "Недопустимое число параметров"  

   Пример 2. Кнопка "Get XL Ver.". Та же ошибка.

   Пример 3. Процедура выложенная во второй статье дает при запуске ошибку
   с текстом "Нельзя установить свойство NumberFormat класса Range".
   Ошибка в операторе
   ASheet.Range['A1:A10', EmptyParam].NumberFormat :=
      '#,##0.00;[red]-#,##0.00; "пусто";[blue]"Текст!!!:" @'; // OK

  Испытания проводились в ОС Windows XP. Excel-2002.
  Программа компилировалась в Delphi-6.  


27-07-2004 11:29
Уважаемая Евгения! В Exell и Worde можно обойтись без "научного тыка и втыка". Все просто. В этих продуктах Microsoft есть такая полезная вещь, как запись макроса. При этом ВСЕ ваши действия с клавиатуры и мыши записываются в макрос.
Итак, идем в меню "Сервис" -> "Макрос" -> "Начать запись". Затем выполняем все действия, которые хотим добиться от машины. Прекращаем запись макроса. Затем в меню "Сервис" -> "Макрос" -> "Макросы" смотрим на наш свежесозданный макрос.


01-03-2004 12:25
сообщение от автора материала
Смотрите решение, предоставленное Евгением Фёдоровым http://www.delphikingdom.com/asp/viewitem.asp?catalogid=924 :)))


12-02-2004 14:12
>>Написанное приложение, прекрасно работающие с
>>Excel'ем на собственном компьютере, часто,
>>после переноса приложения на другой компьютер,
>>оказывается неработоспособным! Отчего так
>>происходит?

Дык это... я так думаю, надо бы Microsoft OLE 2.4 for Windows NT and Windows 95 в инсталляхе к своей проге тащить...


12-02-2004 14:11
сообщение от автора материала
To Евгения

>>>Подобная проблема у меня была, когда я хотела сделать жирным шрифт.
>>>Но, методом научного тыка достаточно подобрать константу.

А что, есть проблемы? Можно "жирным" сделать и поменять цвет даже любой части ячейки - это не проблема :)


12-02-2004 14:07
сообщение от автора материала
To Евгения

Какая версия Excel?

>>>Установка цвета шрифта:
>>>Ed.Cells[1,1].Font.ColorIndex:=7;
>>>если не ошибаюсь, то RGB( , , )тоже >>>замечательно подойдет

Я про установку цвета ячейки не писал, там все в норме, при прямой работе с формулами тоже (вы статью внимательно прочли?).

На счет NumberFormat через позднее связывание - все равно не работает! ;)

>>>за полтора года создавания отчетов на Delphi
и это срок? ;)


12-02-2004 13:43
Уважаемый Александр, за полтора года создавания отчетов на Delphi, я ни разу не столкнулась с проблемой, описанной Вами. Мы с Вами, на мой взгляд, по-разному к этому подходим.
Например, установка формата даты:
Ed.Cells[1,1].NumberFormat:='dd/mm/yyyy';
Ed.Cells[1,1]:=MyDate;
{А в начале по неопытности делала NumberFormat='@', что означает - текс, а потом уже присваивала дату. Пользователь-то все равно не заметит}

где Ed: OleVariant;
    Ed:=Ex.ActiveWorkBook.Sheets[1{напр}];
    Ed.Select;

Установка цвета шрифта:
Ed.Cells[1,1].Font.ColorIndex:=7;
если не ошибаюсь, то RGB( , , )тоже замечательно подойдет.

Подобная проблема у меня была, когда я хотела сделать жирным шрифт. Но, методом научного тыка достаточно подобрать константу.

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

Ed.Cells[1,1{напр}].FormulaR1C1:=
'=SUM('''+Ex.ActiveWorkBook.Sheets[1].Name+':'+Ex.ActiveWorkBook.Sheets[5 {напр}].Name+'''!RC)';
Аналогично записывается и ЕСЛИ, МИН и т.п.

      



12-02-2004 11:29
сообщение от автора материала
To Фёдоров Евгений
>>>LCID поменять на $409
Где менять? Самого коробит :|


12-02-2004 10:33
Александр, а LCID не пробовали поменять на $409 и далее через com-интерфейс пулять всё в английском варианте, штоп не заморачиваться русско-германскими особенностями? Меня лично коробит округл() и сумм(), поэтому я всегда так делаю :-)


12-02-2004 08:16
Спасибо, Александр! Очень нужный и понятный материал.


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: 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» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

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