Показать сообщение отдельно
Старый 27.09.2013, 01:56   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Thumbs down Open XML SDK генерит файлы, которые не открываются после пересохранения в Excel 2010
Коллега тут столкнулся вот с какой проблемой:
  • в AX 2012 есть отчет-наследник класса XMLExcelReport, генерящий Excel-файл с помощью Open XML SDK
  • есть корпоративная сеть, где у всех стоит Office 2010 (14.7106.5001)
  • сгенерированный отчет нормально открывается в Excel 2010, но...
  • если затем файл либо просто сохранить, либо "сохранить как" в формате xlsx, то он перестает открываться: Excel ругается, что файл поврежден.
При этом:
  • если сохранить файл, скажем, в формате xlsb, то он нормально открывается
  • в Office 2013 таких проблем не возникает, но...
  • переходить в данном конкретном примере на новую версию Office никто в ближайшее время не будет
В итоге получился отчет, который генерит файл, "бьющися" после первого же пересохранения в Excel 2010 и более не открывающийся.
При ближайшем рассмотрении обнаружилось вот что: в исходном сгенеренном файле, если его распаковать, workbook.xml выглядит в чуть сокращенном виде так:
PHP код:
<x:workbook xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"
            
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
            
xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<
x:sheets>
 <
x:sheet name="Sheet2" sheetId="2" r:id="rId1" />
</
x:sheets>
<
x:extLst>
 <
x:ext xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}">
  <
x15:workbookPr chartTrackingRefBase="1" />
 </
x:ext>
</
x:extLst>
</
x:workbook
А после пересохранения - уже вот так:
PHP код:
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
          
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<
sheets>
 <
sheet name="Sheet2" sheetId="2" r:id="rId1"/>
</
sheets>
<
extLst>
 <
x:ext xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}">
  <
x15:workbookPr chartTrackingRefBase="1"/>
 </
x:ext>
</
extLst>
</
workbook
Тут видно, что Excel выкинул упоминание о префиксе "x" и пространстве имен, которое им идентифицируется, - везде, кроме элемента extLst, и при повторном открытии файла Excel как раз и не понимает, к чему же теперь относится нигде не объявленный префикс "x". Если убрать этот префикс в workbook.xml и styles.xml, то файл начинает открываться нормально. Пока из найденных в инете советов - только удалять напрочь этот extList... Понятно, что проблема в Excel 2010, а не в Аксапте и не в Open XML SDK, тем не менее, если у кого еще вылезет - хотя бы будет известно, куда копать.
За это сообщение автора поблагодарили: sukhanchik (10), Logger (10), Krasher (1), MikeR (5), handy-comp (1).