Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Можно ли из строки шестнадцатиричного формата получить эксель файл ? (http://forum.oszone.net/showthread.php?t=331454)

Burning Hell 25-11-2017 19:47 2780118

Можно ли из строки шестнадцатиричного формата получить эксель файл ?
 
Всем доброго времени суток.

У меня есть большая строка (8000 символов; это поле BLOB в БД Оракл) в шестнадцатеричном формате, которая в действительности является файлом формата .xlsx. Мне нужно эту строку "превратить" в физический файл экселя на диске. Т.е., этот файл "упакован" в BLOB в Оракле. Мне нужно его "распаковать".

Подскажите, пожалуйста, можно ли это сделать средствами vbscript? Нашел, что на vbs есть возможности для взаимодействия с шестнадцатеричными значениями, но не уверен, что это то, что мне нужно. Заранее благодарен.

Iska 25-11-2017 20:53 2780138

Burning Hell, Вам нужен ADODB. И надо быть уверенным, что содержимое поля типа BLOB представляет собой точную бинарную копию файла .xlsx.

Busla 26-11-2017 18:02 2780301

Цитата:

Цитата Burning Hell
Подскажите, пожалуйста, можно ли это сделать средствами vbscript? »

нет - vbscript не умеет работать с бинарными файлами

Iska 26-11-2017 18:14 2780303

Цитата:

Цитата Busla
vbscript не умеет работать с бинарными файлами »

Busla, это не совсем так. Частично умеет, хотя и не с такой лёгкостью, что большие ЯВУ, имеющие возможность не только последовательного, но и прямого доступа к содержимому файла.

Burning Hell 26-11-2017 21:06 2780341

Цитата:

Цитата Iska
Вам нужен ADODB »

так в VBScript эта технология есть, разве нет?

greg zakharov 26-11-2017 21:16 2780345

Цитата:

Цитата Iska
И надо быть уверенным, что содержимое поля типа BLOB представляет собой точную бинарную копию файла .xlsx.

.xlsx - это по сути ZIP-архив, содежимым которого являются набор xml файлов, так что теоретически, проверив первые четыре байта (а речь ведь, надо понимать, о hex'е) и сверив их с сигнатурой ZIP, можно понять что в поле БД. НО! ADODB лучше не трогать, ибо эта зараза данные целиком грузит в память, лучше использовать нечто легковесное, что-то вроде SAPI.SpFileStream.
Цитата:

Цитата Busla
нет - vbscript не умеет работать с бинарными файлами

Спасибо, улыбнули. WSH всегда умел работать с бинарниками.

Burning Hell 26-11-2017 21:32 2780349

Цитата:

Цитата greg zakharov
сверив их с сигнатурой ZIP, можно понять что в поле БД »

У меня есть более простой способ понять, что там - в соседнем поле лежит имя файла с его расширением. Так что это не проблема.

Цитата:

Цитата greg zakharov
SAPI.SpFileStream »

Есть ли где-то рабочий пример такой штуки с комментариями как ее юзать?

Iska 26-11-2017 22:50 2780373

Цитата:

Цитата Burning Hell
так в VBScript эта технология есть, разве нет? »

Неа, нету :). Эта технология имеет отношение к VBScript только тем, что может использоваться последним посредством Automation. В Вашем случае требуется драйвер для доступа к базам данных Oracle.

Цитата:

Цитата greg zakharov
ADODB лучше не трогать, ибо эта зараза данные целиком грузит в память, лучше использовать нечто легковесное, что-то вроде SAPI.SpFileStream. »

Если верить автору:
Цитата:

Цитата Burning Hell
большая строка (8000 символов; это поле BLOB в БД Оракл) в шестнадцатеричном формате »

— то и так сойдёт. Если, конечно, верить. У меня пустой лист .xlsx занимает почти семь килобайт.


Цитата:

Цитата Burning Hell
У меня есть более простой способ понять, что там - в соседнем поле лежит имя файла с его расширением. Так что это не проблема. »

Окажется проблемой, если там не то, что Вы думаете.

Цитата:

Цитата Burning Hell
Есть ли где-то рабочий пример такой штуки с комментариями как ее юзать? »

Рабочий пример кода с «ADODB.Stream» («SAPI.SpFileStream» Вам понадобится, когда объём поля будет порядка сотен мегабайт) Вы можете взять здесь: how to store a BLOB data on a windows file using vbscript?.

Ах, да, комментарии… Всё достаточно просто: подключаетесь к базе Oracle, выполняете SQL-запрос, выделяя потребную запись, значение потребного поля, если оно не пустое, передаёте функции (которая там тупо используется как процедура) вместе с именем потребного файла, в функции создаётся объект потока, в него пишется байтовый массив, полученный из поля, затем содержимое потока записывается в файл на диске.

Busla 26-11-2017 23:28 2780383

Цитата:

Цитата greg zakharov
WSH всегда умел работать с бинарниками. »

вас не затруднит привести фрагмент соответствующего кода?

Iska 26-11-2017 23:43 2780388

Цитата:

Цитата Busla
вас не затруднит привести фрагмент соответствующего кода? »

Такой вариант Вас устроит? Или там же чуть ниже более расширенный?

Busla 27-11-2017 09:57 2780424

Iska, конечно, нет - Speach API может не быть в системе (как и CAPICOM, который тоже для этих целей бывает используют)

Iska 27-11-2017 11:39 2780449

Busla, в системе много чего «может не быть». В том числе может как «ещё не быть» или «уже не быть» — в зависимости от используемой ОС. Но причём тут это?

Burning Hell 27-11-2017 13:30 2780472

Цитата:

Цитата Iska
Неа, нету »

Мне указали на форум, где было сообщение с вот таким кодом:

Код:

Sub test()
    Dim conn, rs
    Dim strSQL As String
   
    Set conn = CreateObject("ADODB.Connection")
    With conn
        .ConnectionString = "Provider=MSDAORA;" & _
        "Data Source=ORCL10G;" & _
        "User ID=System;Password=oracle;"
        .Open
    End With
   
    Set rs = CreateObject("ADODB.Recordset")
    strSQL = "select * from scott.emp"
    rs.Open strSQL, conn, 3, 3
   
    Range("A1") = rs("ENAME")
    Range("B1") = rs("JOB")
   
    rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing
End Sub

Но это как я понимаю, VBA?

Цитата:

Цитата Iska
Вы можете взять здесь: »

Спасибо, попробую запустить.

Iska,

код по ссылке - это VBScript? Т.е. можно ли его двойным щелчком мыши запустить? Можно ли как-то проверить, что к БД проходит коннект?

***
Сейчас пробую подконнектиться к ораклу.

Подскажите, пожалуйста, как посмотреть sid и провайдера?

Iska 27-11-2017 14:23 2780482

Цитата:

Цитата Burning Hell
Но это как я понимаю, VBA? »

Да. Но этот код Вам не нужен. Я давал выше ссылку на тему с потребным кодом.

Цитата:

Цитата Burning Hell
код по ссылке - это VBScript? »

Да.

Цитата:

Цитата Burning Hell
Т.е. можно ли его двойным щелчком мыши запустить? »

Можно. Но лучше в командной строке (а ещё лучше — из-под Far Manager'а :)) посредством «cscript.exe» — так проще его отлаживать.

Цитата:

Цитата Burning Hell
Можно ли как-то проверить, что к БД проходит коннект? »

Если коннект не пройдёт — сразу увидите. Естественно, строка подключения (connection string) должна соответствовать Вашему драйверу и базе данных, запрос должен соответствовать таблице и полям Вашей базы данных.

Цитата:

Цитата Burning Hell
Подскажите, пожалуйста, как посмотреть sid и провайдера? »

SID? Зачем Вам SID? Разве там, в коде, есть где-то SID?! Есть «User ID». Провайдер, повторю, должен соответствовать Вашей базе данных. Если не знаете (я-то точно не знаю) — можете поэкспериментировать с этими данными: Oracle Provider for OLE DB connection strings.

Burning Hell 27-11-2017 14:28 2780485

Цитата:

Цитата Iska
Разве там, в коде, есть где-то SID?! »

Ну да, судя по именам переменных тут нужен и sid, и провайдер.

Цитата:

Цитата Iska
с этими данными »

спасибо, буду пробовать...

UPD:
sid нашел в файле tnsnames.ora. Осталось найти провайдера.

UPD:
Что-то не то с провайдером, пишет, что не может найти его.

Iska 27-11-2017 15:10 2780499

Burning Hell, да нет там SID'а. Это:
Код:

Const C_ORA_SID = "XE"
имя соединения.

Burning Hell 27-11-2017 16:15 2780510

Вложений: 1
Цитата:

Цитата Iska
имя соединения. »

Я не очень понимаю, что там должно быть в итоге: Data Source или SID? В коде в ConnectionString присутствует наименование Data Source и среди источников данных у меня нет XE. Когда я подставил свой источник данных и провайдер (я нашел его), при проверке тестового соединения система выдала мне сообщение (см. скрин tns_error). Когда запускаю скрипт в командной строке, получаю следующее сообщение:

Код:

another_var.vbs(17, 1) ADODB.Connection: Provider cannot be found. It may not be properly installed.
Я так понимаю, что тут надо к оракловым админам обращаться.

Iska 28-11-2017 05:15 2780642

Цитата:

Цитата Burning Hell
Я не очень понимаю, что там должно быть в итоге: Data Source или SID? »

Источник данных.

Цитата:

Цитата Burning Hell
и среди источников данных у меня нет XE. »

http://www.oracle.com/technetwork/de...xe-095131.html

Цитата:

Цитата Burning Hell
Я так понимаю, что тут надо к оракловым админам обращаться. »

Это будет самым правильным выбором.

Burning Hell 28-11-2017 14:41 2780766

Вообщем, проблему удалось-таки решить средствами самого оракла) Оказывается, там есть такой пакет UTL_FILE, который умеет проворачивать такие штуки как распаковка блоба в файл, причем в принципе в любой, какой укажешь. Пришлось, правда, шаманить прикинувшись dba в SQL*Plus.

Iska 28-11-2017 14:49 2780771

Burning Hell, ;).


Время: 07:26.

Время: 07:26.
© OSzone.net 2001-