vb.net - studio - abrir word desde visual basic
Automatización de Word: no se pudo abrir el almacenamiento de macro (3)
Mi aplicación (aplicación vb.net windows implementada a través de ClickOnce) usa Word para abrir y llenar plantillas .dot para crear nuevos documentos de Word. Hago referencia a la biblioteca de objetos de Microsoft Word 14 y uso este código:
Dim oWord As Word.Application = Nothing
Dim oDoc As Word.Document = Nothing
Try
oWord = New Word.Application
Dim strFileName As String = ""
Select Case strType
Case "LettreReception"
strFileName = Path.Combine(GetParam(1), "Template_LettreReception.dot")
If File.Exists(strFileName) Then
oDoc = oWord.Documents.Add(strFileName)
En la última línea, recibo el error " no se pudo abrir el almacenamiento de macros " en las máquinas implementadas (no en mi máquina de desarrollo).
Desarrollo con Windows 7 - Office 2010 - VS 2010 (.Net 3.5). Mi máquina de implementación también es un Windows 7 con Office 2010 instalado.
Traté de eliminar normal.dotm (encontré algunos enlaces asesorándolo) sin éxito. La plantilla .dot utilizada no contiene macro.
Debido a que Word Interop se está ejecutando realmente detrás de escena como si se estuviera ejecutando en una sesión interactiva, se requieren ciertos permisos de la cuenta utilizada durante la ejecución.
¿Estás utilizando autenticación y suplantación de Windows en tu aplicación web? Si es así, el usuario que se suplanta debe tener derechos de inicio de sesión locales en el servidor para ejecutar Word ... Además, debe iniciar sesión en el servidor con esa cuenta al menos una vez para que exista un perfil en esa máquina para ese usuario para que la colmena de registro se pueda cargar. También descubrí que es posible que necesite ejecutar Word al menos una vez como ese usuario (para asegurarse de que los primeros mensajes de inicialización se solucionen antes de intentar ejecutar Word desde el código).
De lo contrario, la cuenta de servicio bajo la cual se ejecuta la aplicación (generalmente SERVICIO DE RED) requiere los permisos mencionados anteriormente (que describiré en breve) y tendrá que hacer algo como cargar una sección de registro dinámicamente en tiempo de ejecución. Personalmente, prefiero implementar una suplantación temporal en código con una cuenta de usuario que tenga permisos de inicio de sesión local en el servidor en cuestión.
Los permisos de inicio de sesión local pueden ser un poco complicados según la red y la configuración de la directiva de grupo (si desea estar seguro y no solo usar una cuenta de administrador de dominio).
La razón por la cual todo funciona en su computadora que se ejecuta en VS es porque el contexto de la aplicación web es SU cuenta de usuario, que, por supuesto, tiene permisos de inicio de sesión local en su máquina con una sección de registro que se puede cargar.
Ahora para los permisos:
Primero, debe ejecutar "dcomcnfg" en el servidor y hacer la siguiente modificación de configuración:
- Haga clic con el botón derecho en Servicios de Componente / computadoras / Mi Computadora / Config DCOM / Microsoft Word 97 - Documento 2003 y vaya a Propiedades
- En la pantalla Propiedades, vaya a la pestaña Seguridad y cambie los "Permisos de inicio y activación" a Personalizar.
- Haga clic en el botón Editar y agregue la cuenta de servicio NETWORK de la computadora local (si no está usando suplantación ... Si usa la suplantación, agregue el usuario o grupo apropiado) a la lista de usuarios y marque "Lanzamiento local" y "Activación local"
Asegúrese de que la cuenta de servicio de RED de la computadora local (Si no está usando suplantación ... Si usa la suplantación, entonces el usuario o grupo apropiado) tiene los permisos de lectura / modificación apropiados en la (s) carpeta (s) y archivo (s) que abrirá y / o guardar para.
Cree un directorio de "Escritorio" en: C: / Windows / System32 / config / systemprofile / y otorgue permisos Completos a la cuenta de servicio de RED local (o la cuenta con la que se ejecuta la aplicación ASP .NET) [NOTA: Creo esto y el siguiente paso solo se aplica si NO se usa la suplantación]
Otorgue permisos de modificación / lectura / ejecución en la carpeta C: / Windows / System32 / config / systemprofile
Espero que ayude a algunos y no sea demasiado confuso ...
"no se pudo abrir el macro almacenaje" le dice que VBA está buscando un archivo de almacenamiento estructurado en particular, como un .DOT o .DOC, y buscando el almacenamiento (un tipo de transmisión dentro del archivo) en ese archivo que contiene el VBA código. Si no puede abrirlo, las posibles razones incluyen:
- el contenedor (el .doc / .dot) no está allí
- el contenedor no se puede abrir con los permisos de la persona que llama
- el contenedor está allí pero el almacenamiento no está allí (por ejemplo, en el sistema de destino hay un contenedor con el nombre esperado, pero no contiene macros)
- el contenedor está allí y el almacenamiento está allí, pero no se puede abrir con los permisos de la persona que llama
Así que una cosa es hacer a través de su proyecto buscando cualquier cosa que haga referencia (tal vez incluso otros objetos o archivos DLL que haya especificado a través de Herramientas-> Referencias) que no se entreguen con su plantilla.
Verifique las propiedades del documento Word y asegúrese de que los archivos estén desbloqueados. A veces, cuando obtienes los documentos de una computadora diferente o los descargas de Internet, se bloquearán, lo que provocará el lanzamiento de esta excepción "no se pudo abrir el macro almacenaje".