Файлик XLSX

18 views
Skip to first unread message

Чаплыгин В. Г.

unread,
Feb 2, 2023, 3:15:25 AM2/2/23
to 'Vitaly B.' via ClaList
Есть файлик Ёксельный XLSX . В нём две закладки. На первой запрос и
номер запроса. На второй номер запроса и ИД запроса. Для ответа нужен ИД
запроса. Приходится файлик сохранять с ДВА фалика CSV, сначала первую
закладку,а , затем уже вторую.  Программа читает сначала второй файлик
CSV в очередь № запроса и ИД запроса, затем читает первый файлик  CSV и
обрабатывает. Пользователям не удобно. Изменить Ёксельный файлик не
судьба. Есть возможность читать Ёксельный файлик напрямую из Программы ?
Кто знает ?

--
С уважением Чаплыгин Вадим Геннадьевич
мой адрес chapli...@yandex.ru
мой сайт в интернете chapligin34.ru

Анатолий Долидович

unread,
Feb 2, 2023, 9:10:41 AM2/2/23
to cla...@googlegroups.com
Приветствую!
Единственная сложность - это спозиционироваться в нужную ячейку с учетом листа.
Потом применяем метод Copy, он копирует значение из ячейки в буфер обмена, оттуда вставляем туда куда надо. 



Тут правда используется шаблон расширения от SoftMasters:


Но все можно и руками написать.

-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by
int_1.jpg
int_2.jpg

Чаплыгин В. Г.

unread,
Feb 2, 2023, 11:06:43 AM2/2/23
to 'Анатолий Долидович' via ClaList

Спасибо! Это если на рабочем месте есть Ёксель. У многих Либре оффис. Там это не работает.  Я давно не использую шаблоны СофтМастерс - они только для связи с  Микрософт Ексель через ОЛЕ.

Нужна тузла для чтения файлика без Екселя.

02.02.2023 17:10, 'Анатолий Долидович' via ClaList пишет:
-- 
С уважением,
 Анатолий                          
mailto:anatoli.d...@asb.by --
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/16302882.20230202171037%40asb.by.

Igor Smirnov

unread,
Feb 2, 2023, 1:23:00 PM2/2/23
to Чаплыгин В. Г.

Здравствуйте, Чаплыгин В.Г.

 

Как известно, файл .xlsx (в отличие от старого .xls) - это ZIP-архив, набитый всякими XML-файлами.

В частности, данные по закладкам находятся в файлах подпапки /xl/worksheets и имеют имена sheet1.xml,

sheet2.xml и т.д. - по числу закладок.

Если хорошо покопаться в этих файлах (особенно, точно зная их стуктуру), вытащив их из XSLS-архива,

то можно прочитать нужные данные.

 

 


Вы писали 2 февраля 2023 г., 19:06:33:


Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/7c67fa69-e422-f2a5-64c0-fc7b4ec09218%40yandex.ru.


-- 
С уважением,
 Igor                          mailto:imsm...@gmail.com

Олег А. Руденко

unread,
Feb 2, 2023, 6:03:48 PM2/2/23
to Igor Smirnov
Здравствуйте, Igor!

Только следует учесть, что в самом файле xml листа не хранятся строки -
вместо них хранятся числовые номера. А сами строки хранятся в файле
sharedStrings.xml под этими номерами. А числа, да, хранятся прямо в
файле листа - структура его достаточно прозрачная.

четверг, 2 февраля 2023 г., Вы писали:


>
Здравствуйте, Чаплыгин В.Г.
 
Как известно, файл .xlsx (в отличие от старого .xls) - это ZIP-архив, набитый всякими XML-файлами.
В частности, данные по закладкам находятся в файлах подпапки /xl/worksheets и имеют имена sheet1.xml,
sheet2.xml и т.д. - по числу закладок.
Если хорошо покопаться в этих файлах (особенно, точно зная их стуктуру), вытащив их из XSLS-архива,
то можно прочитать нужные данные.
 
 

Вы писали 2 февраля 2023 г., 19:06:33:

Спасибо! Это если на рабочем месте есть Ёксель. У многих Либре оффис. Там это не работает.  Я давно не использую шаблоны СофтМастерс - они только для связи с  Микрософт Ексель через ОЛЕ.
Нужна тузла для чтения файлика без Екселя.

02.02.2023 17:10, 'Анатолий Долидович' via ClaList пишет:

Файлик XLSX Приветствую!

Единственная сложность - это спозиционироваться в нужную ячейку с учетом листа.
Потом применяем метод Copy, он копирует значение из ячейки в буфер обмена, оттуда вставляем туда куда надо.



Тут правда используется шаблон расширения от SoftMasters:


Но все можно и руками написать.

--
С уважением,
 Анатолий                          

Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке

--
С уважением Чаплыгин Вадим Геннадьевич
мой адрес
chapli...@yandex.ru
мой сайт в интернете chapligin34.ru

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/7c67fa69-e422-f2a5-64c0-fc7b4ec09218%40yandex.ru.

--
С уважением,
 Igor                          
mailto:imsm...@gmail.com
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+u...@googlegroups.com
.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/933070011.20230202212248%40gmail.com.



=============================
С уважением, Олег А. Руденко.
Oleg_R...@mail.ru

Вячеслав Черников

unread,
Feb 3, 2023, 1:33:59 AM2/3/23
to clalist
Я выкладывал класс для работы с calc и аналогичный для работы с Excel без ole. Эти классы создают временный файл на vbscript и исполняют его. Результат работы помещается во временный текстовый файл, откуда забирается классом. Например, можно одним методом загрузить значения из диапазона ячеек в очередь. Несколько сложнее, когда надо разобрать в несколько очередей. На компьютере должен быть calc или Excel. В программе выбираем нужный. И не должно быть блокировки на выполнение vbscript в винде. 

чт, 2 февр. 2023 г., 19:06 Чаплыгин В. Г. <chapli...@yandex.ru>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/7c67fa69-e422-f2a5-64c0-fc7b4ec09218%40yandex.ru.

Чаплыгин В. Г.

unread,
May 16, 2023, 1:33:02 PM5/16/23
to 'Олег А. Руденко' via ClaList

Сегодня разобрался. Если кому нужно. Мне нужно было прочитать из екселя.  Входящий ексель две страницы  -  на первой вопросы, а для ответов нужны номера со второй страницы. Приходилось сохранять в CSV формат сначала первую ,а затем, вторую страницу. И читать из CVS сначала вторую , а затем, первую страницу. Неудобно.

Мой решение. Ексель файлик копируем в папку с программой   в короткое имя.

glo:filespec2 = USZN1_DBF
copy(ZAPROT,'ex2das.xlsx')   ! glo:filespec2 имя файла ZAPROT содержит

файл распаковывается в папку, для надёжности папка сначала удаляется

run('cmd.exe /c rd ex2dd /s /q' , 1)

затем распаковка

run('7z.exe x ex2das.xlsx -oex2dd' , 1)

страница действительно ex2dd/xl/worksheets/sheet2.xml

Файлик текстовый, ТОЛЬКО разделитель строк не 0Dh 0Ah ,   а 0Ah. Из-за этого читать драйвером ASCII бесполезно! Драйвер видит только одну строку.

Читать надо драйвером DOS

ido             FILE,DRIVER('DOS'),NAME(gludbfname),PRE(ido)
record            RECORD
a                   BYTE
                  END
                END


gludbfname ='ex2dd/xl/worksheets/sheet2.xml '


 
free(loqu_questr) ! очередь из sheet2.xml
lo_pointers =0
CheckOpen(ido, 1)
set(ido)
loop
    next(ido)
    if ErrorCode()~ = 0 then
        if lo_pointers > 0
            loqu_:qu_stroka = lo_po_string
            add(loqu_questr)
            lo_po_string = ''
            lo_pointers =0
        .
        break
    .
    lo_byte_byte = ido:a
    if lo_byte_byte = 10  ! 0Ah разделитель
        loqu_:qu_stroka = lo_po_string
        add(loqu_questr)
        lo_po_string = ''
        lo_pointers =0           
    ELSE
        lo_pointers +=1
        lo_po_string[lo_pointers ] = lo_byte_str
    .
. ! loop next(ido)
CLOSE(ido)
Теперь строки разделены и загружены в очередь. lo_byte_byte это байт поверх lo_byte_str строка из 1 буквы.

Это строка для обработки
<c r="A3" t="inlineStr"><is><t>000dbd80-eec2-11ed-9157-e704a7acd01d</t></is></c><c r="B3" t="inlineStr"><is><t>0520235717356</t></is></c><c r="C3" t="inlineStr"><is><t></t></is></c><c r="D3"></c><c r="E3"></c><c r="F3"></c><c r="G3"></c><c r="H3"></c><c r="I3"></c><c r="J3"></c><c r="K3" t="inlineStr"><is><t></t></is></c></row>

<c r="A4" t="inlineStr"><is><t>0118c1b0-eebe-11ed-98d4-6dc2f540d672</t></is></c><c r="B4" t="inlineStr"><is><t>0520235628331</t></is></c><c r="C4" t="inlineStr"><is><t></t></is></c><c r="D4"></c><c r="E4"></c><c r="F4"></c><c r="G4"></c><c r="H4"></c><c r="I4"></c><c r="J4"></c><c r="K4" t="inlineStr"><is><t></t></is></c></row>


Мне нужны 1 и 2 колонки.  000dbd80-eec2-11ed-9157-e704a7acd01d  и 0520235717356
if RECORDS(loqu_questr) = 0
        loqu_:qu_stroka = ''
        add(loqu_questr)   
.
lo_point_it = RECORDS(loqu_questr)   
loop lo_pointers = 1 to lo_point_it
    get(loqu_questr,lo_pointers)
 
    IF  sub(loqu_:qu_stroka,1,5)  ~= '<c r=' 
        CYCLE
    .
    lo_posSTART = InString('<is><t>', loqu_:qu_stroka, 1, 6) ! begin
    lo_posSTART += 7
    lo_pos = InString('</t></is>', loqu_:qu_stroka, 1,lo_posSTART  )  ! end
   
    quid:quid = SUB(loqu_:qu_stroka,lo_posSTART,lo_pos - lo_posSTART )
    lo_posSTART = lo_pos
    lo_posSTART = InString('<is><t>', loqu_:qu_stroka, 1, lo_posSTART)
    lo_posSTART += 7
    lo_pos = InString('</t></is>', loqu_:qu_stroka, 1,lo_posSTART  )  ! end
    quid:qunom =  SUB(loqu_:qu_stroka,lo_posSTART,lo_pos - lo_posSTART )
    ADD(quid_zapr,quid:qunom)

    lo_kol_schet += 1
    if lo_kol_schet % 10 = 0
        Display(?lo_kol_schet)
        Yield
    end ! if   
.

 
MESSAGE('Загружено втрой страницы ' &     lo_kol_schet)
free(loqu_questr) ! очередь из sheet2.xml
 quid_zapr очередь номеров
Шапка таблицы не хранится в sheet2.xml. А строки хранятся.


03.02.2023 2:03, 'Олег А. Руденко' via ClaList пишет:
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1074253410.20230203020344%40mail.ru.

Чаплыгин В. Г.

unread,
May 16, 2023, 1:42:34 PM5/16/23
to 'Олег А. Руденко' via ClaList
Да ! Забыл строки надо перекодировать из UTF-8   в  win-1251

    Temp.Set(loqu_:qu_stroka)
    Temp.toAscii()
    loqu_:qu_stroka = Temp.Str()   ! класс Ю. Филосова.




16.05.2023 20:32, Чаплыгин В. Г. пишет:
> lo_po_string = ''

Чаплыгин В. Г.

unread,
May 16, 2023, 1:44:41 PM5/16/23
to 'Олег А. Руденко' via ClaList
Прошу прощения автор класса Юрий Философов.


16.05.2023 20:42, Чаплыгин В. Г. пишет:

Олег А. Руденко

unread,
May 16, 2023, 1:54:39 PM5/16/23
to Чаплыгин В. Г.
Здравствуй, Вадим!

У ASCII-драйвера есть настройка символа (символов) конца строк - ENDOFRECORD.

вторник, 16 мая 2023 г., Вы писали:



Re: {ClaList:13242} Файлик XLSX
.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/7598cbb9-57cc-8343-93cc-179eca736f6b%40yandex.ru.




=============================
С уважением, Олег А. Руденко.

Чаплыгин В. Г.

unread,
May 16, 2023, 2:03:19 PM5/16/23
to 'Олег А. Руденко' via ClaList

Спасибо! Не знал! Правда вопрос уже решён.   Я обычно с обычными текстовыми файликами работаю.  Да и самый последний символ в xml файлике без конца строки. Последний символ </worksheet> и всё. Нет 0Dh 0Ah  и нет 0Ah.


16.05.2023 20:54, 'Олег А. Руденко' via ClaList пишет:
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1409685742.20230516205434%40mail.ru.

Олег А. Руденко

unread,
May 16, 2023, 3:43:14 PM5/16/23
to Чаплыгин В. Г.
Здравствуй, Вадим!

Последняя строка в файле считывается автоматом - ей ограничитель не нужен.


вторник, 16 мая 2023 г., Вы писали:

Спасибо! Не знал! Правда вопрос уже решён.   Я обычно с обычными текстовыми файликами работаю.  Да и самый последний символ в xml файлике без конца строки. Последний символ </worksheet> и всё. Нет 0Dh 0Ah  и нет 0Ah.

16.05.2023 20:54, 'Олег А. Руденко' via ClaList пишет:

Re: {ClaList:13268} Файлик XLSX
.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/c7f6bc3b-557b-b170-ad40-00d0737c61ca%40yandex.ru.




=============================
С уважением, Олег А. Руденко.

Чаплыгин В. Г.

unread,
May 17, 2023, 3:04:02 AM5/17/23
to 'Олег А. Руденко' via ClaList

Есть засада! Если файлик из ГИС ЖКХ с портала открыть Екселем и сохранить в новое место (сохранить как) то в sheet2.xml  строки без данных! Программа находит пустоту и выдаёт пустой ответ. После открытия Ексельного файла с ответом не может удалить временную папку с распакованным ексель файлом и висит.  Если дать программе Оригинальный файл с портала всё работает!

Та же засада и Либре офисом!  Нельзя открывать и сохранять!


16.05.2023 20:32, Чаплыгин В. Г. пишет:

Сегодня разобрался. Если кому нужно. Мне нужно было прочитать из екселя.  Входящий ексель две страницы  -  на первой вопросы, а для ответов нужны номера со второй страницы. Приходилось сохранять в CSV формат сначала первую ,а затем, вторую страницу. И читать из CVS сначала вторую , а затем, первую страницу. Неудобно.

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/7598cbb9-57cc-8343-93cc-179eca736f6b%40yandex.ru.

Чаплыгин В. Г.

unread,
May 17, 2023, 3:58:08 AM5/17/23
to 'Олег А. Руденко' via ClaList

в sheet2.xml получается ДВЕ строки после сохранения офисом.

первая <?xml version="1.0" encoding="UTF-8"?>

И ВСЁ остальное во второй строке.  При открытии в Екплорере теги видны, но вместо данных только ссылки

-<row r="3" outlineLevel="0" hidden="false" collapsed="false" customHeight="false" ht="14.4" customFormat="false">


-<c r="A3" t="s" s="5">

<v>332</v>

</c>


-<c r="B3" t="s" s="5">

<v>14</v>

</c>

</row>


-<row r="4" outlineLevel="0" hidden="false" collapsed="false" customHeight="false" ht="14.4" customFormat="false">


-<c r="A4" t="s" s="5">

<v>333</v>

</c>


-<c r="B4" t="s" s="5">

<v>27</v>

</c>

</row>

<ro



17.05.2023 10:03, Чаплыгин В. Г. пишет:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/45e14741-cdc6-ed20-6ea9-1fba3ced979e%40yandex.ru.
Reply all
Reply to author
Forward
0 new messages