Archivo

Archive for 6 julio 2012

Ejecutar macros de office en c# .net

julio 6, 2012 2 comentarios

Hola a todos existe una manera de poder ejecutar las macros que hemos realizado en Word, Excel o powerpoint desde código .net aca les dejo el código para lograrlo y lo que necesitamos para cada tipo, tengan en cuenta que una de las condiciones para lograrlo es tener instalado office donde se correrá la macro.

             
switch (strType.ToLower())
{

case "word":

Microsoft.Office.Interop.Word.ApplicationClass oWord =
default(Microsoft.Office.Interop.Word.ApplicationClass);

//inicia la aplicacion de word
Type t = Type.GetTypeFromProgID("Word.Application");
oWord = (Microsoft.Office.Interop.Word.ApplicationClass)System.Activator.CreateInstance(t);

//crea un objeto de no siempre es necesario
//object ooWord = Interaction.CreateObject("Word.Application");

//se abre el documento y se ejecuta la macro si esta configurado para ejecutarse al abrir
oWord.Documents.Open(rootApplication);

////corre la macro
//oWord.Run("DoKbTest");
////oWord.Run("DoKbTestWithParameter", "Hello from VB .NET Client");

System.Threading.Thread.Sleep(1000);

//sale del documento
oWord.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
oWord = null;

break;

case "excel":

Microsoft.Office.Interop.Excel.ApplicationClass oExcel =
default(Microsoft.Office.Interop.Excel.ApplicationClass);

//inicia la aplicación de excel
Type tExe = Type.GetTypeFromProgID("Excel.Application");
oExcel = (Microsoft.Office.Interop.Excel.ApplicationClass)System.Activator.CreateInstance(tExe);

var oBooks = oExcel.Workbooks;

//se abre la primera hoja y se ejecuta la macro si esta congiurado asi
oBooks.Open(rootApplication);

////corre una macro especifica
//oWord.Run("DoKbTest");
////oWord.Run("DoKbTestWithParameter", "Hello from VB .NET Client");

System.Threading.Thread.Sleep(1000);

//salir del documento de excel y liberar el recurso
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
oExcel = null;

break;

case "powerPoint":

Microsoft.Office.Interop.PowerPoint.ApplicationClass oPowerP =
default(Microsoft.Office.Interop.PowerPoint.ApplicationClass);

//se inicia la aplicación de powerpoint
Type tPP = Type.GetTypeFromProgID("PowerPoint.Application");
oPowerP =
(Microsoft.Office.Interop.PowerPoint.ApplicationClass)System.Activator.CreateInstance(tPP);

var oPresentations = oPowerP.Presentations;

//abre la macro y se ejecuta inmediatamente si esta configurado de esa manera
oPresentations.Open(rootApplication);

////ejecuta la macro especifica
//oWord.Run("DoKbTest");
////oWord.Run("DoKbTestWithParameter", "Hello from VB .NET Client");

System.Threading.Thread.Sleep(1000);

//sale el documento de powerpoint
oPowerP.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oPowerP);
oExcel = null;

break;
}

Verificar accesos y permisos a una carpeta en una aplicación .net

En este post quiero explicarles cómo pueden hacer para comprobar permisos en un directorio, esto aplica para aplicaciones Web, de escritorio y demás.. lo pueden lazar desde una dll o librería de clases.

  1. Comprobar si un directorio existe:
if (System.IO.Directory.Exists(strRuta_Informacion))

Lo primero entonces es comprobar que el directorio existe para eso usamos el anterior código que nos devolverá un true o false. No solo comprobamos si existe sino si se tiene acceso al compartirlo cuando el directorio está en red.

  1. Comprobar accesos y autorización:
try
{
AuthorizationRuleCollection collection = 
Directory.GetAccessControl(strRuta_Informacion).GetAccessRules(true,
 true, typeof(System.Security.Principal.NTAccount));
foreach (FileSystemAccessRule rule in collection)
{
if (rule.AccessControlType == AccessControlType.Allow)
{
break;
}
}
}
catch (UnauthorizedAccessException ex)
{
}
catch (Exception ex)
{
}

Con este código podemos saber si estamos autorizados para ver y leer la carpeta debemos capturar una excepción y luego también de finalizar el foreach si no encontramos permisos es porque no tenemos ninguna acceso a dicha carpeta.

Este código no nos sirve  o no es muy fiable para comprobar los permisos de escritura para eso recomiendo usar el siguiente:

  1. Comprobar permisos de escritura sobre una carpeta:
try
{
using (FileStream fs = File.Create(Path.Combine(strRuta_Informacion,
 "AccessTemp.txt"), 1, FileOptions.DeleteOnClose))
{
fs.Close();
}

}
catch (Exception ex)
{
}

Este código es el que recomiendo para tal fin, lo que hace es crear un archivo temporal dentro de la ruta, este archivo lo cerramos inmediatamente de creado y se borra. esto nos asegura por completo que tenemos permiso de escritura sobre esa carpeta.

Si tienen alguna duda o una mejor forma de detectar estos permisos y accesos me cuentan Gracias.