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

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

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

Ответить
ems2811
незнакомец
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

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

Сообщение ems2811 »

Здравствуйте. Информация: 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');

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

В чем может быть проблема?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

В кодировке. Скорее всего в компоненте есть переход на ANSI кодировку.
ems2811
незнакомец
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Сообщение ems2811 »

а можно подсказать как это реализовать, чтоб передавать переменную? ведь первый вариант почти 100% копия 3его варианта. Примечание: было добавлено {$codepage utf8} из-за того что сообщения MessageBox выводили иероглифы. Пробовал удалять эту строку - результат одинаковый
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

ems2811, только подбором функции перекодирования. Не волнуйся, я и между IE с восьмерки на ХР не смог недавно передать... пришлось пересохранять в офисе. Попробуй вскрыть текст компонента и посмотреть как это реализовано в нем.
ems2811
незнакомец
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Сообщение ems2811 »

Просмотреть код не удается, но заметил кое-что интересное (путь к файлу внутри программы странно обрабатывается (русские буквы)). Вот пример из списка наблюдений
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 и оттуда лезут вопросы
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Код: Выделить всё

excel.Workbooks.Open(UTF8ToAnsi(str));

Не?

Добавлено спустя 2 минуты 13 секунд:

Код: Выделить всё

str:string;
strAnsi: AnsiString;
....
str := 'C:\Users\User\Desktop\Анкета.xls';
strAnsi := UTF8ToAnsi(str);
excel.Workbooks.Open(strAnsi);
ems2811
незнакомец
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Сообщение ems2811 »

Не. Уже переворошил AnsiToUTF8 и обратно. Странно то что при передаче текста напрямую в Open дает правильный результат, а через переменную - нет (в самом начале пример 1). Простите по поводу try except (я забыл что внутри компилятора все ошибки ловятся даже из блока try)
Ссылка на архив с проектом: http://data.cod.ru/188021
Самый крайний вариант - поставить для теста Delphi
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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

Сообщение Лекс Айрин »

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


Попробуйте указать кодировку явно CP1251ToUTF8 <> UTF8ToCP1251. Практика показывает, что это не всегда тоже самое, что AnsiToUTF8 <> UTF8ToAnsi
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Весь виндовый COM - это исключительно Widestring в кодировке utf16. От версии Excel не зависит. Никаких utf8, ansi, cp1251 и т.п.
ems2811
незнакомец
Сообщения: 7
Зарегистрирован: 14.02.2014 15:14:33

Сообщение ems2811 »

Спасибо. буду пробовать.
А вот если убрать {$codepage UTF8} (было прописано вручную). Это надо к каждому выводу сообщения перекодировку подключать? (без codepage лезут иероглифы)
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


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

Сообщение ems2811 »

Так же пробовал:

Код: Выделить всё

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
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Код: Выделить всё

var 
  st string;
  WS:WideString;

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

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

Сообщение ems2811 »

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));
- это при хранении пути в переменной кода
Ответить