Лучший вариант для размещения документов MS Office в пользовательском приложении? - PullRequest
4 голосов
/ 05 августа 2010

В настоящее время я размещаю элемент управления IE Browser в форме .NET (2.0) и использую его для загрузки файлов Office, таких как Excel и Word, таким образом:

_ieCtrl.Navigate("C:\\test.xls", False);

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

Другая проблема заключается в том, что когда я закрываю окно, в котором размещается элемент управления IE и документ Office, документ не закрывается и остается открытым на диске. Это означает, что последующие попытки открыть тот же файл через мое приложение или собственное офисное приложение не удастся из-за нарушения общего доступа.

Есть ли программный способ избежать этого диалога и впоследствии очистить ресурсы? Я прошу программного ответа, потому что веб-исследование дает только решения, которые влекут за собой изменение настроек на уровне ОС.

Bounty ПРИМЕЧАНИЕ:

Я открыт для любого решения этой проблемы, которое позволит мне:

  • Разместите электронную таблицу Excel внутри моего приложения
  • Работайте довольно прозрачно (избегайте проблем с юзабилити, подобных описанным выше)
  • Избегайте внесения каких-либо изменений в ОС, которые могут повлиять на другие приложения (особенно на IE)
  • Ноль дополнительных затрат (без лицензированных сторонних библиотек, пожалуйста) Code Project и другие ресурсы с открытым исходным кодом в порядке
  • Не связывайтесь с элементом управления DSO Framer ActiveX, если не разработана / обнаружена стабильная версия

Ответы [ 4 ]

3 голосов
/ 11 августа 2010

Вы хотите, чтобы пользователь мог работать с файлом Excel в формате Excel (например, столбцы, строки, формулы и т. Д.), Возможно, сохранив его обратно? Если это так, я не могу понять, как вы можете решить эту проблему хорошо, не полагаясь на COM Interop с объектной моделью Excel или интегрируя сторонние библиотеки для работы с листом Excel. Я знаю, что вы сказали, что нет платных решений, но есть некоторые многофункциональные сторонние элементы управления только для работы с файлами Excel в приложениях.

Я заметил в вашем комментарии к SLaks , что конечный продукт - это своего рода «панель инструментов». Если вы намереваетесь разработать собственное приложение для панели мониторинга, рассматривали ли вы анализ файла (ов) Excel для извлечения данных, а затем логического представления их в вашем приложении. Это устраняет необходимость непосредственного отображения и работы с файлом Excel , в то же время позволяя вам работать с данными внутри этого файла. Если вы пытаетесь получить данные вне файла, вот два подхода из многих:

  • Вы можете рассмотреть возможность использования объектной модели Excel и взаимодействия COM для чтения данных из файла Excel в ваше приложение. Конечно, это включает в себя зависимость от устанавливаемого Excel, но это возможно. Эта статья содержит отличный код для начала чтения файлов Excel таким способом.
  • Лучшим способом может быть использование библиотеки, которая не зависит от Excel, установленного в локальной системе. В этом ответе предлагается использовать библиотеку Excel Data Reader , доступную в CodePlex.

Я знаю, что этот ответ обходит ваш первоначальный ответ «размещение документов MS Office в [пользовательском приложении]», но в случае, если вас действительно интересуют данные внутри этих файлов Excel Надеюсь, этот ответ окажется полезным.

2 голосов
/ 09 августа 2010

Это ужасный взлом и должен рассматриваться только как последнее средство: SendKeys.Send("{O}");

http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys%28VS.71%29.aspx

Что-то похожее на
_ieCtrl.Navigate("C:\\test.xls", False);
(code to sleep or wait may be needed here)
SendKeys.Send("{O}");

По сути, вы отправляете в диалоговом окне клавишу «o», чтобы она нажала «открыть».Вы имитируете нажатия клавиш, чтобы нажать кнопку «Открыть».Это хаккей, потому что

  • 1) вам может потребоваться подождать между вызовами.Если вы отправите клавишу o до открытия диалогового окна, оно будет пропущено.Надеемся, что вызов navate завершится, когда появится диалоговое окно (не знаю поведение элемента управления в c #).Возможно, вам придется поэкспериментировать со временем, так как разные компьютеры будут открываться быстрее \ медленнее
  • 2) Если диалоговое окно не отображается на компьютере, вы будете вставлять в него "o".Это может вызвать проблемы при выходе, поскольку может появиться другое диалоговое окно, чтобы попытаться сохранить изменения.Может быть в состоянии предотвратить это, открыв его в режиме только для чтения
  • 3) Для разных версий или окон могут потребоваться разные команды sendkeys.Например, вам может потребоваться отправить «o», а им клавишу «{enter}»
  • 4) Возможно, больше:)
0 голосов
/ 13 августа 2010

Office никогда не предназначался для работы во встроенном режиме , а не на веб-странице или в хосте документа ActiveX. Microsoft снова и снова давала нам предупреждение. От извлечения dsoframer из базы знаний до пропуска раздела реестра BrowserFlags в Office 2007. Перемещайтесь в надстройки Office, Excel Web Access или Office Web Apps как можно быстрее.

0 голосов
/ 05 августа 2010

Если вы хотите открыть файл в отдельном экземпляре Excel (не встроенном в элемент управления WebBrowser), вы можете просто позвонить

Process.Start(@"C:\Test.xls");
...