Форум

ГлавнаяСредства работы с XLSX-файлами

Средства работы с XLSX-файлами

RSS
Средства работы с XLSX-файлами
 
Тема заведена для обмена опытом в области работы с файлами формата XLSX (в разных средах программирования и разными средствами). Особенно интересен случай, когда MS Office Excel на компьютере вообще не установлен. Предлагается обсуждать только бесплатные решения.
=====================================
Начать хотелось бы со среды Visual FoxPro (VFP), в которой программирую я сам, но могут быть рассмотрены самые разные общедоступные средства для среды Windows (открытые DLL-библиотеки).
-----------------------------------------------------------
Цитата
Basil пишет:
Цитата
AlcorVol пишет:
Интересно, использовали ли тот же проект (https://vfpx.codeplex.com/wikipage?title=XLSXWorkbook), что и я осваиваю сейчас?
Нет, я по старинке: createobject('excel.application')
А с этим проектом скорее всего не получится. Я его попробовал: открыл шаблон ПД, заполнил одну ячейку и сохранил. После этого данный шаблон в excel открывается с ошибками.
Итак, речь идёт о проекте VFPxWorkbookXLSX для VFP. Ввиду того, что проект - открытый, можно программный код модифицировать. Так что, есть надежда справиться с какими-то неприятностями. Вот конкретный пример. Попробовал почитать (на основе примера readXLSXfile.prg) файл со списком помещений и ЛС для МКД, выгруженный из ГИС ЖКХ в ЛК. Почти всё почти сразу получилось. За исключением одного нюанса: в книге - два открытых (visible) листа: "Идентификаторы помещений ГИСЖКХ" и "ЕЛС". Однако название первого оказалось обрезанным до 30 символов: "... ГИСЖК". Найти причину (и устранить ошибку) получилось довольно быстро. Метод (процедура) CreateWorkingCursors создаёт временные таблицы (курсоры), в которые выгружает всю информацию книги. Для списка листов создаётся курсор xl_sheets:
CREATE CURSOR xl_sheets (workbook I, sheet I, shname C(30), ... )
Заменяем shname C(30) на shname C(40) - и всё заработало, как надо. Кстати, имена листов тут уже оказываются перекодированными из UTF-8 в 1251. Чего не скажешь о значениях полей. Но функция STRCONV() легко решает эту задачу:
lcValue = strconv(lcValue, 11)

Заполнять ячейки я пока не пробовал. Basil говорит, что у него нечто нечитаемое получается. Возможно, дело как раз в перекодировках (обратная 1251 -> UTF-8 делается так : lcValue = strconv(lcValue, 9) ). Может быть, дело и в чём-то другом. Поэтому попросил бы Basil'а прислать мне на email: alcor <собака> vologda <точка> ru тестовый XLSX-файл и программку. Хотел бы поэкспериментировать и сам. Как добавлять строки в шаблон - пока не разобрался. Похоже, что писать можно в любую ячейку любой строки методом SetCellValue. Даже если такой строки ещё и не было. Какие тут у тебя мысли, Basil?
 
Там проблема не в самой записи, а в том, что в шаблонах есть скрытые листы, списки и т.п. и всё это некорректно сохраняется. То есть, если даже шаблон просто открыть и сохранить, ничего не меняя, результат будет плачевным. Пример отправил.
 
Кажется, примерно представляю в чем может быть проблема. Если есть скрытые листы, то скорее всего они не просто так, и на видимые листы "тянутся" какие-то формулы или "отношения" между ячейками. При ручном заполнении Эксель их автоматом корректирует (либо не совсем автоматом, с помощью каких-то макросов от авторов шаблона). Когда пишете программно, нужно тоже эти "отношения" указывать.
 
В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.
 
Можно мне тоже пример - открытие, вывод слова кириллицей, сохранение? energy-sv <собака> yandex <точка> ru (Да, из своих адресов нашел вот в тему "энергичный", специально добавлю к рабочему почтовому клиенту)
Стили ячеек (цвета, форматы) тоже своего рода отношения: на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек (ну в смысле наоборот ячейка указывает на стиль, но удобнее понимать так). Возможно именно указание на стиль портится, надо попробовать расковырять до уровня XML. Видимость листов наверно ГИС не принципиальна, но тоже интересный эффект.
 
Цитата
Basil пишет:
В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.
Basil, Спасибо за мейл-посылку! Я пока ещё не ковырялся, чуть позже посмотрю. Кириллица должна лечиться преобразованием в UTF-8. Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.) Видимость листов, думаю, легко поправить. За неё отвечает поле xl_sheets.State. Видимо, неправильно инициализируется в процедуре ReadSheetXML. Посмотрю сейчас.
А формулы, между прочим, в шаблоне ПД как раз должны быть. Надо бы найти, где сидят - и посмотреть, портятся ли.

Кстати, заметил, что если открыть даже пустой шаблон в Libre Office Calc и просто сохранить - содержимое заметно меняется. Вплоть до пропадания каких-то подкаталогов (\xl\printerSettings, \xl\theme, \xl\worksheets\_rels).

P.S. Очень удобно ковыряться в XLSX-файлах старым добрым FAR-ом. :) Он их открывает, как любые другие зипованные файлы - в виде каталогов. Всё видно хорошо. А если XML-файл попадётся - то IE вызовется. Тоже удобно смотреть. ;)
 
Цитата
two_oceans пишет:
на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек
Там даже есть файлик styles.xml ;) Пример отправил.
Цитата
AlcorVol пишет:
Кириллица должна лечиться преобразованием в UTF-8.
Я тоже так думаю. Но это нужно делать прямо в классе.
Цитата
AlcorVol пишет:
Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.)
Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.
Цитата
AlcorVol пишет:
А формулы, между прочим, в шаблоне ПД как раз должны быть.
Формул там нет (а нафига они нужны в данном случае). Есть только списки.
 
У нас в разделе нынче - праздник. Статус повысили с подфорума до форума. Появился "Быстрый ответ". Можно цитировать выделенный текст и не заморачиваться с дурацкими "QUOTE". Спасибо Хозяину!
Цитата
Basil пишет:
Формул там нет (а нафига они нужны в данном случае). Есть только списки.
Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"
Цитата
Basil пишет:
Я тоже так думаю. Но это нужно делать прямо в классе.
По уму - да, так и нужно, согласен полностью. Но пока я предпочёл бы экспериментировать с минимальными правками в коде класса. Хотя сегодня не удержался - и внёс пару правок для того, чтобы Visibility листов правильно в курсоре xl_sheets (в поле State) инициализировалась. Немножко подправил процедуры OpenXLSXWorkbook и ReadSheetXML (можно поискать по ключу "ShState") - и свойство видимости листа перестало игнорироваться. Проверено и просмотром курсора xl_sheets, и прямо в XLSX-файле после его сохранения.

Сохранял я файл пока без всяких занесений значений в ячейки. (Люблю всё последовательно делать: "Мы медленно-медленно спустимся с горки...") :) Но даже и без всяких правок заметно, что не всё хорошо. Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками. Надо бы и тут разобраться, прежде чем значения заносить. Но все листы вместе с признаками видимости сохранились нормально.
Примечание: у меня на ПК нет MS Office (принципиальное решение). Всё открываю с помощью Libre Office.

Прилагаю zip-архив с подправленным классом и моей маленькой тестовой программкой, которая не портит исходный файл.
 
Цитата
AlcorVol пишет:
Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"
Они считают на своей стороне (после загрузки) и пишут в файл с результатами загрузки.
Цитата
AlcorVol пишет:
Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками.
Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)
Осталось разобраться с форматами ячеек.
 
Цитата
Basil пишет:
Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)
Отлично, Basil! (Василий?) ;) Прекрасный пример работы коллективного разума. :)
Исправил, кириллица в заголовках появилась. Спасибо!
Цитата
Basil пишет:
Осталось разобраться с форматами ячеек.
Поясни ещё, пожалуйста, чуть подробнее, что именно там не так. Тоже поковыряюсь. Но имей в виду, что в экселевских таблицах я - ваще полный дуб. Много лет только с dbf-таблицами дело имел. Но в битиках-байтиках ковыряться всегда любил. Системным программистом когда-то работал. На доисторической ОС ЕС. :D
Цитата
Basil пишет:
AlcorVol писал(а):
Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки.

Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.
Очень буду удивлён, если выяснится, что читают в очках с цветными стёклами...
 
Цитата
AlcorVol пишет:
А формулы, между прочим, в шаблоне ПД как раз должны быть.

Фурмул там нет. Начисление возвращается уже при экспорте результата. Если бы там были формулы, то начисление было бы видно сразу.

Отправлено спустя 10 минуты 16 секунды:
Хотя я и работаю с XLSX из под Delphi может пригодиться такая концепция.
1. Копируете шаблон, например, в tmp.xlsx (на всякий случай);
2. Открываете tmp.xlsx и заполняете его.
3. Методом SaveAS (что-то подобное должно быть и VFP) сохраняете с нужным именем.
 
Цитата
AlcorVol пишет:
(Василий?) ;)
Нет. Просто Basil ;)
Цитата
AlcorVol пишет:
Поясни ещё, пожалуйста, чуть подробнее, что именно там не так.
Там пока в этой части всё не так. В шаблоне, например, колонка тарифов в денежном формате, колонки с объемами - с 6-ю знаками после запятой. Всё это слетает.
Цитата
AlcorVol пишет:
Очень буду удивлён, если выяснится, что читают в очках с цветными стёклами...
От них всего можно ожидать. ;) Кста, цвета я тоже восстановил, там и чтение и вывод были не совсем корректно сделаны. Могу выложить здесь или на мыло прислать.
 
Да да побольше примеров) Дома у меня стоит Office XP с пакетом совместимости (добавлю, пакет почему то считает, что язык системы - японский) для открытия XLSX. Итак, пакет совместимости вообще отказался открывать пересохраненный файл, выкинул строчку иероглифов. Открыл в Winrar - бросилось в глаза, что многие файлы по объему стали меньше, не говоря про отсутствие нескольких папок (те папки как я понимаю связаны с настройкой печати на принтер). В workbook.xml порезаны объявления именованных диапазонов и еще какие-то отношения с ними связанные. С именованными диапазонами я не особо знаком, но именно в таком расположены данные для списка - то есть список так работать не будет. Их нужно как-то аккуратно обработать чтоб не исчезли. styles.xml тоже ощутимо похудел.
 
Цитата
Basil пишет:
Там пока в этой части всё не так. В шаблоне, например, колонка тарифов в денежном формате, колонки с объемами - с 6-ю знаками после запятой. Всё это слетает.
А где это всё в XLSX-файле находится? (Чтоб самому долго не рыться. Просто интересно.) И ещё любопытно: в ГИС-овских шаблонах - там уже новоиспечённый перечёркнутый знак "Р" используется? Если так, то весьма вероятна ошибка в функции strconv(). Она старая. Как-то особо обрабатывать придётся. У "Рубля" UTF-8 - трёхзначный: E2 82 BD :!:
Цитата
Basil пишет:
Кста, цвета я тоже восстановил, там и чтение и вывод были не совсем корректно сделаны. Могу выложить здесь или на мыло прислать.
Потрясающая скорость! Какие методы правил? Лучше тут очередные версии выкладывать, мне кажется. Вдруг кто-то ещё подключится. Надо как-то сделать, чтобы расхождения не накапливались.
 
Цитата
AlcorVol пишет:
Надо как-то сделать, чтобы расхождения не накапливались.
Да, похоже для командной работы надо git осваивать и github.
 
Цитата
two_oceans пишет:
похоже для командной работы надо git осваивать и github.
Попробуем "малой кровью" обойтись, не усложняя проблем. Не такой уж мегапроект.
 
Цитата
AlcorVol пишет:
А где это всё в XLSX-файле находится?
А я пока и сам толком не знаю (нужно всё-таки поискать описание формата xlxs). Думаю, нужно начинать с файла со стилями.
Цитата
AlcorVol пишет:
И ещё любопытно: в ГИС-овских шаблонах - там уже новоиспечённый перечёркнутый знак "Р" используется?
Нет. Там примерно так: #,##0.00"р."
Цитата
AlcorVol пишет:
Какие методы правил?
В основном, ReadStylesXML и WriteStylesXML. Я не очень люблю VCX, поэтому перекинул класс в PRG, инструкция по подключению - в архиве.
Цитата
AlcorVol пишет:
Попробуем "малой кровью" обойтись, не усложняя проблем. Не такой уж мегапроект.
Я тоже так думаю. ;)
Цитата
two_oceans пишет:
Дома у меня стоит Office XP с пакетом совместимости
Мне этот пакет не очень нравится, когда-то были проблемы с открытием xlsx. Думаю, проще использовать Libre.
 
Цитата
Basil пишет:
нужно всё-таки поискать описание формата xlxs
;) Как в анекдоте прямо: если ничего не помогло - прочитай инструкцию.
Цитата
AlcorVol пишет:
Не такой уж мегапроект.
Согласен, но когда-то все равно придется.
Цитата
Basil пишет:
Мне этот пакет не очень нравится, когда-то были проблемы с открытием xlsx. Думаю, проще использовать Libre.
Я тоже мягко говоря "не в восторге", но скорее откажусь от xlsx в пользу xls, чем перееду с привычного офиса. Первая версия пакета совместимости вообще была ужасна, открывала файлы 2007 Экселя через раз, потом года через полтора стало получше, чего-то допиливают постоянно - теперь уже сохраненные в Экселе 2010 файлы открывает, но это к сожалению не решает основной проблемы конвертера - конвертированный файл в папке temp, имя из цифр и обычное "сохранить" не прокатит - файл просто сотрется при очистке временных файлов, надо каждый раз после конвертирования "сохранить как" и придавать осмысленное имя. Как будто было нельзя cконвертировать в ту же папку где исходный с исходным именем без X.
Цитата
трёхзначный: E2 82 BD
Неудивительно. Если вкратце, 1 байт UTF-8 нужен на символы Юникода до 007F (они не кодируются, просто отбрасывается байт 00 в начале), 2 байта 0080 по 07FF (кодирует 11 бит), 3 байта до FFFF(16 бит). То есть 3 байта UTF-8 достаточно чтобы закодировать любой символ из UTF-16. Каждый дополнительный байт UTF-8 позволяет кодировать на 5 бит больше (еще 3 бита добавляются в служебные) - максимальное число байт разное в разных версиях стандарта, вплоть до 6 байт (кодирует 31 бит из UTF-32). Служебные формируются так: В первом байте UTF-8 количество бит "1" в начале равно количеству байт в коде символа, далее идет разделительный бит "0". Второй и следующие байты начинаются с "10".
На примере символа рубля в UTF-8, E2 82 BD = [1110] 0010, [10]00 0010, [10]11 1101 в квадратных скобках служебные биты, собираем неслужебные, получим 0010 0000, 1011 1101 = 20 BD (символ рубля в UTF-16).
 
Цитата
two_oceans пишет:
но скорее откажусь от xlsx в пользу xls, чем перееду с привычного офиса.
Имелся в виду именно пакет совместимости. Я тоже использую office XP. А файлы docx/xlsx как вариант открываю в Libre и сохраняю в формате 97-2003.
 
Просмотрел PRG - много всего, есть именованные диапазоны и даже PageSetup. Из того, что бросилось в глаза - импортируется Sleep, этого всегда стараюсь избегать - в зависимости от реализации Sleep может вызывать 100% загрузку одного из ядер процессора. В WinXP+ более правильно - создать "пустое" событие (которое не может наступить) и "ждать" его указанное время функцией WaitForSingleObject.
 
Цитата
Basil пишет:
Думаю, нужно начинать с файла со стилями.
<...>Там примерно так: #,##0.00"р."
Точно! Есть похожие строки в styles.xml.
Цитата
Basil пишет:
Я не очень люблю VCX, поэтому перекинул класс в PRG
А как, если не секрет, ты это сделал? Я не нашёл таких средств в меню Class Browser'а...
Я тут совсем не опытен, к сожалению. Хоть и на VFP давно пишу, но стиль программирования - до сих пор процедурный, т.к. начинал ещё на FoxPro 2.0. С принципами ООП (и их реализацией в VFP) теоретически знаком, но на практике с классами пришлось столкнуться только сейчас.
Цитата
Basil пишет:
Думаю, проще использовать Libre.
Не то, чтобы "проще", а просто правильнее - в смысле общедоступности. Но проверять сгенерированные файлы в MS Excel'е всё равно придётся (поначалу). Раз уж эти умники выбрали сей продукт в качестве "стандарта".
Цитата
two_oceans пишет:
трёхзначный: E2 82 BD
Если вкратце, 1 байт UTF-8 нужен на символы Юникода до 007F <...>
Спасибо, Константин! К счастью, о том, что такое Юникод и его представления (UTF-8, UTF-16...) можно много где прочитать. Хоть даже прямо в Википедии. (Описание стандарта XLSX гораздо менее доступно. Да и вроде бы, там варианты есть.) Насчёт знака рубля (₽) я просто хотел сказать, что если он вдруг где-то попадётся, то обрабатывать его придётся особым образом: отображая на какой-нибудь редко используемый символ 1251. И не забывая об этом в процессе обратной перекодировки в UTF-8.
 
Цитата
two_oceans пишет:
Из того, что бросилось в глаза - импортируется Sleep
Со sleep там проблем нет - он используется однократно при распаковке/упаковке Zip.
Цитата
AlcorVol пишет:
Я не нашёл таких средств в меню Class Browser'а...
Нужно в окне Class Browser'а после открытия класса нажать кнопку "view class code". По стилю - я тоже начинал с fpd20 и часто использую процедурный.
Цитата
AlcorVol пишет:
Насчёт знака рубля (₽) я просто хотел сказать, что если он вдруг где-то попадётся, то обрабатывать его придётся особым образом
Кста, я посмотрел - в Excel знак рубля реализован. В формате ячейки при этом пишется знак доллара $, так что проблем не будет.

Выкладываю доработанную версию класса. Изменения:
- исправлено/восстановлено чтение формата ячеек.
- исправлена ошибка, приводившая к увеличению размера файла.
 
Цитата
Basil пишет:
Нужно в окне Class Browser'а после открытия класса нажать кнопку "view class code".
Убей меня бог - не вижу такой кнопки! Могу только по отдельности код методов просматривать (View -> Code). Или целиком всё - из Memo-поля Methods... Работаю в лицензионной VFP 9 (с последними изменениями). Можно поподробнее, по шагам? Для таких профи со стажем, как я? ;)
Цитата
Basil пишет:
Выкладываю доработанную версию класса. Изменения:
- исправлено/восстановлено чтение формата ячеек.
- исправлена ошибка, приводившая к увеличению размера файла.
Спасибо, круто! Посмотрю сейчас. Кстати, сегодня весь день изучаю, что ты там успел поправить. Задача непростая, т.к. мы не договорились свои правки никак помечать. Нашёл пока (тупо сравнивая версии) только некоторые твои изменения в методе ReadStylesXML (strc() для "quot;", а также учёт параметра "tint"). Было бы просто отлично (в смысле "командной работы"), если бы наши правки как-то помечались. Например, ты ставишь в своих строках комментарий &&_B (или * &&_B для блока строк) - будет ясно, что правил Basil. А я, сответственно, &&_V (Valery, Vologda).

Отправлено спустя 33 минуты 30 секунды:
Цитата
Basil пишет:
Кста, я посмотрел - в Excel знак рубля реализован. В формате ячейки при этом пишется знак доллара $, так что проблем не будет.
Прекрасно! Но где-то при этом должно быть указано, что этот $ в спецификации формата должен выглядеть на экране как знак рубля (а не доллара, фунта, евро, тугрика etc...) То есть, где-то в файле в этом случае этот самый знак рубля - с большой вероятностью - должен фигурировать. И кроме того, если посмотреть на чистый текст в денежных форматах в шаблоне ПД - то там мы увидим "р.". А если в следующих версиях им придёт в голову "₽" вместо этого поставить? Чё делать будем? ;)
 
Цитата
AlcorVol пишет:
Убей меня бог - не вижу такой кнопки!

Цитата
AlcorVol пишет:
Кстати, сегодня весь день изучаю, что ты там успел поправить.
Твои изменения - размер поля для имён листов и обработка скрытия листов у меня включены. Для сравнения исходников я использую Winmerge (рекомендую):
Цитата
http://winmerge.org/
WinMerge является Open Source инструментом сравнения и слияния для Windows. WinMerge может сравнивать как файлы, так и папки, отображая различия в визуальной текстовой форме, которые легко понять и обработать.
Отмечать места правок - когда-то пробовал, не очень удобно. Сейчас мне вполне хватает сравнения исходников.
Цитата
AlcorVol пишет:
твои изменения в методе ReadStylesXML (strconv() для "quot;", а также учёт параметра "tint")
Кста, не уверен, что сделано до конца правильно (описания-то нет ;) ) - в Excel цвета видны нормально, а вот в Libre - не все.

Отправлено спустя 7 минуты 5 секунды:
Цитата
AlcorVol пишет:
Прекрасно! Но где-то при этом должно быть указано, что этот $ в спецификации формата должен выглядеть на экране как знак рубля (а не доллара, фунта, евро, тугрика etc...)
Думаю, это зависит от локализации операционки, а $ - просто знак валюты.
Цитата
AlcorVol пишет:
А если в следующих версиях им придёт в голову "₽" вместо этого поставить? Чё делать будем? ;)
Будем решать вопросы по мере их поступления. ;)
 
Спасибо за скрин, Basil! Разобрался. Похоже, мне нужно очки покруче заказывать... :D
Цитата
Basil пишет:
Твои изменения - размер поля для имён листов и обработка скрытия листов у меня включены. Для сравнения исходников я использую Winmerge (рекомендую):
Хорошо, гляну. Спасибо!
Цитата
Basil пишет:
Отмечать места правок - когда-то пробовал, не очень удобно. Сейчас мне вполне хватает сравнения исходников.
Но ты всё же хотя бы как-то места правок хоть приблизительно помечай. Иначе - придётся тебя назначить "ответственным кодером". :) И просто присылать тебе изредка какие-то предложения и соображения по правке кода.
Цитата
Basil пишет:
в Excel цвета видны нормально, а вот в Libre - не все.
В данном случае на Libre - наплевать. И вообще, главный тест - это загрузка в ГИС.
Цитата
Basil пишет:
Думаю, это зависит от локализации операционки, а $ - просто знак валюты.
Если бы дела обстояли именно таким образом, то на одном ПК (и тем более, в одном и том же документе) нельзя было бы указывать денежные поля с разными валютами. Странновато и примитивно как-то... Не верится просто.
Цитата
Basil пишет:
Будем решать вопросы по мере их поступления.
А я люблю подстилать соломку заранее. ;) Подожди немножко, скоро вышлю тебе пару простеньких функций.
 
Итак: вот архив с двумя функциями, которые вполне могут заменить
strconv(..., 11) и strconv(..., 9).
И при этом ни знак рубля, ни прочий текст не пострадает. Ибо кодировка UTF-8 устроена достаточно мудро. ;)
 
Цитата
AlcorVol пишет:
Итак: вот архив с двумя функциями, которые вполне могут заменить
strconv(..., 11) и strconv(..., 9).
Предлагаешь вставить в класс?
Выкладываю доработанную версию класса. Изменения:
- доработана запись ячеек.
Теперь можно грузить в ГИС. Проверил на загрузке одного ПД - работает.
 
Цитата
Basil пишет:
Предлагаешь вставить в класс?
А почему бы и нет? На быстродействие вряд ли заметно повлияет :) , но соломка будет заранее подстелена. Вряд ли какие ещё в будущем дополнительные символы могут появиться, кроме Рубля. А Рубль появится (если не в ГИС ЖКХ, то где-нибудь ещё) практически со 100%-ной вероятностью.
Цитата
Basil пишет:
Выкладываю доработанную версию класса. Изменения:
- доработана запись ячеек.
Теперь можно грузить в ГИС. Проверил на загрузке одного ПД - работает.
Это не просто круто, это потрясающе! Спасибо! Прежде чем грузить, однако, очень хочу посмотреть на твои правки и с ними разобраться. Просто интересно.

Отправлено спустя 48 минуты 33 секунды:
Цитата
Basil пишет:
Предлагаешь вставить в класс?
P.S. Решение зависит от того, собираемся ли мы сделать класс достаточно универсальным (и будем ли выкладывать его на сайте VFPx). Для универсальности, конечно, неплохо бы проверять параметр "кодовая страница", передаваемый в класс при инициализации. Если не 1251 - то можно перекодировок и не делать.
 
Цитата
AlcorVol пишет:
Для универсальности, конечно, неплохо бы проверять параметр "кодовая страница", передаваемый в класс при инициализации. Если не 1251 - то можно перекодировок и не делать.
Есть ещё такой момент. В текущей схеме класс читает файл, преобразует строки из utf8 в 1251, внутри себя хранит в 1251, при вызовах методов принимает строки в 1251 и только при записи делает обратное преобразование 1251 -> utf8. И если в исходном файле в строке есть символ #A4, при записи он преобразуется в символ рубля, хотя это не требовалось. Решение тут одно - нужно внутри хранить строки в utf8. Так что я повременил бы с добавлением этой функции.
 
;)
Цитата
Basil пишет:
И если в исходном файле в строке есть символ #A4, при записи он преобразуется в символ рубля, хотя это не требовалось.
Согласен, есть такое дело. Идеальных решений тут вообще не существует. Ведь теоретически в файле и такое может появиться: 你好! А вовсе не только #A4. ;)
Цитата
Basil пишет:
Решение тут одно - нужно внутри хранить строки в utf8.
Oh, yes! Правда, VFP к этому как-то не очень приспособлена. Проблем будет куча. И кстати, имена листов уже кто-то там в 1251 перекодирует. Я бы предпочёл в 1251 работать. Для ГИС ЖКХ - точно будет достаточно того, что есть. Особенно, если Рубль добавить.
Цитата
Basil пишет:
Так что я повременил бы с добавлением этой функции.
А я особенно и не настаиваю. Всегда потом вставить можно будет, если чё. ;)
#1
0 0
Тема заведена для обмена опытом в области работы с файлами формата XLSX (в разных средах программирования и разными средствами). Особенно интересен случай, когда MS Office Excel на компьютере вообще не установлен. Предлагается обсуждать только бесплатные решения.
=====================================
Начать хотелось бы со среды Visual FoxPro (VFP), в которой программирую я сам, но могут быть рассмотрены самые разные общедоступные средства для среды Windows (открытые DLL-библиотеки).
-----------------------------------------------------------
Цитата
Basil пишет:
Цитата
AlcorVol пишет:
Интересно, использовали ли тот же проект (https://vfpx.codeplex.com/wikipage?title=XLSXWorkbook), что и я осваиваю сейчас?
Нет, я по старинке: createobject('excel.application')
А с этим проектом скорее всего не получится. Я его попробовал: открыл шаблон ПД, заполнил одну ячейку и сохранил. После этого данный шаблон в excel открывается с ошибками.
Итак, речь идёт о проекте VFPxWorkbookXLSX для VFP. Ввиду того, что проект - открытый, можно программный код модифицировать. Так что, есть надежда справиться с какими-то неприятностями. Вот конкретный пример. Попробовал почитать (на основе примера readXLSXfile.prg) файл со списком помещений и ЛС для МКД, выгруженный из ГИС ЖКХ в ЛК. Почти всё почти сразу получилось. За исключением одного нюанса: в книге - два открытых (visible) листа: "Идентификаторы помещений ГИСЖКХ" и "ЕЛС". Однако название первого оказалось обрезанным до 30 символов: "... ГИСЖК". Найти причину (и устранить ошибку) получилось довольно быстро. Метод (процедура) CreateWorkingCursors создаёт временные таблицы (курсоры), в которые выгружает всю информацию книги. Для списка листов создаётся курсор xl_sheets:
CREATE CURSOR xl_sheets (workbook I, sheet I, shname C(30), ... )
Заменяем shname C(30) на shname C(40) - и всё заработало, как надо. Кстати, имена листов тут уже оказываются перекодированными из UTF-8 в 1251. Чего не скажешь о значениях полей. Но функция STRCONV() легко решает эту задачу:
lcValue = strconv(lcValue, 11)

Заполнять ячейки я пока не пробовал. Basil говорит, что у него нечто нечитаемое получается. Возможно, дело как раз в перекодировках (обратная 1251 -> UTF-8 делается так : lcValue = strconv(lcValue, 9) ). Может быть, дело и в чём-то другом. Поэтому попросил бы Basil'а прислать мне на email: alcor <собака> vologda <точка> ru тестовый XLSX-файл и программку. Хотел бы поэкспериментировать и сам. Как добавлять строки в шаблон - пока не разобрался. Похоже, что писать можно в любую ячейку любой строки методом SetCellValue. Даже если такой строки ещё и не было. Какие тут у тебя мысли, Basil?
#2
0 0
Там проблема не в самой записи, а в том, что в шаблонах есть скрытые листы, списки и т.п. и всё это некорректно сохраняется. То есть, если даже шаблон просто открыть и сохранить, ничего не меняя, результат будет плачевным. Пример отправил.
#3
0 0
Кажется, примерно представляю в чем может быть проблема. Если есть скрытые листы, то скорее всего они не просто так, и на видимые листы "тянутся" какие-то формулы или "отношения" между ячейками. При ручном заполнении Эксель их автоматом корректирует (либо не совсем автоматом, с помощью каких-то макросов от авторов шаблона). Когда пишете программно, нужно тоже эти "отношения" указывать.
#4
0 0
В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.
#5
0 0
Можно мне тоже пример - открытие, вывод слова кириллицей, сохранение? energy-sv <собака> yandex <точка> ru (Да, из своих адресов нашел вот в тему "энергичный", специально добавлю к рабочему почтовому клиенту)
Стили ячеек (цвета, форматы) тоже своего рода отношения: на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек (ну в смысле наоборот ячейка указывает на стиль, но удобнее понимать так). Возможно именно указание на стиль портится, надо попробовать расковырять до уровня XML. Видимость листов наверно ГИС не принципиальна, но тоже интересный эффект.
#6
0 0
Цитата
Basil пишет:
В данном случае формул там нет. На скрытом листе хранится номер версии шаблона. Проблемы другого плана:
1. неверно читается кириллица, соответственно при сохранении вместо неё - мусор.
2. слетают форматы ячеек.
3. меняются цвета заливки ячеек - шапки таблиц становятся черно/синими.
4. скрытые листы становятся видимыми.
Нужно поковырять этот класс - скорее всего, всё это удастся поправить.
Basil, Спасибо за мейл-посылку! Я пока ещё не ковырялся, чуть позже посмотрю. Кириллица должна лечиться преобразованием в UTF-8. Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.) Видимость листов, думаю, легко поправить. За неё отвечает поле xl_sheets.State. Видимо, неправильно инициализируется в процедуре ReadSheetXML. Посмотрю сейчас.
А формулы, между прочим, в шаблоне ПД как раз должны быть. Надо бы найти, где сидят - и посмотреть, портятся ли.

Кстати, заметил, что если открыть даже пустой шаблон в Libre Office Calc и просто сохранить - содержимое заметно меняется. Вплоть до пропадания каких-то подкаталогов (\xl\printerSettings, \xl\theme, \xl\worksheets\_rels).

P.S. Очень удобно ковыряться в XLSX-файлах старым добрым FAR-ом. :) Он их открывает, как любые другие зипованные файлы - в виде каталогов. Всё видно хорошо. А если XML-файл попадётся - то IE вызовется. Тоже удобно смотреть. ;)
#7
0 0
Цитата
two_oceans пишет:
на самом деле Эксель не устанавливает свойства каждой ячейки, а создает стиль ячейки и цепляет к нему список ячеек
Там даже есть файлик styles.xml ;) Пример отправил.
Цитата
AlcorVol пишет:
Кириллица должна лечиться преобразованием в UTF-8.
Я тоже так думаю. Но это нужно делать прямо в классе.
Цитата
AlcorVol пишет:
Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки. (В инструкциях сказано, что нельзя менять формулы.)
Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.
Цитата
AlcorVol пишет:
А формулы, между прочим, в шаблоне ПД как раз должны быть.
Формул там нет (а нафига они нужны в данном случае). Есть только списки.
#8
0 0
У нас в разделе нынче - праздник. Статус повысили с подфорума до форума. Появился "Быстрый ответ". Можно цитировать выделенный текст и не заморачиваться с дурацкими "QUOTE". Спасибо Хозяину!
Цитата
Basil пишет:
Формул там нет (а нафига они нужны в данном случае). Есть только списки.
Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"
Цитата
Basil пишет:
Я тоже так думаю. Но это нужно делать прямо в классе.
По уму - да, так и нужно, согласен полностью. Но пока я предпочёл бы экспериментировать с минимальными правками в коде класса. Хотя сегодня не удержался - и внёс пару правок для того, чтобы Visibility листов правильно в курсоре xl_sheets (в поле State) инициализировалась. Немножко подправил процедуры OpenXLSXWorkbook и ReadSheetXML (можно поискать по ключу "ShState") - и свойство видимости листа перестало игнорироваться. Проверено и просмотром курсора xl_sheets, и прямо в XLSX-файле после его сохранения.

Сохранял я файл пока без всяких занесений значений в ячейки. (Люблю всё последовательно делать: "Мы медленно-медленно спустимся с горки...") :) Но даже и без всяких правок заметно, что не всё хорошо. Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками. Надо бы и тут разобраться, прежде чем значения заносить. Но все листы вместе с признаками видимости сохранились нормально.
Примечание: у меня на ПК нет MS Office (принципиальное решение). Всё открываю с помощью Libre Office.

Прилагаю zip-архив с подправленным классом и моей маленькой тестовой программкой, которая не портит исходный файл.
diskette.jpg (87.54 КБ)
#9
0 0
Цитата
AlcorVol пишет:
Возможно, и так. Но я тогда не совсем понимаю смысл всех этих полей с заголовками типа:
"(РАССЧИТАНО ГИС ЖКХ)"
Они считают на своей стороне (после загрузки) и пишут в файл с результатами загрузки.
Цитата
AlcorVol пишет:
Русские заголовки в сохранённом файле не читаются правильно. Видно, что кодировка двухбайтовая (как для UТF-8), но воспринимается как однобайтовая - какая-то европейская с диакритиками.
Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)
Осталось разобраться с форматами ячеек.
#10
0 0
Цитата
Basil пишет:
Для починки кириллицы нужно в методе ReadSharedStringsXML перед записью в xl_strings вставить строку:
lcText = strconv(lcText, 11)
Отлично, Basil! (Василий?) ;) Прекрасный пример работы коллективного разума. :)
Исправил, кириллица в заголовках появилась. Спасибо!
Цитата
Basil пишет:
Осталось разобраться с форматами ячеек.
Поясни ещё, пожалуйста, чуть подробнее, что именно там не так. Тоже поковыряюсь. Но имей в виду, что в экселевских таблицах я - ваще полный дуб. Много лет только с dbf-таблицами дело имел. Но в битиках-байтиках ковыряться всегда любил. Системным программистом когда-то работал. На доисторической ОС ЕС. :D
Цитата
Basil пишет:
AlcorVol писал(а):
Не знаю, как насчёт форматов, но цвета, надеюсь, не очень важны для загрузки.

Сложно сказать, важны или нет. Мы ж не знаем, как они читают эти шаблоны.
Очень буду удивлён, если выяснится, что читают в очках с цветными стёклами...
#11
0 0
Цитата
AlcorVol пишет:
А формулы, между прочим, в шаблоне ПД как раз должны быть.

Фурмул там нет. Начисление возвращается уже при экспорте результата. Если бы там были формулы, то начисление было бы видно сразу.

Отправлено спустя 10 минуты 16 секунды:
Хотя я и работаю с XLSX из под Delphi может пригодиться такая концепция.
1. Копируете шаблон, например, в tmp.xlsx (на всякий случай);
2. Открываете tmp.xlsx и заполняете его.
3. Методом SaveAS (что-то подобное должно быть и VFP) сохраняете с нужным именем.
#12
0 0
Цитата
AlcorVol пишет:
(Василий?) ;)
Нет. Просто Basil ;)
Цитата
AlcorVol пишет:
Поясни ещё, пожалуйста, чуть подробнее, что именно там не так.
Там пока в этой части всё не так. В шаблоне, например, колонка тарифов в денежном формате, колонки с объемами - с 6-ю знаками после запятой. Всё это слетает.
Цитата
AlcorVol пишет:
Очень буду удивлён, если выяснится, что читают в очках с цветными стёклами...
От них всего можно ожидать. ;) Кста, цвета я тоже восстановил, там и чтение и вывод были не совсем корректно сделаны. Могу выложить здесь или на мыло прислать.
#13
0 0
Да да побольше примеров) Дома у меня стоит Office XP с пакетом совместимости (добавлю, пакет почему то считает, что язык системы - японский) для открытия XLSX. Итак, пакет совместимости вообще отказался открывать пересохраненный файл, выкинул строчку иероглифов. Открыл в Winrar - бросилось в глаза, что многие файлы по объему стали меньше, не говоря про отсутствие нескольких папок (те папки как я понимаю связаны с настройкой печати на принтер). В workbook.xml порезаны объявления именованных диапазонов и еще какие-то отношения с ними связанные. С именованными диапазонами я не особо знаком, но именно в таком расположены данные для списка - то есть список так работать не будет. Их нужно как-то аккуратно обработать чтоб не исчезли. styles.xml тоже ощутимо похудел.
#14
0 0
Цитата
Basil пишет:
Там пока в этой части всё не так. В шаблоне, например, колонка тарифов в денежном формате, колонки с объемами - с 6-ю знаками после запятой. Всё это слетает.
А где это всё в XLSX-файле находится? (Чтоб самому долго не рыться. Просто интересно.) И ещё любопытно: в ГИС-овских шаблонах - там уже новоиспечённый перечёркнутый знак "Р" используется? Если так, то весьма вероятна ошибка в функции strconv(). Она старая. Как-то особо обрабатывать придётся. У "Рубля" UTF-8 - трёхзначный: E2 82 BD :!:
Цитата
Basil пишет:
Кста, цвета я тоже восстановил, там и чтение и вывод были не совсем корректно сделаны. Могу выложить здесь или на мыло прислать.
Потрясающая скорость! Какие методы правил? Лучше тут очередные версии выкладывать, мне кажется. Вдруг кто-то ещё подключится. Надо как-то сделать, чтобы расхождения не накапливались.
#15
0 0
Цитата
AlcorVol пишет:
Надо как-то сделать, чтобы расхождения не накапливались.
Да, похоже для командной работы надо git осваивать и github.
#16
0 0
Цитата
two_oceans пишет:
похоже для командной работы надо git осваивать и github.
Попробуем "малой кровью" обойтись, не усложняя проблем. Не такой уж мегапроект.
#17
0 0
Цитата
AlcorVol пишет:
А где это всё в XLSX-файле находится?
А я пока и сам толком не знаю (нужно всё-таки поискать описание формата xlxs). Думаю, нужно начинать с файла со стилями.
Цитата
AlcorVol пишет:
И ещё любопытно: в ГИС-овских шаблонах - там уже новоиспечённый перечёркнутый знак "Р" используется?
Нет. Там примерно так: #,##0.00"р."
Цитата
AlcorVol пишет:
Какие методы правил?
В основном, ReadStylesXML и WriteStylesXML. Я не очень люблю VCX, поэтому перекинул класс в PRG, инструкция по подключению - в архиве.
Цитата
AlcorVol пишет:
Попробуем "малой кровью" обойтись, не усложняя проблем. Не такой уж мегапроект.
Я тоже так думаю. ;)
Цитата
two_oceans пишет:
Дома у меня стоит Office XP с пакетом совместимости
Мне этот пакет не очень нравится, когда-то были проблемы с открытием xlsx. Думаю, проще использовать Libre.
#18
0 0
Цитата
Basil пишет:
нужно всё-таки поискать описание формата xlxs
;) Как в анекдоте прямо: если ничего не помогло - прочитай инструкцию.
Цитата
AlcorVol пишет:
Не такой уж мегапроект.
Согласен, но когда-то все равно придется.
Цитата
Basil пишет:
Мне этот пакет не очень нравится, когда-то были проблемы с открытием xlsx. Думаю, проще использовать Libre.
Я тоже мягко говоря "не в восторге", но скорее откажусь от xlsx в пользу xls, чем перееду с привычного офиса. Первая версия пакета совместимости вообще была ужасна, открывала файлы 2007 Экселя через раз, потом года через полтора стало получше, чего-то допиливают постоянно - теперь уже сохраненные в Экселе 2010 файлы открывает, но это к сожалению не решает основной проблемы конвертера - конвертированный файл в папке temp, имя из цифр и обычное "сохранить" не прокатит - файл просто сотрется при очистке временных файлов, надо каждый раз после конвертирования "сохранить как" и придавать осмысленное имя. Как будто было нельзя cконвертировать в ту же папку где исходный с исходным именем без X.
Цитата
трёхзначный: E2 82 BD
Неудивительно. Если вкратце, 1 байт UTF-8 нужен на символы Юникода до 007F (они не кодируются, просто отбрасывается байт 00 в начале), 2 байта 0080 по 07FF (кодирует 11 бит), 3 байта до FFFF(16 бит). То есть 3 байта UTF-8 достаточно чтобы закодировать любой символ из UTF-16. Каждый дополнительный байт UTF-8 позволяет кодировать на 5 бит больше (еще 3 бита добавляются в служебные) - максимальное число байт разное в разных версиях стандарта, вплоть до 6 байт (кодирует 31 бит из UTF-32). Служебные формируются так: В первом байте UTF-8 количество бит "1" в начале равно количеству байт в коде символа, далее идет разделительный бит "0". Второй и следующие байты начинаются с "10".
На примере символа рубля в UTF-8, E2 82 BD = [1110] 0010, [10]00 0010, [10]11 1101 в квадратных скобках служебные биты, собираем неслужебные, получим 0010 0000, 1011 1101 = 20 BD (символ рубля в UTF-16).
#19
0 0
Цитата
two_oceans пишет:
но скорее откажусь от xlsx в пользу xls, чем перееду с привычного офиса.
Имелся в виду именно пакет совместимости. Я тоже использую office XP. А файлы docx/xlsx как вариант открываю в Libre и сохраняю в формате 97-2003.
#20
0 0
Просмотрел PRG - много всего, есть именованные диапазоны и даже PageSetup. Из того, что бросилось в глаза - импортируется Sleep, этого всегда стараюсь избегать - в зависимости от реализации Sleep может вызывать 100% загрузку одного из ядер процессора. В WinXP+ более правильно - создать "пустое" событие (которое не может наступить) и "ждать" его указанное время функцией WaitForSingleObject.
#21
0 0
Цитата
Basil пишет:
Думаю, нужно начинать с файла со стилями.
<...>Там примерно так: #,##0.00"р."
Точно! Есть похожие строки в styles.xml.
Цитата
Basil пишет:
Я не очень люблю VCX, поэтому перекинул класс в PRG
А как, если не секрет, ты это сделал? Я не нашёл таких средств в меню Class Browser'а...
Я тут совсем не опытен, к сожалению. Хоть и на VFP давно пишу, но стиль программирования - до сих пор процедурный, т.к. начинал ещё на FoxPro 2.0. С принципами ООП (и их реализацией в VFP) теоретически знаком, но на практике с классами пришлось столкнуться только сейчас.
Цитата
Basil пишет:
Думаю, проще использовать Libre.
Не то, чтобы "проще", а просто правильнее - в смысле общедоступности. Но проверять сгенерированные файлы в MS Excel'е всё равно придётся (поначалу). Раз уж эти умники выбрали сей продукт в качестве "стандарта".
Цитата
two_oceans пишет:
трёхзначный: E2 82 BD
Если вкратце, 1 байт UTF-8 нужен на символы Юникода до 007F <...>
Спасибо, Константин! К счастью, о том, что такое Юникод и его представления (UTF-8, UTF-16...) можно много где прочитать. Хоть даже прямо в Википедии. (Описание стандарта XLSX гораздо менее доступно. Да и вроде бы, там варианты есть.) Насчёт знака рубля (₽) я просто хотел сказать, что если он вдруг где-то попадётся, то обрабатывать его придётся особым образом: отображая на какой-нибудь редко используемый символ 1251. И не забывая об этом в процессе обратной перекодировки в UTF-8.
#22
0 0
Цитата
two_oceans пишет:
Из того, что бросилось в глаза - импортируется Sleep
Со sleep там проблем нет - он используется однократно при распаковке/упаковке Zip.
Цитата
AlcorVol пишет:
Я не нашёл таких средств в меню Class Browser'а...
Нужно в окне Class Browser'а после открытия класса нажать кнопку "view class code". По стилю - я тоже начинал с fpd20 и часто использую процедурный.
Цитата
AlcorVol пишет:
Насчёт знака рубля (₽) я просто хотел сказать, что если он вдруг где-то попадётся, то обрабатывать его придётся особым образом
Кста, я посмотрел - в Excel знак рубля реализован. В формате ячейки при этом пишется знак доллара $, так что проблем не будет.

Выкладываю доработанную версию класса. Изменения:
- исправлено/восстановлено чтение формата ячеек.
- исправлена ошибка, приводившая к увеличению размера файла.
#23
0 0
Цитата
Basil пишет:
Нужно в окне Class Browser'а после открытия класса нажать кнопку "view class code".
Убей меня бог - не вижу такой кнопки! Могу только по отдельности код методов просматривать (View -> Code). Или целиком всё - из Memo-поля Methods... Работаю в лицензионной VFP 9 (с последними изменениями). Можно поподробнее, по шагам? Для таких профи со стажем, как я? ;)
Цитата
Basil пишет:
Выкладываю доработанную версию класса. Изменения:
- исправлено/восстановлено чтение формата ячеек.
- исправлена ошибка, приводившая к увеличению размера файла.
Спасибо, круто! Посмотрю сейчас. Кстати, сегодня весь день изучаю, что ты там успел поправить. Задача непростая, т.к. мы не договорились свои правки никак помечать. Нашёл пока (тупо сравнивая версии) только некоторые твои изменения в методе ReadStylesXML (strc() для "quot;", а также учёт параметра "tint"). Было бы просто отлично (в смысле "командной работы"), если бы наши правки как-то помечались. Например, ты ставишь в своих строках комментарий &&_B (или * &&_B для блока строк) - будет ясно, что правил Basil. А я, сответственно, &&_V (Valery, Vologda).

Отправлено спустя 33 минуты 30 секунды:
Цитата
Basil пишет:
Кста, я посмотрел - в Excel знак рубля реализован. В формате ячейки при этом пишется знак доллара $, так что проблем не будет.
Прекрасно! Но где-то при этом должно быть указано, что этот $ в спецификации формата должен выглядеть на экране как знак рубля (а не доллара, фунта, евро, тугрика etc...) То есть, где-то в файле в этом случае этот самый знак рубля - с большой вероятностью - должен фигурировать. И кроме того, если посмотреть на чистый текст в денежных форматах в шаблоне ПД - то там мы увидим "р.". А если в следующих версиях им придёт в голову "₽" вместо этого поставить? Чё делать будем? ;)
#24
0 0
Цитата
AlcorVol пишет:
Убей меня бог - не вижу такой кнопки!

Цитата
AlcorVol пишет:
Кстати, сегодня весь день изучаю, что ты там успел поправить.
Твои изменения - размер поля для имён листов и обработка скрытия листов у меня включены. Для сравнения исходников я использую Winmerge (рекомендую):
Цитата
http://winmerge.org/
WinMerge является Open Source инструментом сравнения и слияния для Windows. WinMerge может сравнивать как файлы, так и папки, отображая различия в визуальной текстовой форме, которые легко понять и обработать.
Отмечать места правок - когда-то пробовал, не очень удобно. Сейчас мне вполне хватает сравнения исходников.
Цитата
AlcorVol пишет:
твои изменения в методе ReadStylesXML (strconv() для "quot;", а также учёт параметра "tint")
Кста, не уверен, что сделано до конца правильно (описания-то нет ;) ) - в Excel цвета видны нормально, а вот в Libre - не все.

Отправлено спустя 7 минуты 5 секунды:
Цитата
AlcorVol пишет:
Прекрасно! Но где-то при этом должно быть указано, что этот $ в спецификации формата должен выглядеть на экране как знак рубля (а не доллара, фунта, евро, тугрика etc...)
Думаю, это зависит от локализации операционки, а $ - просто знак валюты.
Цитата
AlcorVol пишет:
А если в следующих версиях им придёт в голову "₽" вместо этого поставить? Чё делать будем? ;)
Будем решать вопросы по мере их поступления. ;)
#25
0 0
Спасибо за скрин, Basil! Разобрался. Похоже, мне нужно очки покруче заказывать... :D
Цитата
Basil пишет:
Твои изменения - размер поля для имён листов и обработка скрытия листов у меня включены. Для сравнения исходников я использую Winmerge (рекомендую):
Хорошо, гляну. Спасибо!
Цитата
Basil пишет:
Отмечать места правок - когда-то пробовал, не очень удобно. Сейчас мне вполне хватает сравнения исходников.
Но ты всё же хотя бы как-то места правок хоть приблизительно помечай. Иначе - придётся тебя назначить "ответственным кодером". :) И просто присылать тебе изредка какие-то предложения и соображения по правке кода.
Цитата
Basil пишет:
в Excel цвета видны нормально, а вот в Libre - не все.
В данном случае на Libre - наплевать. И вообще, главный тест - это загрузка в ГИС.
Цитата
Basil пишет:
Думаю, это зависит от локализации операционки, а $ - просто знак валюты.
Если бы дела обстояли именно таким образом, то на одном ПК (и тем более, в одном и том же документе) нельзя было бы указывать денежные поля с разными валютами. Странновато и примитивно как-то... Не верится просто.
Цитата
Basil пишет:
Будем решать вопросы по мере их поступления.
А я люблю подстилать соломку заранее. ;) Подожди немножко, скоро вышлю тебе пару простеньких функций.
#26
0 0
Итак: вот архив с двумя функциями, которые вполне могут заменить
strconv(..., 11) и strconv(..., 9).
И при этом ни знак рубля, ни прочий текст не пострадает. Ибо кодировка UTF-8 устроена достаточно мудро. ;)
#27
0 0
Цитата
AlcorVol пишет:
Итак: вот архив с двумя функциями, которые вполне могут заменить
strconv(..., 11) и strconv(..., 9).
Предлагаешь вставить в класс?
Выкладываю доработанную версию класса. Изменения:
- доработана запись ячеек.
Теперь можно грузить в ГИС. Проверил на загрузке одного ПД - работает.
#28
0 0
Цитата
Basil пишет:
Предлагаешь вставить в класс?
А почему бы и нет? На быстродействие вряд ли заметно повлияет :) , но соломка будет заранее подстелена. Вряд ли какие ещё в будущем дополнительные символы могут появиться, кроме Рубля. А Рубль появится (если не в ГИС ЖКХ, то где-нибудь ещё) практически со 100%-ной вероятностью.
Цитата
Basil пишет:
Выкладываю доработанную версию класса. Изменения:
- доработана запись ячеек.
Теперь можно грузить в ГИС. Проверил на загрузке одного ПД - работает.
Это не просто круто, это потрясающе! Спасибо! Прежде чем грузить, однако, очень хочу посмотреть на твои правки и с ними разобраться. Просто интересно.

Отправлено спустя 48 минуты 33 секунды:
Цитата
Basil пишет:
Предлагаешь вставить в класс?
P.S. Решение зависит от того, собираемся ли мы сделать класс достаточно универсальным (и будем ли выкладывать его на сайте VFPx). Для универсальности, конечно, неплохо бы проверять параметр "кодовая страница", передаваемый в класс при инициализации. Если не 1251 - то можно перекодировок и не делать.
#29
0 0
Цитата
AlcorVol пишет:
Для универсальности, конечно, неплохо бы проверять параметр "кодовая страница", передаваемый в класс при инициализации. Если не 1251 - то можно перекодировок и не делать.
Есть ещё такой момент. В текущей схеме класс читает файл, преобразует строки из utf8 в 1251, внутри себя хранит в 1251, при вызовах методов принимает строки в 1251 и только при записи делает обратное преобразование 1251 -> utf8. И если в исходном файле в строке есть символ #A4, при записи он преобразуется в символ рубля, хотя это не требовалось. Решение тут одно - нужно внутри хранить строки в utf8. Так что я повременил бы с добавлением этой функции.
#30
0 0
;)
Цитата
Basil пишет:
И если в исходном файле в строке есть символ #A4, при записи он преобразуется в символ рубля, хотя это не требовалось.
Согласен, есть такое дело. Идеальных решений тут вообще не существует. Ведь теоретически в файле и такое может появиться: 你好! А вовсе не только #A4. ;)
Цитата
Basil пишет:
Решение тут одно - нужно внутри хранить строки в utf8.
Oh, yes! Правда, VFP к этому как-то не очень приспособлена. Проблем будет куча. И кстати, имена листов уже кто-то там в 1251 перекодирует. Я бы предпочёл в 1251 работать. Для ГИС ЖКХ - точно будет достаточно того, что есть. Особенно, если Рубль добавить.
Цитата
Basil пишет:
Так что я повременил бы с добавлением этой функции.
А я особенно и не настаиваю. Всегда потом вставить можно будет, если чё. ;)
Сейчас на форуме никого нет :(
Сейчас на форуме никого нет :(

Подпишись на рассылку новостей ЖКХ, а также наших статей!

Спасибо, вы успешно подписались на рассылку!