3ENGINE

Programación y otros cachivaches

Categoría: Tecnologia

Página 25/45

Tecnologia

Ejecutar una macro externa en un .csv de Excel y grabar el resultado en formato .xls de Excel


Si necesitais darle un poco de vida y colorido a un fichero en formato .csv de Excel. Quizas os sirva este ejemplo. Se trata de ejecutar una macro previamente grabada para darle un nuevo formato a la hoja Excel (colorear columnas, cambiar de tamaño las letras, crear gráficos, etc…) para despues grabar el resultado en formato .xls. Comparto este código escrito en c# por si puede ser útil.

Requisito 1: antes de ejecutar el código es importante habilitar la opción «Confiar en el acceso a proyectos de Visual Basic» en la pestaña «Editores de confianza» que se encuentra en Herramientas>Macro> Seguridad.

Requisito 2: debeis tener instaladas las PIAS para Excel.

Código:


    using Microsoft.Office.Interop.Excel;
    using Microsoft.Vbe.Interop;
    .
    .
    public static class MacroExcel
    {
        /*
         * ejecuta macro sobre un csv y devuelve path del xls resultante
         */        public static string abrirCsvEjecutarMacroyGrabarXls(string pathFicheroCsv, string pathMacro, string nombreFuncionMacro)
        {            
            object missing = System.Reflection.Missing.Value;
            string pathXls = Path.ChangeExtension(pathFicheroCsv, "xls");
            //
            // abrir csv
            //
            ApplicationClass excel = new ApplicationClass();
            Workbooks books = excel.Workbooks;
            _Workbook book = books.Open(pathFicheroCsv, missing, missing, missing, missing, missing, missing, missing, missing,
                            missing, missing, missing, missing, missing, missing);
            try
            {
                //                      
                // abrir macro
                //
                VBComponentClass vbComp = (VBComponentClass)excel.VBE.ActiveVBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
                vbComp.CodeModule.AddFromFile(pathMacro);
                //
                // ejecutar macro
                // 
                excel.Run(nombreFuncionMacro, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing);
                //
                // eliminar la macro del xls
                //
                vbComp.CodeModule.DeleteLines(1, vbComp.CodeModule.CountOfLines);
                //
                // grabar xls
                //
                File.Delete(pathXls);
                book.SaveAs(pathXls, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, missing,
                    missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
            }
            finally
            {
                books.Close();
            }
            return pathXls;
        }
    }

Referencias:
Enlace 2
Enlace 1




Tecnologia

Split de una cadena separada por comas y acotada por dobles comillas (PHP y C#)


Si necesitais dividir una cadena en una matriz, donde los elementos de la cadena estan separados por coma (,) y opcionalmente un elemento puede estar acotado por doble comillas («). Una expresión regular y un poco de código extra puede ayudaros.

Código de prueba en c#:

     MatchCollection mc = Regex.Matches(
        ",\"hola desde\",\"una,dos,tres\",1,2,3,lineas,de codigo"+",", 
        "([^,\"]*,|\"[^\"]*\",)");
     foreach (Match m in mc)
     {
         System.Console.WriteLine(m.Value.Trim(',').Trim('"'));                               
     }

Función en PHP:

    function split_cadena_acotada($texto)
    {
        preg_match_all("([^,\"]*,|\"[^\"]*\",)", $texto.",", $matching_data);
        array_walk($matching_data[0], 'trim_value');
        return $matching_data[0];
    }
    function trim_value(&$value)
    { 
        $value = trim($value);
        $value = trim($value,',');
        $value = trim($value,'"');
    }



Tecnologia

Activar y desactivar todas las restricciones de tabla en Oracle para eliminar datos


Si necesitas eliminar todos los datos de una base de datos, y no tienes ganas de pensar en el orden de los «delete from tablaXYS» para cumplir con las restricciones de integridad. Lo mas rápido es desactivar las foreign keys, eliminar todas las tablas y dejar otra vez las foreign keys como estaban.

Activar y desactivar todas las restricciones de tabla en Oracle

Deshabilitar todas las foreign keys de todas las tablas:

BEGIN  
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name    
   FROM user_constraints c, user_tables t    
   WHERE c.table_name = t.table_name    
   AND c.status = 'ENABLED'
   AND c.CONSTRAINT_TYPE = 'R'     
   ORDER BY c.constraint_type DESC)   
LOOP     
  dbms_utility.exec_ddl_statement('alter table ' || c.owner || 
  '.' || c.table_name || 'disable constraint ' || c.constraint_name);   
END LOOP; 
END;

Volver a habilitar todas las foreign keys de todas las tablas:

BEGIN  
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   AND c.CONSTRAINT_TYPE = 'R'    
   ORDER BY c.constraint_type)
LOOP
  dbms_utility.exec_ddl_statement('alter table ' || c.owner || 
   '.' || c.table_name || ' enable constraint ' || c.constraint_name);   
END LOOP; 
END;

Recursos
Disable all table constraints in Oracle




Tecnologia

line-feed o carriage-return en Oracle


En Oracle, para añadir a un texto un line-feed o un carriage-return:

  SELECT '"' || chr(10) || '"' FROM DUAL;
  SELECT '"' || chr(13) || '"' FROM DUAL;

De modo que para buscar, por ejemplo, un texto que contenga un line-feed:

  SELECT * FROM MITABLA WHERE MICAMPO LIKE '%'||chr(10)||'%';