none
Asignacion de variables RRS feed

  • Pregunta

  • Estimados

    Estoy trabajando en un shell que genere un excel, y que las columnas de cabecera (titulos) sean los campos de una query

    Mi problema es el siguiente: No puedo asignar un Item(celda) a un registro de la query.

    Les adjunto parte del codigo para que vean

    $DataSet = New-Object Systema.Data.DataSet
    $sqlAdapter.Fill($DataSet)
    #Lleno el data set con el resultado de la query
    $xl = New-Object -ComObject "Excel.Application"
    $wb = $xl.Workbooks.Add()
    $ws = $wb.ActiveSheet
    $cells = $ws.Cells
    $i=1
    $rs = $DataSet.Tables[0]
    foreach($campo im $rs){     
       $cells.Item(1,$i) = $campo
    }


    ----------------Creo excel e intento escribir las columas de la fila 1 con lo que devuelve la query

    Agradeceria una ayudita :D

    de antemano muchas gracias!!


    • Editado edoramtej viernes, 28 de junio de 2013 15:18
    viernes, 28 de junio de 2013 15:17

Respuestas

  • Mira si te puede valer esto. La consulta que se ponga es indiferente, pues escribirá los resultados en Excel poniendo las etiquetas de los campos en la primera fila; da igual cuántos campos tenga la consulta, da igual cuántos registros. Como ejemplo vuelco los grupos de equipos de un servidor WSUS, que se supone que tiene su base de datos en la instancia predeterminada de un servidor SQL Server de nombre sqlserver.tudominio.local:

    # Conectamos con el servidor SQL Server
    $strConn = "server=sqlserver.tudominio.local;Database=SUSDB;Trusted_Connection=True;"
    $Conn = new-object System.Data.SqlClient.SqlConnection($strConn)
    $Conn.Open()
    
    # Obtenemos la consulta
    $Select = "SELECT * FROM tbTargetGroup"
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($Select,$Conn)
    
    # Creamos y cargamos el DataSet
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    
    # Abrimos Excel, agregamos un libro, y obtenemos la hoja activa
    $xl = New-Object -ComObject "Excel.Application"
    $wb = $xl.Workbooks.Add()
    $ws = $wb.ActiveSheet
    $cells = $ws.Cells
    $xl.Visible = $true
    
    # Iniciamos el contador de filas
    $Fila = 1
    
    # Obtenemos el recordset
    $rs = $DataSet.Tables[0]
    
    # Recorremos los registros de que consta la consulta
    For($Registro=0;$Registro -lt $rs.Rows.Count;$Registro++)
    {
        # Iniciamos el contador de columnas
        $Columna = 1
    
        # Recorremos los campos de la consulta
        ForEach($Campo In $rs.Columns)
        {
            # Si estamos en la fila 3 o más, escribiremos el dato de la columna actual
            # en la celda correspondiente
            If($Fila -gt 2)
            {
                $Cells.Item($Fila,$Columna) = $rs.Rows[$Registro].($Campo.ColumnName).ToString()
            }
            # Si estamos en la fila 1, escribimos el nombre del campo en la fila 1
            # y el dato del primer registro en la fila 2
            Else
            {
                $Cells.Item($Fila,$Columna) = $Campo.Caption
                $Cells.Item($Fila + 1,$Columna) = $rs.Rows[0].($Campo.ColumnName).ToString()
            }
            # Incrementamos la columna para la siguiente vuelta de campos
            $Columna++
        }
        # Terminadas todas las columnas, incrementamos las filas, en uno si es
        # la 3ª o más y si no la establecemos a 3, con lo que queda preparada
        # la siguiente vuelta de registros
        If($Fila -gt 2)
        {
            $Fila++
        }
        Else
        {
            $Fila = 3
        }
    }


    Un saludo Fernando Reyes MCSA 2000/2003/2012 MCSE 2000/2003 MCITP EnterpriseAdministrator Web: http://freyes.svetlian.com Blog: http://urpiano.wordpress.com RSS: http://urpiano.wordpress.com/feed/


    lunes, 8 de julio de 2013 15:57
    Moderador

Todas las respuestas

  • Creo que si trabajas en texto plano, podrás hacerlo mejor ;)

    realizas la consulta pertiente y concatenas con el export-csv

    ejemplo:

    Get-Hotfix –description “Security Update” |export-csv c:\MisVM.csv

    al abrirlo en excel, ya lo hará en formato de tablas (aunque sea un CSV), y al guardarlo, lo guardas en xls o xlsx

    Un Saludo,


    -------------------------------------------------------- @eManu_es | MTCS Windows Server Virtualization | MTCS Windows Server 2008 Active Directory | CCA XenAPP for Windows 2008 | CCA XenDesktop 5 ||---- Marca la respuesta si te ha sido de utilidad - a otros compañeros les ayudará ----||

    lunes, 8 de julio de 2013 14:12
  • Mira si te puede valer esto. La consulta que se ponga es indiferente, pues escribirá los resultados en Excel poniendo las etiquetas de los campos en la primera fila; da igual cuántos campos tenga la consulta, da igual cuántos registros. Como ejemplo vuelco los grupos de equipos de un servidor WSUS, que se supone que tiene su base de datos en la instancia predeterminada de un servidor SQL Server de nombre sqlserver.tudominio.local:

    # Conectamos con el servidor SQL Server
    $strConn = "server=sqlserver.tudominio.local;Database=SUSDB;Trusted_Connection=True;"
    $Conn = new-object System.Data.SqlClient.SqlConnection($strConn)
    $Conn.Open()
    
    # Obtenemos la consulta
    $Select = "SELECT * FROM tbTargetGroup"
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($Select,$Conn)
    
    # Creamos y cargamos el DataSet
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    
    # Abrimos Excel, agregamos un libro, y obtenemos la hoja activa
    $xl = New-Object -ComObject "Excel.Application"
    $wb = $xl.Workbooks.Add()
    $ws = $wb.ActiveSheet
    $cells = $ws.Cells
    $xl.Visible = $true
    
    # Iniciamos el contador de filas
    $Fila = 1
    
    # Obtenemos el recordset
    $rs = $DataSet.Tables[0]
    
    # Recorremos los registros de que consta la consulta
    For($Registro=0;$Registro -lt $rs.Rows.Count;$Registro++)
    {
        # Iniciamos el contador de columnas
        $Columna = 1
    
        # Recorremos los campos de la consulta
        ForEach($Campo In $rs.Columns)
        {
            # Si estamos en la fila 3 o más, escribiremos el dato de la columna actual
            # en la celda correspondiente
            If($Fila -gt 2)
            {
                $Cells.Item($Fila,$Columna) = $rs.Rows[$Registro].($Campo.ColumnName).ToString()
            }
            # Si estamos en la fila 1, escribimos el nombre del campo en la fila 1
            # y el dato del primer registro en la fila 2
            Else
            {
                $Cells.Item($Fila,$Columna) = $Campo.Caption
                $Cells.Item($Fila + 1,$Columna) = $rs.Rows[0].($Campo.ColumnName).ToString()
            }
            # Incrementamos la columna para la siguiente vuelta de campos
            $Columna++
        }
        # Terminadas todas las columnas, incrementamos las filas, en uno si es
        # la 3ª o más y si no la establecemos a 3, con lo que queda preparada
        # la siguiente vuelta de registros
        If($Fila -gt 2)
        {
            $Fila++
        }
        Else
        {
            $Fila = 3
        }
    }


    Un saludo Fernando Reyes MCSA 2000/2003/2012 MCSE 2000/2003 MCITP EnterpriseAdministrator Web: http://freyes.svetlian.com Blog: http://urpiano.wordpress.com RSS: http://urpiano.wordpress.com/feed/


    lunes, 8 de julio de 2013 15:57
    Moderador