Ошибка Workbooks.Open (Lazarus+Excel)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 14.02.2014 15:26:12

Здравствуйте. Информация: Lazarus 1.0.14, FPC 2.6.2, Win 8.1
Начал писать простенький парсер для Excel файлов. И натнулся на проблему, что Workbooks.Open не воспринимает переменные. Пример:
Код: Выделить всё
str:='C:\Users\User\Desktop\Анкета.xls';
excel.Workbooks.Open(str);

Ошибка (не отлавливается блоком try). Текст ошибки состоит из знаков вопросов

Код: Выделить всё
excel.Workbooks.Open(FileNames[0]);

FileNames[0] получаем из dropfile
Ошибка (не отлавливается блоком try). Текст ошибки состоит из знаков вопросов

Код: Выделить всё
excel.Workbooks.Open('C:\Users\User\Desktop\Анкета.xls');

Работает нормально.

В чем может быть проблема?
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение Лекс Айрин » 14.02.2014 15:34:43

В кодировке. Скорее всего в компоненте есть переход на ANSI кодировку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 14.02.2014 15:49:16

а можно подсказать как это реализовать, чтоб передавать переменную? ведь первый вариант почти 100% копия 3его варианта. Примечание: было добавлено {$codepage utf8} из-за того что сообщения MessageBox выводили иероглифы. Пробовал удалять эту строку - результат одинаковый
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение Лекс Айрин » 14.02.2014 16:18:15

ems2811, только подбором функции перекодирования. Не волнуйся, я и между IE с восьмерки на ХР не смог недавно передать... пришлось пересохранять в офисе. Попробуй вскрыть текст компонента и посмотреть как это реализовано в нем.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 14.02.2014 20:56:37

Просмотреть код не удается, но заметил кое-что интересное (путь к файлу внутри программы странно обрабатывается (русские буквы)). Вот пример из списка наблюдений
FileNames(массив)
Длина=1:
(0x112648 'C:\Users\user\Desktop\'#208#155#208#184#209#129#209#130' Microsoft Office Excel.xlsx')
FileNames[0](элемент массива)
'C:\Users\user\Desktop\Лист Microsoft Office Excel.xlsx'
str(переменная)
'???? Microsoft Office Excel.xlsx'
Lazarus не переваривает в переменных русские буквы? или принимающая функция (Open) не может преобразовать в UTF8 и оттуда лезут вопросы
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение resident » 14.02.2014 22:24:52

Код: Выделить всё
excel.Workbooks.Open(UTF8ToAnsi(str));

Не?

Добавлено спустя 2 минуты 13 секунд:
Код: Выделить всё
str:string;
strAnsi: AnsiString;
....
str := 'C:\Users\User\Desktop\Анкета.xls';
strAnsi := UTF8ToAnsi(str);
excel.Workbooks.Open(strAnsi);
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 14.02.2014 23:07:56

Не. Уже переворошил AnsiToUTF8 и обратно. Странно то что при передаче текста напрямую в Open дает правильный результат, а через переменную - нет (в самом начале пример 1). Простите по поводу try except (я забыл что внутри компилятора все ошибки ловятся даже из блока try)
Ссылка на архив с проектом: http://data.cod.ru/188021
Самый крайний вариант - поставить для теста Delphi
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение SSerge » 15.02.2014 07:07:29

ems2811
1. Убрать {$codepage UTF8}. Опция для Лазаруса запрещенная. Однозначно сделать. Убрать соответствующий ключ компилятора, если он прописывался руками.
2. Все зависит, конечно, от вашей версии excel, но на поздних, imho, строки в её OLE-объекты передаются только в уникоде. Т.е. с точки зрения паскаля - WideStrings, кодировка UTF16 (UCS16). Если таковое происходит путем неявного преобразования (через присваивание WideString к AnsiString, на 2.6.х компиляторе конверсия кодировок скорее всего будет неправильной. Кодировать поэтому WideString необходимо только явным образом, функциями, которые явно указывают из какой кодировки во что переводится строка.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение Лекс Айрин » 15.02.2014 09:39:54

ems2811 писал(а):Не. Уже переворошил AnsiToUTF8 и обратно.


Попробуйте указать кодировку явно CP1251ToUTF8 <> UTF8ToCP1251. Практика показывает, что это не всегда тоже самое, что AnsiToUTF8 <> UTF8ToAnsi
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение Sergei I. Gorelkin » 15.02.2014 10:14:46

Весь виндовый COM - это исключительно Widestring в кодировке utf16. От версии Excel не зависит. Никаких utf8, ansi, cp1251 и т.п.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 15.02.2014 10:53:19

Спасибо. буду пробовать.
А вот если убрать {$codepage UTF8} (было прописано вручную). Это надо к каждому выводу сообщения перекодировку подключать? (без codepage лезут иероглифы)
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение SSerge » 15.02.2014 11:53:43

ems2811 писал(а):Это надо к каждому выводу сообщения перекодировку подключать?


Вы о каких сообщениях? EOleSysError?
Да, их нужно соответствующими функциями переводить в UTF8.
У меня, например, на вашем коде они отображаются вопросами в любом случае - есть директива или нет ее.
Что касается остальных сообщений, то убираю строку с $codepage - всё отображается нормально.
Если у вас в созданном по умолчанию новом проекте MessagеBoxы вместо русских букв выводят незнамо что, то наиболее вероятной причиной я бы считал частично поломанную версию сборки лазаруса. Вы "Lazarus 1.0.14, FPC 2.6.2" брали из официального источника или дневных сборок?
В дневных сборках там такооое бывает. :D
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 15.02.2014 21:02:11

Так же пробовал:
Код: Выделить всё
var str: string;
str:='C:\Users\user\Desktop\Лист Microsoft Office Excel.xlsx';
excel.Workbooks.Open(UTF8Decode(str));

Теперь почти работает. При запуске из Lazarus выдает External: SIGSEGV, при запуске из винды Access violation, при запуске из под винды от администратора - ничего не происходит.
Вывод сообщений MessageBox сбоил выводил в кривой кодировке, поэтому поставил параметр
лазарус качал отсюда http://www.lazarus.freepascal.org/index.php?page=downloads
http://savepic.net/4588459.htm тут хорошо видно (не указан codepage), вызов MessageBox
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение alexs » 15.02.2014 23:31:24

Попробуй так:

Код: Выделить всё
var
  st string;
  WS:WideString;

  s:='C:\Users\user\Desktop\Лист Microsoft Office Excel.xlsx';
  WS:=UTF8ToSys(S);
  excel.Workbooks.Open(WS);

Должно работать.
У меня таким образом заполняется выгрзки в excel
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Ошибка Workbooks.Open (Lazarus+Excel)

Сообщение ems2811 » 16.02.2014 11:34:48

alexs, не работает
видно что-то не то с Lazarus. попробовал в Delphi 7 - все нормально

Добавлено спустя 10 часов 56 минут 19 секунд:
Правильный ответ для меня оказался малость странным:
Код: Выделить всё
excel.Workbooks.Open(WideString(UTF8Decode(FileNames[0])));
- это при получении пути перетаскиванием файла на форму

Код: Выделить всё
str:='C:\Users\User\Desktop\Анкета.xls';
excel.Workbooks.Open(WideString(str));
- это при хранении пути в переменной кода
ems2811
незнакомец
 
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 228

Рейтинг@Mail.ru