Почему Excel Interop удаляет изображение после обработки файла? - PullRequest
4 голосов
/ 13 января 2012

Excel Interop удаляет изображения из обработанных файлов.

Я использую Excel Interop, сторонние компоненты отсутствуют (о чем я знаю).Рабочий процесс - создать копию (цель) файла (шаблона), заполнить ячейки, изменить состояние переключателя

  1. Создать копию (цель) существующего файла .xslm (шаблон))
  2. Открыть цель через Excel Interop
  3. Заполнить ячейки цели, изменить состояние переключателя
  4. Рабочий лист с изображением не изменен
  5. Закрыть цель

На моем компьютере разработчика целевой файл выглядит великолепно - все заполнено, изображение присутствует. Примечание: на моем компьютере разработчика я запускаю код из IDE VS2010.

На рабочем компьютере - все заполнено, но изображение отсутствует.Вместо этого на его месте появляется следующая ошибка: Примечание: на производственном компьютере она работает как служба с учетной записью Local Service .

"Изображениедеталь с идентификатором связи rId1 не найдена в файле "the image part with relationship ID rId1 was not found in the file

Вся рабочая книга открывается с помощью следующего кода:

var workbook = workbooks.Open(targetPath
     0, false, 5, Type.Missing, Type.Missing, false, XlPlatform.xlWindows, "",
     true, false, 0, true, false, false);

Обратите внимание, что рабочая таблица с изображением неманипулировать в коде.

Рабочие книги (и отдельные рабочие листы) защищены.Однако защищенный шаблон правильно обрабатывается в dev, но не в рабочей среде.Я не думаю, что защита имеет к этому какое-либо отношение (но кто знает, верно? Это Interop. Тьфу).

Файл был создан другой стороной и всеми компонентами (то есть изображением)находиться в структуре .xslm, а не как ссылки на другой сервер.

Я проверил, что изображение видно на рабочем компьютере в файле шаблона, но не в обработанном файле.

Чтобы подтвердить, что это не было проблемой при открытии файла в рабочей среде, я отправил себе по электронной почте копию, а изображение продолжало отсутствовать.

Я также подтвердил, что на моей машине для разработки обрабатывались файлыу меня есть видимое изображение.

Я снял защиту с листа и распаковал структуру файла.Файл .jpg действительно отсутствует в обработанном целевом объекте с рабочей машины.

Еще одно замечание - Office 2010 установлен на моей машине для разработки, но Office 2007 на рабочей машине.В результате я использую Office 12 Interop.В обеих средах ошибки времени выполнения не генерируются.

Я использую Interop (вместо библиотеки OpenXml), потому что есть элементы управления ActiveX, которые необходимо заполнить.Обратите внимание, что ни у одного из элементов управления ActiveX нет проблем - они работают нормально.Это просто файлы изображений, которые исчезают из обработанных файлов (они хорошо отображаются в файле шаблона).

ОБНОВЛЕНИЕ ПРИМЕЧАНИЕ: Есть четыре других файла изображений, все .emf на другом листе;все они тоже раздеты.

Ответы [ 5 ]

5 голосов
/ 16 января 2012

Как объяснено в комментариях (и, в конечном итоге, при редактировании вопроса), код работал в производственном режиме как служба с учетной записью Local Service .

Теперь я не уверен, почему я выбрал эту учетную запись - что-то случайно обнаружил во время моего исследования о том, как настроить Interop для правильной работы в качестве службы?

Однако, как только я переключился с учетной записи Local Service на учетную запись Local System (и установил флажок «Разрешить службе взаимодействовать с рабочим столом»), это сработало. Автомагически.

  1. services.msc
  2. выберите услугу
  3. щелкните правой кнопкой мыши, выберите «Свойства»
  4. выберите вкладку «Вход в систему» ​​
  5. выберите «Локальная системная учетная запись» и установите флажок «Разрешить службе взаимодействовать с рабочим столом»

«Разрешить службе взаимодействовать с рабочим столом» может не потребоваться; Другие заметки по автоматизации Interop предполагают, что требуются другие настройки рабочего стола, однако я сделал установку, в которой эти предварительные условия были установлены, но ЭТО значение не проверено; приложение все еще работает ...

http://i.imgur.com/k6Qwy.png

2 голосов
/ 13 января 2012

Взаимодействие не поддерживается в нескольких сценариях MS .

Существует множество опций для чтения / редактирования / создания файлов Excel без Interop:

MS предоставляет бесплатный OpenXML SDK V 2.0 - см. http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx (только XLSX)

Может читать и записывать файлы MS Office (включая Excel).

Другой бесплатный вариант см. http://www.codeproject.com/KB/office/OpenXML.aspx (только XLSX)

Если вам нужно больше работать с более старыми версиями Excel (такими как XLS, не только XLSX), рендерингом, создавать PDF-файлы, формулы и т. Д., То существуют различные бесплатные и коммерческие библиотеки, такие как ClosedXML (бесплатно, только XLSX). ), EPPlus (бесплатно, только XLSX), Aspose.Cells , SpreadsheetGear , LibXL и Flexcel и т. Д. .

Трудно сказать, полностью ли поддерживается ваш конкретный случай (элементы управления ActiveX) каким-либо из вышеперечисленных ... это то, что вам нужно проверить ...

Даже если элементы управления ActiveX поддерживаются какой-либо из библиотек, существует вероятность, что сами элементы управления ActiveX не работают в службе Windows (разрешения и т. Д.).

РЕДАКТИРОВАТЬ - согласно комментарию:

Я понимаю проблему ActiveX, и я решил ее с 2 пунктов:

  • Вы действительно протестировали все вышеупомянутые библиотеки?
  • Проверили ли вы с разработчиком (-ями) элементов управления ActiveX, могут ли элементы управления ActiveX теоретически работать в сценарии службы Windows?

РЕДАКТИРОВАТЬ 3 - после ОБНОВЛЕНИЯ от OP:

.emf - векторный формат файла ... IIRC GDI + используется для его рендеринга в текущих версиях Windows ... .emf со временем немного эволюционировал, поэтому в старых версиях ОС и / или Office иногда могут возникать проблемы с рендерингом. более новые .emf файлы ... что, в свою очередь, означает, что проблема заключается в «отсутствующем рабочем столе» в службе Windows и / или в том, что ваши .emf файлы «слишком новые» для рабочей машины.

0 голосов
/ 15 декабря 2016

(a) Не поддерживается, не делайте этого https://support.microsoft.com/en-gb/kb/257757

(b) В любом случае, если вам нужно это сделать (и вы не можете настольный доступ к вашему процессу, как это предлагается в принятом ответе ), вы можете связываться с содержимым и разрешения в C:\Windows\System32\config\systemprofile, как предполагает этот ответ .

Мне пришлось создать и разрешить разрешения для папок Desktop и INetCache. Проверка (и решение) неудачных попыток доступа в путях, начинающихся с C:\Windows\System32\config\systemprofile с помощью Process Monitor , вызвала у меня досадную проблему и указала на разрешения INetCache в качестве причины сбоя. вставка изображений.

Вам просто нужно добавить разрешения в папку C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache или C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache (зависит от версии вашей системы), и изображения будут отображаться

0 голосов
/ 23 января 2012

Я столкнулся с той же проблемой с PowerPoint на рабочем столе (не службы), скопировав слайд с изображением из шаблона.(при получении около 200 копий вставки в 1 презентации, но 1300 слайдов с одинаковым изображением работает нормально ???)

Трудно решить эту проблему, я думаю, что это связано с аппаратным обеспечением, например с ошибками ОЗУ, но неконечно

только 1 клиент из ста получает эту ошибку, поэтому я думаю, что это связано с аппаратным обеспечением.

Обратите внимание, что у меня есть веб-сайт, который предоставляет автоматизацию Excel, и он работает ОТЛИЧНО, дажене поддерживается MS Blah Blah .... "!

Ваш файл Excel, кажется, поврежден, вы должны найти как.

0 голосов
/ 14 января 2012

Вы, вероятно, сами по себе, поскольку Excel не поддерживается в серверной среде, как правильно указывает @Yahia.

Ваше упоминание об элементах управления ActiveX - это красный флаг - возможно, некоторые из ваших элементов управления ActiveXТребуется ли запускать Excel под учетной записью с профилем?

Все, что вы можете сделать, это отладить это самостоятельно, вероятно, лучше всего продолжить, исключив возможные источники различного поведения в вашей рабочей среде и среде разработки.

  • Попробуйте использовать одну и ту же версию Office в обеих средах
  • Используете ли вы Cassini в своей среде разработки?(т. е. работает под своим собственным логином). Если это так, возможно, попробуйте с IIS, работающим под учетной записью службы без профиля
  • Попробуйте удалить компоненты ActiveX один за другим, чтобы увидеть, оказывает ли влияние один из них ...и т.д ...
...