none
exportación de datos a Excel. Crear un excel con varias 'pestañas' u hojas

    질문

  • Buenas,

    Hasta ahora, siempre que he querido crear un excel sencillo, he utilizado la clase Office.Interop.Excel.Worksheet. Con esta clase, era capaz de poner una cabecera (con los datos correspondientes a los filtros de búsqueda de mi aplicación, y de crear varias columnas que correspondían con las propiedades de una clase de datos. Hasta aquí sin problemas(no sé si me he explicado del todo bien).

    Lo que ahora pretendo es crear un excel (osease un libro) y que dentro de el tenga varias pestañas u hojas. ¿Sábeis como se puede hacer eso?

    Gracias,

    Saludos,

    2012년 12월 2일 일요일 오전 8:16

답변

  • "Igor_DC" preguntó:

    > Lo que ahora pretendo es crear un excel (osease un libro) y que dentro
    > de el tenga varias pestañas u hojas.

    Hola:

    El que un nuevo libro de Excel tenga por defecto 1, 3 ó 25 hojas, dependerá del valor que tenga la opción Incluir este número de hojas que aparece en la pestaña General de las Opciones de Microsoft Excel, que será el valor que tenga el parámetro DefSheets existente en la siguiente clave del registro de Windows:

       HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options

    El valor 14.0 de la clave indicada pertenece a la versión de Excel 2010. Por defecto el valor del parámetro DefSheets es 3, que significa que cada vez que se cree un nuevo libro de trabajo, por defecto tendrá 3 hojas de cálculo.

    > ¿Sábeis como se puede hacer eso?

    Pues añadiendo un nuevo objeto Workbook a la colección Workbooks de un objeto Excel.Application, tal y como muestra el procedimiento que detallo a continuación.

    Inserta en el formulario o clase el siguiente código:

    Imports Microsoft.Office.Interop
    
    Public Class Form1
    
      ' Campo que representa el valor System.Object que falta.
      Private missing As System.Reflection.Missing = System.Reflection.Missing.Value
    
      ' Campo para conocer si se ha cancelado o no la operación.
      Private m_canceled As Boolean
    
      ''' <summary>
      ''' Crea un nuevo libro de trabajo Microsoft Excel.
      ''' </summary>
      ''' <param name="fileName">Nombre y ruta del libro de trabajo.</param>
      ''' <author>Enrique Martínez Montejo - 2012</author>
      ''' <remarks></remarks>
      Private Sub CrearLibroExcel(fileName As Object)
    
            Dim app As Excel.Application = Nothing
            Dim wb As Excel.Workbook = Nothing
    
            Try
                ' Creamos una nueva instancia de la aplicación Excel.
                '
                app = New Excel.Application()
    
                ' Creamos un nuevo libro de trabajo de Excel.
                '
                wb = app.Workbooks.Add()
    
                ' Referenciamos la colección de hojas de cálculo.
                '
                Dim sheets As Excel.Sheets = wb.Sheets

                ' Obtenemos la última hoja de cálculo.
                '
                Dim ws As Excel.Worksheet = DirectCast(sheets(sheets.Count), Worksheet)

                ' Añadimos cuatro hojas a las ya existentes.
                '
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)

    If (fileName Is Nothing) Then ' No se ha especificado la ruta y el nombre del archivo. ' Dim dlgs As Excel.Dialogs = app.Dialogs Dim dlg As Excel.Dialog = dlgs(Excel.XlBuiltInDialog.xlDialogSaveAs) Dim created As Boolean = dlg.Show("Libro1") If (Not (created)) Then ' Se ha cancelado el cuadro de diálogo. m_canceled = True Return End If fileName = wb.FullName End If ' Guardamos el libro de trabajo. ' wb.SaveAs(fileName, missing, missing, missing, missing, missing, _ Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, _ missing, missing, missing) ' Se ha guardado el libro. ' m_canceled = False ' NO ELIMINAR. Catch ex As Exception ' Se ha producido un error. m_canceled = True Finally If (Not (wb Is Nothing)) Then ' Si procede, indicamos que el libro ya ha sido guardado. ' If (Not (wb.Saved)) Then wb.Saved = True ' Cerramos el libro de trabajo. ' wb.Close() End If wb = Nothing If (Not (app Is Nothing)) Then ' Cerramos Excel. ' app.Quit() End If app = Nothing End Try End Sub End Class

    Como podrás observar, tan sólo deberás llamar al procedimiento CrearLibroExcel pasándole la ruta completa con el nombre del archivo que deseas crear.

    Pero para que no tengas problemas con el cierre del proceso de Excel en el Administrador de Tareas de Windows, y ya que vamos a trabajar con un objeto COM, mi consejo sería que iniciaras un nuevo subproceso de apartamento uniproceso (STA). Es decir, que llamaras al procedimjiento CrearLibroExcel como indico a continuación:

       ' Creamos un nuevo subproceso para crear
       ' el  libro de Excel.
       '
       Dim th As New Threading.Thread(AddressOf CrearLibroExcel)
       th.Name = "CrearLibroExcel"
       th.SetApartmentState(Threading.ApartmentState.STA)
       th.Start()
    
       ' Esperamos a que finalice el subproceso
       '
       th.Join()
    
       If (Not (m_canceled)) Then
          MessageBox.Show("El libro se ha creado satisfactoriamente.")
    
       Else
          MessageBox.Show("Se ha cancelado la operación.")
    
       End If

    Y si le quieres pasar una ruta por defecto, iniciarías el subproceso así:

        th.Start("C:\Carpeta\Libro1.xlsx")

    Ni que decir tiene que en tu proyecto de Visual Basic deberás referenciar el Ensamblado de Interoperabilidad Primario (PIA) que se corresponda con la versión de Microsoft Excel que tengas instalada en tu equipo. Es decir, en el cuadro de diálogo Referencias... deberás de referenciar la biblioteca Microsoft.Office.Interop.Excel existente en la pestaña .NET, no en la pestaña .COM de dicho cuadro de diálogo.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.






    2012년 12월 2일 일요일 오전 11:01
  • Imports Excel
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim excel As New Excel.Application
    
            excel.Visible = True
            excel.SheetsInNewWorkbook = 5   ' rango 1 a 255
            Dim wb As Workbook = excel.Workbooks.Add()
    
        End Sub
    End Class
    

    2012년 12월 2일 일요일 오전 11:17

모든 응답

  • Lo que ahora pretendo es crear un excel (osease un libro) y que dentro de el tenga varias pestañas u hojas. ¿Sábeis como se puede hacer eso?

    si has usado las api de interop de excel habras notado que tiene clases como ser WookBook y WorkSheet

    bueno si en el workbook agregas una nueva worksheet habvras creado una solapa nueva con la cual trabajar

    Worksheets.Add Method 

    Working with Worksheets

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    2012년 12월 2일 일요일 오전 10:58
  • "Igor_DC" preguntó:

    > Lo que ahora pretendo es crear un excel (osease un libro) y que dentro
    > de el tenga varias pestañas u hojas.

    Hola:

    El que un nuevo libro de Excel tenga por defecto 1, 3 ó 25 hojas, dependerá del valor que tenga la opción Incluir este número de hojas que aparece en la pestaña General de las Opciones de Microsoft Excel, que será el valor que tenga el parámetro DefSheets existente en la siguiente clave del registro de Windows:

       HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options

    El valor 14.0 de la clave indicada pertenece a la versión de Excel 2010. Por defecto el valor del parámetro DefSheets es 3, que significa que cada vez que se cree un nuevo libro de trabajo, por defecto tendrá 3 hojas de cálculo.

    > ¿Sábeis como se puede hacer eso?

    Pues añadiendo un nuevo objeto Workbook a la colección Workbooks de un objeto Excel.Application, tal y como muestra el procedimiento que detallo a continuación.

    Inserta en el formulario o clase el siguiente código:

    Imports Microsoft.Office.Interop
    
    Public Class Form1
    
      ' Campo que representa el valor System.Object que falta.
      Private missing As System.Reflection.Missing = System.Reflection.Missing.Value
    
      ' Campo para conocer si se ha cancelado o no la operación.
      Private m_canceled As Boolean
    
      ''' <summary>
      ''' Crea un nuevo libro de trabajo Microsoft Excel.
      ''' </summary>
      ''' <param name="fileName">Nombre y ruta del libro de trabajo.</param>
      ''' <author>Enrique Martínez Montejo - 2012</author>
      ''' <remarks></remarks>
      Private Sub CrearLibroExcel(fileName As Object)
    
            Dim app As Excel.Application = Nothing
            Dim wb As Excel.Workbook = Nothing
    
            Try
                ' Creamos una nueva instancia de la aplicación Excel.
                '
                app = New Excel.Application()
    
                ' Creamos un nuevo libro de trabajo de Excel.
                '
                wb = app.Workbooks.Add()
    
                ' Referenciamos la colección de hojas de cálculo.
                '
                Dim sheets As Excel.Sheets = wb.Sheets

                ' Obtenemos la última hoja de cálculo.
                '
                Dim ws As Excel.Worksheet = DirectCast(sheets(sheets.Count), Worksheet)

                ' Añadimos cuatro hojas a las ya existentes.
                '
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)
                ws = DirectCast(sheets.Add(missing, ws, missing), Worksheet)

    If (fileName Is Nothing) Then ' No se ha especificado la ruta y el nombre del archivo. ' Dim dlgs As Excel.Dialogs = app.Dialogs Dim dlg As Excel.Dialog = dlgs(Excel.XlBuiltInDialog.xlDialogSaveAs) Dim created As Boolean = dlg.Show("Libro1") If (Not (created)) Then ' Se ha cancelado el cuadro de diálogo. m_canceled = True Return End If fileName = wb.FullName End If ' Guardamos el libro de trabajo. ' wb.SaveAs(fileName, missing, missing, missing, missing, missing, _ Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, _ missing, missing, missing) ' Se ha guardado el libro. ' m_canceled = False ' NO ELIMINAR. Catch ex As Exception ' Se ha producido un error. m_canceled = True Finally If (Not (wb Is Nothing)) Then ' Si procede, indicamos que el libro ya ha sido guardado. ' If (Not (wb.Saved)) Then wb.Saved = True ' Cerramos el libro de trabajo. ' wb.Close() End If wb = Nothing If (Not (app Is Nothing)) Then ' Cerramos Excel. ' app.Quit() End If app = Nothing End Try End Sub End Class

    Como podrás observar, tan sólo deberás llamar al procedimiento CrearLibroExcel pasándole la ruta completa con el nombre del archivo que deseas crear.

    Pero para que no tengas problemas con el cierre del proceso de Excel en el Administrador de Tareas de Windows, y ya que vamos a trabajar con un objeto COM, mi consejo sería que iniciaras un nuevo subproceso de apartamento uniproceso (STA). Es decir, que llamaras al procedimjiento CrearLibroExcel como indico a continuación:

       ' Creamos un nuevo subproceso para crear
       ' el  libro de Excel.
       '
       Dim th As New Threading.Thread(AddressOf CrearLibroExcel)
       th.Name = "CrearLibroExcel"
       th.SetApartmentState(Threading.ApartmentState.STA)
       th.Start()
    
       ' Esperamos a que finalice el subproceso
       '
       th.Join()
    
       If (Not (m_canceled)) Then
          MessageBox.Show("El libro se ha creado satisfactoriamente.")
    
       Else
          MessageBox.Show("Se ha cancelado la operación.")
    
       End If

    Y si le quieres pasar una ruta por defecto, iniciarías el subproceso así:

        th.Start("C:\Carpeta\Libro1.xlsx")

    Ni que decir tiene que en tu proyecto de Visual Basic deberás referenciar el Ensamblado de Interoperabilidad Primario (PIA) que se corresponda con la versión de Microsoft Excel que tengas instalada en tu equipo. Es decir, en el cuadro de diálogo Referencias... deberás de referenciar la biblioteca Microsoft.Office.Interop.Excel existente en la pestaña .NET, no en la pestaña .COM de dicho cuadro de diálogo.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.






    2012년 12월 2일 일요일 오전 11:01
  • Imports Excel
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim excel As New Excel.Application
    
            excel.Visible = True
            excel.SheetsInNewWorkbook = 5   ' rango 1 a 255
            Dim wb As Workbook = excel.Workbooks.Add()
    
        End Sub
    End Class
    

    2012년 12월 2일 일요일 오전 11:17
  • "Walter Miguel" escribió:

    > excel.SheetsInNewWorkbook = 5   ' rango 1 a 255

    ¡Pues también llevas razón! Otra manera de añadir un número de hojas determinadas al nuevo libro de trabajo. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    2012년 12월 2일 일요일 오전 11:35