Есть такая нужда — перевести CSV формат в XLS
Сделать это чисто в лоб-задача тривиальная. Даже уже сделано это.
НО заказчик поставил условие, что надо еще и форматирование накладывать
при "переводе". Но понятно же, что в CSV самом нет никаких меток, описывающих формат.
Типа вот эти данные должны быть в ячейке 4:5, быть жирными, иметь шрифт такой то,
размер шрифта такой то, цвет такой-то....
Значит надо создать некий формуляр-дополняющий CSV файл и содержащий описание
форматирования каждой строки, хранящейся в самом CSV. Причем эта строка в CSV может
содержать, как вы понимаете, данные нескольких ячеек, лежащих на одной строке в excel таблице.
И, следовательно, на одну строку(описывающую несколько ячеек) в CSV надо иметь возможность
наложить форматирование на каждую ячейку с данными, описанную в этой строке.
Так вот вопрос — как бы вы составили такое описание, справочник, если хотите?
Здравствуйте, Аноним, Вы писали:
А>Так вот вопрос — как бы вы составили такое описание, справочник, если хотите?
Для начала бы узнал у заказчика, что он на самом деле хочет? Потому что такое ощущение, что если только у вас не заказывают универсальную библиотеку по конвертации файлов, скорее всего заказчику просто нужна красивая таблица для печати отчета какого-нибудь.
Re[2]: вопрос про CSV и XLS файлы
От:
Аноним
Дата:
15.02.13 05:18
Оценка:
все верно — нужна красивая табличка.
НО — слово заказчик — собирательное. Т.е. первому нужна табличка вот в такой форме — второму — в такой, третьему в сякой....
А исходные тупо текстовые данные для этого у меня в CSV. А значит под каждого придется код конвертора подстраивать.
Это глупо — вот если бы можно было описать в общем виде требования к оформлению, привязанному к конкретному заказчику.
Правда как я тут думал сложности тут большие. К примеру у заказчика N — в его отчете идет:
-----------------------------------
строка текста(одиночная)
строка текста(вписанная в несколько ячеек, необязательно соседних, но находящихся на одной строке)
таблица
строка текста
строка текста
таблица
===================================
И у меня есть соответствующий ему CSV файл — то сходу я не пойму — как мне узнать, где в CSV файле таблица
заканчивается/начинается, а где просто текст идет. Вот в приведенном выше примере — строка№2 по сути
в CSV файле не отличается от первой строки(заголовка) таблицы, начинающейся со строки№3. Т.е. там точно
так же будут несколько слов, разделенных точкой с запятой. НО заказчику важно, чтоб эту строку
текста из CSV файла (именно просто строку текста!) отформатировать по особому — отличительно от заголовка
нижеследующей по ходу документа таблицы, т.е. по сути от следующей строки с данными в CSV файле.
Но в нем же между этими строками разницы нет! И вот как это требование описать.....
Здравствуйте, Аноним, Вы писали:
А>Есть такая нужда — перевести CSV формат в XLS
<> А>Так вот вопрос — как бы вы составили такое описание, справочник, если хотите?
Я бы взял XLS-файл-заготовку (с расставленным форматированием, но без данных), взял CSV с данными, и совместил одно с другим.
На питоне с использованием xlrd / xlwt / xlutils это делается сравнительно просто.
На Excel OLE/COM — тоже, наверно, несложно.
Если дизайн таблицы более затейливый, чем
ШАПКА1 ШАПКА2 ШАПКА3 ... ШАПКА_n
данные1 данные2 данные3 ... данные_n
данные1 данные2 данные3 ... данные_n
данные1 данные2 данные3 ... данные_n
данные1 данные2 данные3 ... данные_n
(и так все 65535 строк)
а, скажем, каждую чётную и нечётную строки надо форматировать по-разному, то скрипт на васике или питоне должен будет брать нужный формат из нужных строк заготовки
ШАПКА_1 ШАПКА_2 ... ШАПКА_n -- формат и текст шапки (текст может даже не входить в CSV)
нечет_1 нечет_2 ... нечет_n
чет_1 чет_2 ... чет_n
ИТОГ_1 ИТОГ_2 ... ИТОГ_n -- оформление последней строки
Для совсем кудрявого оформления — придётся изобрести какой-нибудь язык описания шаблонов (вплоть до того, что вручную всё наскриптовать)...
Возможно, что проще будет экспортировать не в XLS, а в HTML.
Перекуём баги на фичи!
Re[2]: вопрос про CSV и XLS файлы
От:
Аноним
Дата:
16.02.13 05:33
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Есть такая нужда — перевести CSV формат в XLS К><> А>>Так вот вопрос — как бы вы составили такое описание, справочник, если хотите?
К>Я бы взял XLS-файл-заготовку (с расставленным форматированием, но без данных), взял CSV с данными, и совместил одно с другим.
Будут присылать XLS файлы и с данными(чуток их) И С форматированием для примера.
К>На питоне с использованием xlrd / xlwt / xlutils это делается сравнительно просто.
питон не знаю и учить не хочу — мне и С++ по шею хватает))) К>На Excel OLE/COM — тоже, наверно, несложно.
Доступа нет — под линуксом все делается.
К>Если дизайн таблицы более затейливый, чем
........
Более чем..
К>Для совсем кудрявого оформления — придётся изобрести какой-нибудь язык описания шаблонов (вплоть до того, что вручную всё наскриптовать)...
Да — может быть ооочень кудряво. Но если все вручную и кодировать — то выйдет как то так: надо подготовить С++ проект — чтоб он глотал разные подготовленные шаблоны кодирования. Ибо для создания XLS файла будет вызывать мой бинарник с передачей параметров и все. Т.е. уже внутри мне надо наготовить кучу шаблонов форматирования. Типа просто тупо наделать кучу функций и вызывать в зависимости от параметра "ИМЯ_ЗАКАЗЧИКА"
К>Возможно, что проще будет экспортировать не в XLS, а в HTML.
Нет — строго XLS.
Здравствуйте, Аноним, Вы писали:
А>питон не знаю и учить не хочу — мне и С++ по шею хватает))) К>>На Excel OLE/COM — тоже, наверно, несложно. А>Доступа нет — под линуксом все делается.
Ну, я сам в эти игры не играл, но есть
родные для линукса библиотеки
— libgoffice в составе Gnome Office (Gnumeric)
— ??? в составе KDE (KSpread)
Кстати, я питон использовал именно потому, что под линуксом, а возиться даже с GOffice не хотелось.
К>>Если дизайн таблицы более затейливый, чем А>........ А>Более чем..
Тогда взять за основу присланный макет, оттуда из нужных ячеек вынимать нужное форматирование, а потом программно расставлять форматирование "по мотивам" — зная и понимая, где что должно оказаться.
Перекуём баги на фичи!
Re[4]: вопрос про CSV и XLS файлы
От:
Аноним
Дата:
20.02.13 09:00
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
Ок, мне подошла библиотека http://xlslib.sourceforge.net
Но она НЕ поддерживает шаблоны. Т.е. "быстро и по мотивам" этот код мне не сделает то, что от меня требуют.
В связи с чем вопрос — КАК удобно создать такую поддержку?
Ну вот прислали они файл. НО! я же не знаю — не взглянув на него — в какой ячейке что и как отформатировано.
Если я программно начну читать этот файл — то где мне остановиться? на первой строки и На 3 столбце? на 100? А Вдруг в 101 окажутся данные?
Понятно, что формат я смогу прочесть — но вот в какой ячейке его искать?
Вопрос то именно в том, чтоб код БЕЗ вмешательства человека определял формат данных и применял его.
А тут я чет не пойму как его обучить в каких пределах и что искать....
Здравствуйте, Аноним, Вы писали:
А>Ок, мне подошла библиотека http://xlslib.sourceforge.net А>Но она НЕ поддерживает шаблоны. Т.е. "быстро и по мотивам" этот код мне не сделает то, что от меня требуют.
Так ведь никто не поддерживает шаблоны из коробки.
Шаблон документа — это тот же самый документ, в котором в нужных местах написано "{подставьте сюда %ВОТ_ЭТО%}"
Ворд или эксель берёт шаблон, делает копию, и в копию подставляет %ВОТ_ЭТО%, а для нетривильных подстановок или обработок — имеются скрипты-визарды, которые спрашивают, что пользователь хочет, выхватывают самый толстый напильник и пилят.
А>В связи с чем вопрос — КАК удобно создать такую поддержку? А>Ну вот прислали они файл. НО! я же не знаю — не взглянув на него — в какой ячейке что и как отформатировано. А>Если я программно начну читать этот файл — то где мне остановиться? на первой строки и На 3 столбце? на 100? А Вдруг в 101 окажутся данные? А>Понятно, что формат я смогу прочесть — но вот в какой ячейке его искать? А>Вопрос то именно в том, чтоб код БЕЗ вмешательства человека определял формат данных и применял его. А>А тут я чет не пойму как его обучить в каких пределах и что искать....
Тут, не глядя на возможные образцы документов, сложно предлагать решения.
Может быть, будет достаточно в определённые ячейки набить характерный текст. Ну, скажем, так
ООО Рога и копыта
всякие реквизиты ОООРИК
%ДАТА%
№№ товар цена кол-во сумма
%ТОВАР_№% %ТОВАР_ИМЯ% %ТОВАР_ЦЕНА% %ТОВАР_КОЛИЧЕСТВО% =??? %!ПОВТОРИТЕ_ЭТУ_СТРОКУ!%
ИТОГО
позиций штук сумма
=COUNT(???) =SUM(???) =SUM(???)
Наши слоны самые лучшие! Покупайте наших слонов!
Перекуём баги на фичи!
Re[6]: вопрос про CSV и XLS файлы
От:
Аноним
Дата:
20.02.13 11:07
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Тут, не глядя на возможные образцы документов, сложно предлагать решения. К>Может быть, будет достаточно в определённые ячейки набить характерный текст. Ну, скажем, так К>
Практически тот самый шаблон угадали, который щаз в качестве теста мне дали.
НО что дальше! вот код открыл этот файл.
Далее чтение в выбранной библиотеке идет по ячейкам! Т.е. ну прочитал я ячейку 0,0. А потом что?
Я как челове — вижу, что надо читать след. строку, но код как поймет это?
Он тупой — он прочтет 0,1 потом 0,2 и .т.д. до 0,65535 чтоли...
Вот в этом то и вопрос — КАК накладывать шаблон. Перебирать все ячейки и искать заполненные
форматированные данные? Ну эт опупеть как много ячеек обегать придеться...
Может и не совсем то, что нужно, но Excel поддерживает .slk-файлы.
The SYLK File Format
SYLK format is an ASCII text file designed to completely represent a template in a format external to the native file format of any given product. It has a strong orientation towards MultiPlan in that the formatting commands, formula representations and row-and-column references used are MultiPlan-derived. It is, however, a program-independent interchange format, much like DIF or SDI. Because Microsoft may extend SYLK further, programs using the format should be
written to ignore records and fields they aren't prepared to handle.
SYLK Overview
SYLK files are divided into records by carriage return/linefeed characters. Empty records are ignored. Non-empty records take the format
< RTD > < FTD > < Fields >
where
< RTD > is a record type descriptor
< FTD > is an optional field type descriptor
< Fields > is an optional and variable number of data items
The interpretation of the FTD depends on which RTD is used; the interpretation of the Fields often depends on which FTD is used. FTDs within a particular RTD may or may not be mutually exclusive, depending on use.
An RTD may be up to two letters long. By convention, all RTDs are capitalized. The FTD takes the form of a semicolon followed by a single letter: ;< letter >. The FTDs ;U, ;V, ;W, ;X, ;Y and ;Z are the same for all records. Others vary. Fields may not contain carriage return or linefeed characters. Any field containing the reserved semicolon
character must have two of them, as is the practice in some programming languages.
In entries labeled as (diff), the last prior field values will be substituted if the field value of the current entry is empty. For example, if formatting commands are given for
different cells in a given row, only the column number needs to be supplied. The row number will be assumed to be the last prior given field value.
The FTDs ;X and ;Y determine the column and row coordinates, respectively. The spreadsheet origin is 1,1.
SYLK Record Type Descriptors (RTD)
In the descriptions that follow, items enclosed in angle brackets ( < > ) signify fields; the character [S] signifies an ASCII space character (20h).
RTD ID First record in SYLK file
FTD ;P < name >
< name > is the name of the program that produced the file.
RTD F Formatting of entire template or cell
There are seven possi ble FTDs to consider:
(1) ;X ;Y
(diff) cell coordinates
(2) ;F < cl > [S] < n > [S] < c2 >
(diff) cell formatting properties
< cl > is one of the following 1-character format-
ting codes:
D default
C continuous cross-cell display
E scientific exponentiation
F fixed decimal point
G general format
$ leading$and2decimal points
* bar graph, one asterisk per unit
(5 would be *****)
< n > is the number of digits.
<c2 > is one of the following 1-character align-
ment codes:
D default
C center
G general(textleft, numbersright)
L leftjustify
R right justify
(3) ;R ;c
iF properties applied to an entire row or column
(4) ;D < cl > [S] < n > [S] < c2 > [S] < n3 >
default format defined as in ;F. ;D codes cannot be used.
< n3 > is the default column width
(5);K
if present, commas are set
(S);E
if present, the formula format option is set
(7);W< n1 > [S] < n2 > [S] < n3 >
defines the widths of a group of columns:
< n1 > is the first column
< n2 > is the last column
< n3 > is the width of columns in number of char-
acters
RTD B Defines the boundaries of the rows and columns. Appears
near the beginning of a SYLK file.
FTD ;Y ;X
row and column numbers
RTD C Supplies the numerical or text value of a cell, the formula it
contains, whether it is protected, and other properties.
There are eight possi ble FTDs to consider:
FTD (1) ;X ;Y
(diff) cell coordinates
(2);K
Value of the cell, either numerical or textual, follows.
Text values must be in double quotes. Logical
values "TRUE" and "FALSE" must also be quoted.
An ERROR value is preceded by #.
(3);P
if present, cell is locked (protected)
(4) ;E < expr >
MultiPlan formula (expression) follows
(5) ;R ;C
(diff) see ;S, below
(6);S
expression for this cell is given by another
coordinate, where X = C and Y = R. The field
contents are decimal coordinates. ;E cannot appear
in the same set of FTDs with ;S. The cell at ;R ;C
must be marked with either a ;D or a ;G.
(7);D
;E expression is shared with another cell
(8);G
;K value is shared with another cell. ;E does not
appear.
RTD NN Defines a MultiPlan name as a union of rectangular
spreadsheet areas, expressed as absolh(te references.
There are two possible FTDs to consider:
FTD (1) ;N < name >
name of the area
(2) ;E < expr >
expression describing the area
RTD NE Defines a link to another (inactive) spreadsheet
There are three possible FTDs to consider:
FTD (1) ;F < name >
filename of the source sheet
(2);S
description of the source area (name of the cell
group)
(3);E
expression describing the area
RTD NV External filename substitution
There are two possible FTDs to consider:
FTD (1);L
filename
(2);F
filename to be used instead
RTD W MultiPlan window structure
Before trying to set up a window structure from scratch, Microsoft
recommends dumping an available window structure to see how it is
organized.
FTD (1) ;N
window number
(2) ;A y x
coordinates of current cell as shown in upper left
corner of window cited in ;N
(3) ;B
bordered flag
(4) ;ST cy cx
split window with title. cx is cursor position in new
window. cy is number of screen lines in new
window.
(5) ;SH 1cy
split window horizontal. cx is cursor position in new
window. cy is number of screen lines in new
window. 1 = L if windows are linked or scrolling.
(6) ;SV 1cx
split window vertical. cx is cursor position in new
window. cy is number of screen lines in new
window. 1 = L if windows are linked or scrolling.
RTD E End of SYLK file.
Organization of a SYLK File
1. ID must be the first record.
2. The B RTD should be used for MultiPlan input, although it is not required.
3. For MultiPlan ;C records: ;D or ;G must appear before another C record that refers to it (with ;S, ;R, ;C)
4. Name definition should precede name use for efficiency, although not required.
5. Window splits and window properties must be in strict logical order.
6. NU records must precede NE records.
7. E must be the last record.
Здравствуйте, Аноним, Вы писали:
А>Практически тот самый шаблон угадали, который щаз в качестве теста мне дали.
Дык, телепат
А>НО что дальше! вот код открыл этот файл. А>Далее чтение в выбранной библиотеке идет по ячейкам! Т.е. ну прочитал я ячейку 0,0. А потом что? А>Я как челове — вижу, что надо читать след. строку, но код как поймет это? А>Он тупой — он прочтет 0,1 потом 0,2 и .т.д. до 0,65535 чтоли...
А xlslib не умеет определять диапазон рабочих ячеек?
Ну и ничего страшного: просканировал очередную строку даже до 65535, увидел маркер "%повторять_до_опупения%", — ага!
А>Вот в этом то и вопрос — КАК накладывать шаблон. Перебирать все ячейки и искать заполненные А>форматированные данные? Ну эт опупеть как много ячеек обегать придеться...
Если ваши контрагенты — панки, которые родили шаблон размером 64К*64К и самую дальнюю ячейку раскрасили во что-то неожиданное, а то и текст туда написали, — то да, придётся опупеть и оббежать.
Как вариант — откажитесь от .xls в пользу .xlsx, это зазипованный хмл, а уж хмл по шаблону верстать — большого ума не надо. Хоть на XSLT, хоть вообще в текстовом процессоре. (А было бы прикольно — в стиле у-вэй, на unzip|awk|zip всё сделать).
Уважаемые товариши! Еще раз подчеркну — советы, плиз, давайте тока по применению к варианту —
я пишу XLS файл на основе CSV файла с данными под линуксом на основе свободной библиотеки libxls.
Все эти составляющие — жестко заданы и никакие советы о переходе куда-то и на что-то — не могут быть применены!
Здравствуйте, Аноним, Вы писали:
А>Уважаемые товариши! Еще раз подчеркну — советы, плиз, давайте тока по применению к варианту — А>я пишу XLS файл на основе CSV файла с данными под линуксом на основе свободной библиотеки libxls. А>Все эти составляющие — жестко заданы и никакие советы о переходе куда-то и на что-то — не могут быть применены!
Ну, выбор библиотеки — не жёстко задан, а дело твоего вкуса.
Я уже говорил, что меня не заломало вообще на питоне парсить.
Перекуём баги на фичи!
Re[3]: вопрос про CSV и XLS файлы
От:
Аноним
Дата:
23.02.13 10:53
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Уважаемые товариши! Еще раз подчеркну — советы, плиз, давайте тока по применению к варианту — А>>я пишу XLS файл на основе CSV файла с данными под линуксом на основе свободной библиотеки libxls. А>>Все эти составляющие — жестко заданы и никакие советы о переходе куда-то и на что-то — не могут быть применены!
К>Ну, выбор библиотеки — не жёстко задан, а дело твоего вкуса. К>Я уже говорил, что меня не заломало вообще на питоне парсить.
Кодт, уж извините, но так сложилось что все задалось жестко. Варианты не предлагать с переходом
и выбором чего-нить другого. Вопрос надо решить именно с тем что есть и дали....