Использование внешней DLL для работы с M$ Word
Модератор: Модераторы
Будите править, поправьте -> осталась ссылка в тексте pdf и odt на uworddll.pas
Добавлено спустя 25 минут 2 секунды:
формат ячейки настроен как дата.
Выполняю SetCellValueDate(xls, CellName, DM.DOGData.FieldValues['DOG_DATE']); получаю в ячейке: dd.mm.yyyy так и написано буквами!
Выполняю SetCellValue(xls, CellName, DM.DOGData.FieldValues['DOG_DATE']); получаю в ячейке: 01.05.2011 - всё нормально!
т.е. не работает SetCellValueDate!?
Добавлено спустя 25 минут 2 секунды:
формат ячейки настроен как дата.
Выполняю SetCellValueDate(xls, CellName, DM.DOGData.FieldValues['DOG_DATE']); получаю в ячейке: dd.mm.yyyy так и написано буквами!
Выполняю SetCellValue(xls, CellName, DM.DOGData.FieldValues['DOG_DATE']); получаю в ячейке: 01.05.2011 - всё нормально!
т.е. не работает SetCellValueDate!?
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
vicvala писал(а):осталась ссылка в тексте pdf и odt на uworddll.pas
Поправил.
vicvala писал(а):не работает SetCellValueDate!?
Какая версия офиса? Я тестировал только на 2003, все работало нормально.
Добавлено спустя 5 минут 29 секунд:
Код: Выделить всё
SetCellValueDate(_xl,'D2',Now);выводит и отображает нормально.
Офис 2007 SP3
После присвоения ячейке значения:

изначально формат ячейки - краткая дата, т.е. "затирается" формат и становится "Все форматы"
если поменять формат с "Все форматы" на "Краткая дата", то всё нормально!!!
с такой строкой SetCellValueFloat(xls, CellName, DM.CSTData.FieldByName('CST_COST').AsFloat) - программа вообще "падает"!!!
Кстати, SetCellValueInteger работает!
Добавлено спустя 35 минут 20 секунд:
может без этого: Xls.ActiveSheet.Range[CellName].NumberFormat:='dd.mm.yyyy'; или поменять местами (на 2 место).
А почему SetCellValueCurrency за комментирован?
После присвоения ячейке значения:

изначально формат ячейки - краткая дата, т.е. "затирается" формат и становится "Все форматы"
если поменять формат с "Все форматы" на "Краткая дата", то всё нормально!!!
с такой строкой SetCellValueFloat(xls, CellName, DM.CSTData.FieldByName('CST_COST').AsFloat) - программа вообще "падает"!!!
Кстати, SetCellValueInteger работает!
Добавлено спустя 35 минут 20 секунд:
может без этого: Xls.ActiveSheet.Range[CellName].NumberFormat:='dd.mm.yyyy'; или поменять местами (на 2 место).
А почему SetCellValueCurrency за комментирован?
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
vicvala писал(а):может без этого: Xls.ActiveSheet.Range[CellName].NumberFormat:='dd.mm.yyyy';
Без этого тоже работает.
vicvala писал(а):почему SetCellValueCurrency за комментирован?
Не работает правильно - у меня всегда в ячейку записывает ноль. Пока не разобрался, почему.
Хотя в книге В.Корнякова "Программирование документов и приложений MS Office в Delphi" написано
Свойство Value обьекта Range имеющее тип Variant, допускает запись данных разного типа, что позволяет изменить формат ячейки в дальнейшем.
Это утверждение относится и к обьекту Cells... Независимо от того, какой формат имело заисанное в ячейку значение, мы можем изменить формат ячейки в любой момент.
В примерах, которые приводятся в книге, обьект Range автоматически определяет тип записываемого значения и соответственно изменяет формат ячейки. Но у меня почему-то это не работает
Так что пробую со всем этим "хозяйством" разобраться.
Добавлено спустя 12 минут 20 секунд:
Попробовал добавить функцию SetCellValueFormat для принудительного задания формата ячейки, пробуйте тестить.
Похоже в этой сборке dll заработало, офис 2007. Проверял string, date, integer, float - работают!!! Спасибо!
SetCellValueFormat не использовал, формат ячейки был задан изначально, в шаблоне!
SetCellValueFormat не использовал, формат ячейки был задан изначально, в шаблоне!
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
vicvala писал(а):формат ячейки был задан изначально, в шаблоне!
Есть необходимость протестить с созданым програмно файлом функции SetCellValueFloat() и SetCellValueCurrency() - у меня не всегда правильно отрабатывают (иногда значения после точки не отображаются).
Добавлено спустя 4 часа 55 минут 48 секунд:
Пробую перенести весь функционал библиотеки в отдельный модуль - кажется, в последней версии FPC более-менее реализовано работу с COM/OLE обьектами.
Добавлено спустя 21 минуту 31 секунду:
Проверил работу полученого модуля на рабочем проэкте - почему-то не работает SetColWidth()
Закомментировал - остальное отработало нормально.
Добавлено спустя 4 минуты 53 секунды:
Все изменения доступны по SVN.
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
В SVN добавил пример формирования отчета из файла DBF (CP866) в M$Word
Код: Выделить всё
svn checkout http://msofficedll.googlecode.com/svn/trunk/ msofficedll-read-onlyА может кто-нибудь скинуть эту библиотеку на почту sergey.s.vinogradov@gmail.com в архиве запароленном (пароль 1). А то у меня прав на скачавание на работе нет и библиотеки спам фильтр удалит, если не запаролить. Спасибо!
Думал что у меня пример не работает выложенный, при открытии DBF файла (которые хранятся с одной старой программой), а проблема в пути к файлу оказалась (Не любит изначально на кириллице файлы видеть) Путь вида :
E:\Софтина бугалтерская\UMC_XBK\DBF\DOKU0508.dbf
А может быть проблема в пробеле в пути, у меня такое было. Считал до пробела путем, а все после параметром. Помогло заключить путь в двойные кавычки.
Добавлено спустя 13 часов 13 минут 47 секунд:
А я не последнюю версию скачал или действительно можно открыть эксель, записать в ячейки значения, а вот сохранить и выйти уже нельзя?
И хотелось бы видимость выбирать и при открытии, а не только при создании (хотя без возможности програмно сохранить и выйти из экселя, пока не очень актуально
.
Автору спасибо, очень помогло!
Добавлено спустя 13 часов 13 минут 47 секунд:
А я не последнюю версию скачал или действительно можно открыть эксель, записать в ячейки значения, а вот сохранить и выйти уже нельзя?
И хотелось бы видимость выбирать и при открытии, а не только при создании (хотя без возможности програмно сохранить и выйти из экселя, пока не очень актуально
Автору спасибо, очень помогло!
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
whs писал(а):Думал что у меня пример не работает выложенный, при открытии DBF файла (которые хранятся с одной старой программой), а проблема в пути к файлу оказалась (Не любит изначально на кириллице файлы видеть) Путь вида :E:Софтина бугалтерскаяUMC_XBKDBFDOKU0508.dbf
Замените в исходнике:
Код: Выделить всё
Dbf1.FilePathFull:=UTF8ToSys(ExtractFilePath(OpenDialog1.FileName));Добавлено спустя 1 час 45 минут 38 секунд:
VinSS писал(а):можно открыть эксель, записать в ячейки значения, а вот сохранить и выйти уже нельзя?И хотелось бы видимость выбирать и при открытии, а не только при создании
Добавил указанные функции. Изменения высылаю Вам на почту (пароль для архива - 1)
Не хватает аналога таких функций для excel:
Function CloseDoc(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseDoc';
{*закрыть документ}
Function CloseWord(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseWord';
{*выход из Word'a}
А то документ невидимый, сохраненный, но занятый и в памяти висит
За:
procedure SetExcellVisible, procedure SaveXlsDocument и procedure SaveXlsDocumentAs спасибо.
Function CloseDoc(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseDoc';
{*закрыть документ}
Function CloseWord(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseWord';
{*выход из Word'a}
А то документ невидимый, сохраненный, но занятый и в памяти висит
За:
procedure SetExcellVisible, procedure SaveXlsDocument и procedure SaveXlsDocumentAs спасибо.
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
VinSS писал(а):Не хватает аналога таких функций для excel:Function CloseDoc(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseDoc';{*закрыть документ}Function CloseWord(var wrd : Variant):boolean; stdcall; external 'msofficedll.dll' name 'CloseWord';{*выход из Word'a}
Добавил, см. документацию
VinSS писал(а):документ невидимый, сохраненный, но занятый и в памяти висит
Такое возникает, если файл уже существует и использовалась функция SaveXlsDocumentAs
Добавлено спустя 10 минут 18 секунд:
Хотелось бы знать, кто в каких проектах и каким образом использует библиотеку. Если не затруднит, отпишитесь.
У меня контроль выработки (создание отчета), с начала я создавал *.csv, но нужно было условное форматирование, поэтому я ручками копировал, а теперь все автоматом.
Еще раз спасибо!
Еще раз спасибо!
