Экспорт в Excel через XML

 
0
 
Oracle
ava
VIAcom | 04.07.2005, 15:11
Создаю XML документ при помощи пакета DBMS_XMLQuery, (т.к. это значитело проще, а мудрить в моем случае не надо про пакет XMLDOM знаю) далее сохраняю в файл и потом его подымаю из Excel-я. Все хорошо, но вот беда у меня текстовые поля с русскими символами не читаются совсем :( думаю Ecxel-ю Юникод нужен.

Как можно решить эту проблему?
В процедуру GetXML, которой я получаю CLOB содержащий XML? в строку запроса он не хочет включать даже функцию trim() ... что делать, как быть.

Посоветуйте!

Comments (7)
ava
LSD | 04.07.2005, 20:04 #
Для начала неплохо бы посмотреть на XML порождаемый DBMS_XML, и код которым он порождается.
ava
VIAcom | 05.07.2005, 09:28 #
Код выдран практически из документации по Oracle XML:

create or replace procedure P_VIA_DATATOXML(TestParam varchar2)is
queryCtx DBMS_XMLquery.ctxType;
result CLOB;
R varchar2(32767);
F utl_file.file_type;
offset_ integer;
length_ integer;
begin
queryCtx := DBMS_XMLQuery.newContext('select * from v_via_temp');
result := DBMS_XMLQuery.getXML(queryCtx);
F:=utl_file.fopen('c:\Test','Result.str','w');
Length_:=32767;
Offset_:=1;
while Length_ = 32767 loop
dbms_lob.Read(Result, Length_, Offset_, R);
Offset_:=Offset_ + Length_;
utl_file.put(F, R);
end loop;
utl_file.fclose(F);
DBMS_XMLQuery.closeContext(queryCtx);
exception when others then
utl_file.fclose(F);
DBMS_XMLQuery.closeContext(queryCtx);
end P_VIA_DATATOXML;

-- это тело представления - v_via_temp, можно прямо так в процедуру поместить
-- суть рабочий вариант, хотя и не мой :)
-- если заменить поля v_cp.stab_numb, v_cp.stab_pref
-- на конструкцию trim(v_cp.stab_numb)||trim(v_cp.stab_pref),
-- как сделано в оригинальном представлении, то уже не работает
/*'SELECT '||
'v_cp.nrn, v_cp.stab_pref, v_cp.stab_numb, '||
'v_cp.ssurname, v_cp.sfirstname, v_cp.slastname, clnpspfm.code, '||
'clnpspfm.name, p.code, p.name, v_cp.djobbegin_date, '||
'v_cpexp.dworkfrom, v_cpexp.dworkto, v_cpexp.sexperiences, '||
'v_cps.ndeptrn, d.code, d.name, v_cp.ddismiss_date, v_cp.sdismiss_motiv '||
'FROM '||
'v_clnpersons v_cp, '||
'v_tissa_clnpspfm2 v_cps, '||
'v_clnpersexp v_cpexp, '||
'ins_department d, '||
'clnposts p, '||
'clnpspfmtypes clnpspfm '||
'WHERE '||
'v_cp.nrn=v_cpexp.nprn '||
'AND v_cp.nrn=v_cps.npersrn '||
'AND v_cps.ndeptrn=d.rn '||
'AND v_cps.npostrn=p.rn '||
'AND v_cps.nclnpspfmtypes = clnpspfm.rn ');*/


Кстати, только что, пока XML генерировал, нашел еще оду "еггoг" на сей раз на длинну файла за раз что-то не канает больше 33658 это что за баг? /*извиняюсь за оффтоп*/

А вот собственно участок XML :


<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<NRN>422107931</NRN>
<STAB_PREF> БЛА_БЛА</STAB_PREF>
<STAB_NUMB> 27</STAB_NUMB>
<SSURNAME>Юмаев</SSURNAME>
<SFIRSTNAME>Рустем</SFIRSTNAME>
<SLASTNAME>Рамилевич</SLASTNAME>
<CODE>1Основной</CODE>
<NAME>Работник предприятия</NAME>
<CODE>Зам_нач_ОК</CODE>
<NAME>Зам начальника ОК</NAME>
<DJOBBEGIN_DATE>6/10/1992 0:0:0</DJOBBEGIN_DATE>
<DWORKFROM>1/1/2000 0:0:0</DWORKFROM>
<SEXPERIENCES>Ст14</SEXPERIENCES>
<NDEPTRN>98413001</NDEPTRN>
<CODE>ОК_АУ</CODE>
<NAME>Отдел кадров Аппарата управления</NAME>
</ROW>
<ROW num="2">
.............

</ROW>
</ROWSET>

А вот пример того шрифта что хочет Excel:

<Worksheet ss:Name="╨Ы╨╕╤Б╤В1">
<Table ss:ExpandedColumnCount="15" ss:ExpandedRowCount="8" x:FullColumns="1"
x:FullRows="1">
<Row>
<Cell ss:Index="1"><Data ss:Type="Number">12</Data></Cell>
</Row>
</Worksheet>

Закорючки это у него "Лист1"

Я сделал предположение судя по количеству символов, что это UTF-16 вроде там по 2 байта на символ.
ava
Plamenk | 05.07.2005, 10:28 #
Попробуй в XML дописать encoding="Windows-1251".
ava
VIAcom | 05.07.2005, 13:13 #
Заработало. только написал я:
encoding="UTF-16"
;-)
ava
LSD | 05.07.2005, 22:06 #
Цитата (VIAcom @ 5.7.2005, 10:28)
Я сделал предположение судя по количеству символов, что это UTF-16 вроде там по 2 байта на символ.

Предположение не верное, т.к. в UTF-16 два байта идут и на латиницу тоже. А судя по тегам это не так. Скорее всего это UTF-8, тем более, что если кодировка не указанна, то по умолчанию XML трактуется как UTF-8.

Я модифицировал код, теперь он добавляет кодировку в генерируемый XML:
create or replace procedure P_VIA_DATATOXML(TestParam varchar2) is 
queryCtx DBMS_XMLquery.ctxType;
result CLOB;
R varchar2(32767);
F utl_file.file_type;
offset_ integer;
length_ integer;
begin
queryCtx := DBMS_XMLQuery.newContext('select * from v_via_temp');
DBMS_XMLQUERY.setEncodingTag(queryCtx, 'Windows-1251');
result := DBMS_XMLQuery.getXML(queryCtx);
F:=utl_file.fopen('c:\Test','Result.str','w');
Length_:=32767;
Offset_:=1;
while Length_ = 32767 loop
dbms_lob.Read(Result, Length_, Offset_, R);
Offset_:=Offset_ + Length_;
utl_file.put(F, R);
end loop;
utl_file.fclose(F);
DBMS_XMLQuery.closeContext(queryCtx);
exception when others then
utl_file.fclose(F);
DBMS_XMLQuery.closeContext(queryCtx);
end P_VIA_DATATOXML;
ava
VIAcom | 06.07.2005, 10:27 #
Спасибо всем, ответов даже больше чем надо smile
Но их у меня все равно много. вот и еще ...

Можно ли записать в кнкретную ячейку значение используя ее адрес ну например в ячейку col = 4, row = 10 :qstn какие для этого нужно юзать теги?

Еще, где можно глянуть на документацию по данной теме, смотрет на Мелко$офте.cам, но что то там не откопал нормального может не там искал просто ... :( подскажите. Можно на англ это не важно.
ava
LSD | 07.07.2005, 00:03 #
Цитата (VIAcom @ 6.7.2005, 11:27)
Можно ли записать в кнкретную ячейку значение используя ее адрес ну например в ячейку col = 4, row = 10 какие для этого нужно юзать теги?

Я что-то не понял, речь идет о XML или о таблице?

Цитата (VIAcom @ 6.7.2005, 11:27)
Еще, где можно глянуть на документацию по данной теме, смотрет на Мелко$офте.cам, но что то там не откопал нормального может не там искал просто ... подскажите. Можно на англ это не важно.

Конечно на oracle.com smile
Если вопрос по XML вообщем, то w3.org, там спецификации, описание DOM и т.д. Если про конкретный парсер то oracle.com. Зависит от вопроса.

P.S. Ты спрашивай, не боись на RTFM мы тебя всегда пошлем smile
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Plamenk ava  LSD   VIAcom
advanced
Submit