Principales respuestas
Asignacion de variables

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
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/
- Editado Fernando ReyesModerator martes, 9 de julio de 2013 11:11 Ya está deburado
- Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 18:12
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á ----||
-
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/
- Editado Fernando ReyesModerator martes, 9 de julio de 2013 11:11 Ya está deburado
- Marcado como respuesta Uriel Almendra viernes, 16 de agosto de 2013 18:12