Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 28 мар 2024, 20:56

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Lazarus: экспорт в xlsx: пустая таблица
СообщениеДобавлено: 31 окт 2019, 16:47 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 60
Здравствуйте!

Система:
Код:
Lazarus 2.1 (Win32)
Ehlib 9.4.019
Windows 10
Не установлен MS Office
LibreOffice, версия: 6.2.2.2 (x64)

Есть несколько гридов, некоторые из них содержат DetailPanel, некоторые нет, во всех несколько колонок с фильтрами. Делаю для любого грида так:
Код:
procedure TfmMain.ExportGridToXLS(AMessage: string; AGrid: TDBGridEh);
begin
  SaveDialog1.Title:=AMessage;
  if SaveDialog1.Execute then
    ExportDBGridEhToXlsx(AGrid, SaveDialog1.FileName, [xlsxColoredEh, xlsxDataAsDisplayText] , true)
  else
    exit;
  MessageDlg('Данные сохранены.', mtInformation, [mbYes], 0);
end;


На диске создаётся файл, указанный пользователем, он открывается без сообщений об ошибках как LibreOffice Calc, так и MS Office, но показывается пустая книга с одним листом. Если посмотреть, то внутри xlsx значения ячеек грида присутствуют.

EhLib собран из исходников, только убрана кондиция {FPC_CROSSP}. Это только у меня так или всё же ошибка в библиотеке?

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2019, 19:00 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 60
Пока отвечу сам себе и тем, у кого такая же ошибка.
Дело в том, что в заголовке листа прописывается кодовая страница UFT8, а данные (мне непонятно, почему, вроде Lazarus юникодный везде) пишутся в 1251. У меня в гриде русские буквы. Соответственно, ошибка возникает в парсере офисов. Если прогнать получившийся xlsx через Open XML Productivity Tool, то будет сообщение об этой ошибке.

На мой взгляд проблема где-то в районе строки 1327 файла XlsFileWritersEh.pas (для сборки 9.4.019)

UPD: посмотрел на код повнимательнее, был не прав, перекодировать надо поток перед записью, строка ~956.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2019, 11:45 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

На тестовом проекте ошибка не воспроизводиться.
Русский текст выгружается корректно.
Можете изменить проект так, чтобы ошибка стала воспроизводится?


Вложения:
2019-09-04-sergeev@inform-teh.ru-ExportXLSXLazarus.zip [8.67 KiB]
Скачиваний: 72
sshot-58.png
sshot-58.png [ 77.81 KiB | Просмотров: 1079 ]

_________________
Best regards
EhLib support Team
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 ноя 2019, 13:54 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 60
Добрый день!

Сразу не отображается третья колонка начиная со второй строки.
Соответственно, чтобы показывался пустой файл, нужно присвоить DisplayLabel первой колонке грида значение с русскими буквами.
Возможно то, что вся библиотека компилируется как {$mode delphi} имеет значение?

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 ноя 2019, 15:26 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 60
Прикладываю, собственно, файл проекта и получившийся xlsx. Исходный на всякий случай переименовал в export1.xlsx.sample.
Поскольку дело в настройках окружения, чуть подробнее про ОС и Lazarus:

Windows 10 Pro (1903, сборка 18362.418)
Региональные настройки:
Регион: Россия
Формат региона: Русский[Россия]
Язык не-unicode программ: русский (Россия).

Lazarus 2.1.0 (Rev 61603)
fpc 3.3.1


Вложения:
xlsx_export.zip [15.76 KiB]
Скачиваний: 86
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 ноя 2019, 12:32 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 60
Проблема решена:
поток для листа и поток для объединения листов нужно всё-таки создавать с явным указанием кодировки (TEncoding.UTF8).
Убрал соответствующие условия компиляции в строках 4853 и 4854 файла DBGridEhImpExp.pas (для 9.4.019).

Насколько получилось разобраться, дело в том, что при {$mode delphi} тип string является классической однобайтовой строкой. Поэтому кодировку надо задавать именно при создании потока, если перекодировать данные извлечённые из потока или при помещении их в поток мы либо получаем потерю данных (знаки вопроса на месте русских букв), либо мусор.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB