Корректируем метаданные Excel листов Smart View Oracle

Добрый день. Буквально на прошлой неделе у меня случился казус на работе. Админы поменяли названия форм в АСБУ Oracle Hyperion. Необходимость такого действа была надуманной и даже смешной, чего нельзя сказать о последствиях. Пользователи столкнулись с предсказуемой проблемой – невозможностью обновить выгруженные через Smartview листы excel, о чем свидетельствовало всплывающее сообщение «Недопустимая форма …». Практически сразу у меня появилась идея залезть во внутренности .xlsx файла (ведь это обычный архив, в основном с набором xml файлов) и поменять метаданные листов, осталось понять, как это реализовать. Пару минут гугления и результат не заставил себя ждать. Рассказываю по пунктам.

    1. Берем не работающий файл .xlsx и меняем его расширение в .zip или .rar (современные архиваторы всеядны, у меня был Winrar).
    2. Внутри архива будет следующая структура папок Идем в папу xl => worksheets в которой будут находится файлы sheet1.xml, sheet2.xml и т.д. Эти файлы содержат данные и параметры наших листов excel книги, они-то нам и нужны.
    3. Если открыть лист в блокноте (я советую notepad++), который подключен к базе данных Oracle через smartviw (допустим это будет sheet1.xml), то в конце xml разметки можно встретить такой код: 
      - <customProperties>
        <customPr name="CellIDs" r:id="rId1" /> 
        <customPr name="ConnName" r:id="rId2" /> 
        <customPr name="ConnPOV" r:id="rId3" /> 
        <customPr name="FormFolder" r:id="rId4" /> 
        <customPr name="FormName" r:id="rId5" /> 
        <customPr name="FormSize" r:id="rId6" /> 
        <customPr name="HyperionXML" r:id="rId7" /> 
        <customPr name="NameConnectionMap" r:id="rId8" /> 
        <customPr name="POVPosition" r:id="rId9" /> 
        <customPr name="SheetHasParityContent" r:id="rId10" /> 
        <customPr name="SheetOptions" r:id="rId11" /> 
        <customPr name="ShowPOV" r:id="rId12" /> 
      </customProperties>
      

      В вашем случае набор параметров может отличаться. Из контекста видно, что имя формы FormName связано с id переменной rId5. В папке с листами находится еще одна папка с наименованием _rels. Зайдя в нее можно увидеть перечень файлов с листами, но уже с разрешением .rels (видимо от relation – связь), т.е. sheet1.rels, sheet2.rels и т.д. Внутри по сути та же разметка в стандарте xml:

      <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
      - <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty8.bin" /> 
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty3.bin" /> 
        <Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty7.bin" /> 
        <Relationship Id="rId12" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty12.bin" /> 
        <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty2.bin" /> 
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty1.bin" /> 
        <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty6.bin" /> 
        <Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty11.bin" /> 
        <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty5.bin" /> 
        <Relationship Id="rId10" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty10.bin" /> 
        <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty4.bin" /> 
        <Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customProperty" Target="../customProperty9.bin" /> 
      </Relationships>
      

      Здесь нас интересует Id c именем rId5. Видно, что он ссылается на некий файл customProperty5.bin.

    4. Возвращаемся в папку xl. В ней как раз и лежит искомый файл customProperty5.bin (а так же куча других файлов .bin с метаданными листов), открыв который мы увидим наименование формы на которую ссылается лист smartview.
    5. Меняем наименование на необходимое, сохраняем файл, выходим из архива, и переименовываем его обратно в .xlsx формат. Теперь листы Smart View будут обновляться.

Маленькая подсказка, если менять наименование формы необходимо в более чем одном листе, проще воспользоваться массовой заменой текста в файле. Вытаскиваете из архива все файлы customPropertyXXX.bin Открываете Notepad++, как говориться – куда без него.  Открываете меню поиск => найти в файлах, в открывшемся окошке выбираете папку с файлами .bin заполняете поля «найти», «заменить на» и жмете кнопку «заменить в файлах». Закидываете все это дело обратно в архив, и переименовываете его из .zip в .xlsx Кстати, если вы столкнулись со старым расширением Excel фала .xls (двоичный формат) — попробуйте зайти в него и через меню «сохранить как» присвойте новый формат  .xlsx За сим все, всем удачных правок.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *