| | | | |
Особенности работы с «Русским» Excel'ем | Полный текст материала
Другие публикации автора: Александр Шабля
Цитата или краткий комментарий: «... Написанное приложение, прекрасно работающее с Excel'ем на собственном компьютере, часто, после переноса приложения на другой компьютер, оказывается неработоспособным! Отчего так происходит?
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 8 | 72.7% | | | | Ничего особенно нового и интересного | [2] | 1 | 9.1% | | | | Написано неверно (обязательно укажите почему) | [3] | 2 | 18.2% | | Всего проголосовали: 11 | | | Все понятно, материал читается легко | [1] | 8 | 72.7% | | | | Есть неясности в изложении | [2] | 2 | 18.2% | | | | Непонятно написано, трудно читается | [3] | 1 | 9.1% | | Всего проголосовали: 11 |
[Локализация, проблемы с кодировками] [Формулы, макросы] [Таблицы, оформление областей]
Отслеживать это обсуждение
Всего сообщений: 2623-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
13-07-2005 05:35ASheet.Range['A1:A10', EmptyParam].NumberFormat :='#,##0.00 $', для типа Currency дает при запуске ошибку
с текстом "Нельзя установить свойство NumberFormat класса Range". |
|
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);
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 := 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:361. Почему Вы решили, что статью читал невнимательно. Вот 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
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Спасибо, Александр! Очень нужный и понятный материал. |
|
|
|