none
el formato y la extensión de archivo no coincide Excel RRS feed

  • Pregunta

  • Hola a todos, tengo una aplicación que crea un Excel (.xls), pero cuando abre el archivo me sale el error:

    "El formato y la extensión de archivo nnnn.xls no coincide. Puede que el archivo esté dañado o no sea seguro..."

    Si abro el archivo para comprobar los datos parece que todo este bien, pero cuando se intenta leer el archivo desde otra aplicación no se puede. Ahora bien, si cuando abro el archivo y 'guardar como' le pongo con extensión '.xls' entonces si se puede leer bien desde la otra aplicación.

    ¿Se puede corregir de alguna forma para que se guarde correctamente el archivo al crearlo desde VB.net?

    viernes, 26 de febrero de 2021 8:32

Todas las respuestas

  • Hola:

    Para poder decirte algo, tendras que poner el codigo de como lo estas haciendo porque sino es todo "imaginacion"

    Un saludo desde Bilbo
    Carlos
    viernes, 26 de febrero de 2021 12:40
  • Hola,

    Como lo mencionan sería bueno que compartas el código que estás desarrollando para recrear el problema y poderte ayudar.

    Saludos,

    Eric Ruiz

    viernes, 26 de febrero de 2021 15:07
    Moderador
  • ¿El archivo lo genera una aplicación web? Existe una "chapuza" muy típica que a veces hacen los desarrolladores web cuando tienen que exportar a Excel, que consiste en pintar los datos en una tabla de HTML y luego cuando el usuario pulsa "descargar Excel" le devuelven la tabla HTML poniendo en las cabeceras HTTP que se trata de un archivo Excel (cuando en realidad lo que contiene en el interior no es Excel sino HTML).

    Los Excel más antiguos lo reconocían y abrían el HTML con normalidad como si fuera un xls nativo, con lo que el usuario de la web no notaba nada y parecía que había descargado un archivo Excel. Los Excel modernos también lo abren, pero primero te presentan un aviso para advertirte que el contenido no es Excel de verdad aunque la extensión del archivo lo aparente.

    No tiene ningún remedio fácil. O bien te aguantas y pulsas Ok cuando te salga el aviso, o si no quieres que eso suceda entonces hay que rehacer la aplicación que genera el archivo y usar alguna librería que de verdad genere archivos Excel. Obviamente, esto es mucho más costoso que simplemente servir la tabla HTML que ya tiene la aplicación, pero si de verdad necesitas suprimir el aviso no hay más remedio que hacer este esfuerzo.

    sábado, 27 de febrero de 2021 13:07
  • Hola a todos y gracias de antemano por vuestro tiempo.

    Este es el código para crear al archivo .xls.

       Private Sub ExportPedidoToExcel(ByVal sFichero As String)
          Dim contador = 0
          ' Verificamos los parámetros pasados
          Dim app As Excel.Application = Nothing
          Dim libro As Excel.Workbook = Nothing
          Dim hoja As Excel.Worksheet = Nothing
          Try
             ' Referenciamos la aplicación Excel.
             app = New Excel.Application()
             'Creamos una instancia del Workbooks de Excel
             libro = app.Workbooks.Add
             ' Referenciamos la hoja de cálculo del libro.
             hoja = CType(libro.Worksheets(1), Excel.Worksheet)
             hoja.Name = txtHoja.Text
             With hoja
                ' Limpiamos el contenido de toda la hoja.
                .Cells.Select()
                .Cells.ClearContents()
                ' Seleccionamos la primera celda de la hoja.
                .Range("A1").Select()
                ' Escribimos los nombres de las columnas en la primera
                ' celda de la primera fila de la hoja de cálculo
                Dim fila = 1
                Dim columna = 1
                '
                ' Escribimos los nombres de las columnas en la primera fila 
                '
                For Each dc As DataColumn In dtExportar.Columns
                   .Cells(fila, columna) = dc.ColumnName
                   columna += 1
                Next
                fila += 1
                ' Establecemos los atributos de la fuente para las celdas de la primera fila.
                With .Range(.Cells(1, 1), .Cells(1, dtExportar.Columns.Count)).Font
                   .Name = "Calibri"
                   .Bold = True
                   .Size = 12
                End With
                '
                ' Pasamos los valores de la tabla al Excel      
                For Each row As DataRow In dtExportar.Rows
                   ' Primera columna
                   columna = 1
                   For Each dc As DataColumn In dtExportar.Columns
                      .Cells(fila, columna) = Trim(row(dc.ColumnName).ToString)
                      columna += 1
                   Next
                   fila += 1
                   'Incrementamos la barra de progreso
                   IncrementarProgreso()
                Next
                ' Autoajustamos el ancho de todas las columnas utilizadas.
                .Columns().AutoFit()
             End With
          Catch ex As Exception
             ' Se ha producido una excepción; indicamos que el libro ha sido guardado.
             If (libro IsNot Nothing) Then libro.Saved = True
             'Devolvemos la excepción al procedimiento llamador
             Throw
          Finally
             Try
                hoja = Nothing
                If (libro IsNot Nothing) Then
                   ' Si procede, guardamos el libro de trabajo.
                   Try
                      If ExisteFichero(sFichero) Then File.Delete(sFichero)
                      libro.SaveAs(sFichero)
                   Catch ex As Exception
                      TDialogOK("ATENCION", eTaskDialogIcon.Information, ex.Message)
                   End Try
                   libro.Close()
                   If chkAbrirExcel.Checked Then Process.Start(sFichero)
                End If
                libro = Nothing
                If (app IsNot Nothing) Then
                   ' Si procede, cerramos Excel y disminuimos el recuento de referencias al objeto Excel.Application.
                   app.Quit()
                   While (Marshal.ReleaseComObject(app) > 0)
                      ' Sin implementación.
                   End While
                End If
             Catch ex As Exception
                Exit Try
             End Try
             app = Nothing
          End Try
       End Sub
    

    que como digo funciona bien, salvo que al abrir el archivo me indica el error motivo de la consulta.

    No obstante estuve en contacto con la empresa que lee el archivo y al final la solución fue crear un archivo .txt con los campos limitados y de esta forma funcionó todo correctamente.

    un saludo.

    lunes, 1 de marzo de 2021 13:57
  • Hola a todos, primero daros las gracias por vuestro tiempo.

    El siguiente código me crea el archivo (.xls que funciona bien, salvo por el problema que os indico en la consulta).

       Private Sub ExportPedidoToExcel(ByVal sFichero As String)
          Dim contador = 0
          ' Verificamos los parámetros pasados
          Dim app As Excel.Application = Nothing
          Dim libro As Excel.Workbook = Nothing
          Dim hoja As Excel.Worksheet = Nothing
          Try
             ' Referenciamos la aplicación Excel.
             app = New Excel.Application()
             'Creamos una instancia del Workbooks de Excel
             libro = app.Workbooks.Add
             ' Referenciamos la hoja de cálculo del libro.
             hoja = CType(libro.Worksheets(1), Excel.Worksheet)
             hoja.Name = txtHoja.Text
             With hoja
                ' Limpiamos el contenido de toda la hoja.
                .Cells.Select()
                .Cells.ClearContents()
                ' Seleccionamos la primera celda de la hoja.
                .Range("A1").Select()
                ' Escribimos los nombres de las columnas en la primera
                ' celda de la primera fila de la hoja de cálculo
                Dim fila = 1
                Dim columna = 1
                '
                ' Escribimos los nombres de las columnas en la primera fila 
                '
                For Each dc As DataColumn In dtExportar.Columns
                   .Cells(fila, columna) = dc.ColumnName
                   columna += 1
                Next
                fila += 1
                ' Establecemos los atributos de la fuente para las celdas de la primera fila.
                With .Range(.Cells(1, 1), .Cells(1, dtExportar.Columns.Count)).Font
                   .Name = "Calibri"
                   .Bold = True
                   .Size = 12
                End With
                '
                ' Pasamos los valores de la tabla al Excel      
                For Each row As DataRow In dtExportar.Rows
                   ' Primera columna
                   columna = 1
                   For Each dc As DataColumn In dtExportar.Columns
                      .Cells(fila, columna) = Trim(row(dc.ColumnName).ToString)
                      columna += 1
                   Next
                   fila += 1
                   'Incrementamos la barra de progreso
                   IncrementarProgreso()
                Next
                ' Autoajustamos el ancho de todas las columnas utilizadas.
                .Columns().AutoFit()
             End With
          Catch ex As Exception
             ' Se ha producido una excepción; indicamos que el libro ha sido guardado.
             If (libro IsNot Nothing) Then libro.Saved = True
             'Devolvemos la excepción al procedimiento llamador
             Throw
          Finally
             Try
                hoja = Nothing
                If (libro IsNot Nothing) Then
                   ' Si procede, guardamos el libro de trabajo.
                   Try
                      If ExisteFichero(sFichero) Then File.Delete(sFichero)
                      libro.SaveAs(sFichero)
                   Catch ex As Exception
                      TDialogOK("ATENCION", eTaskDialogIcon.Information, ex.Message)
                   End Try
                   libro.Close()
                   If chkAbrirExcel.Checked Then Process.Start(sFichero)
                End If
                libro = Nothing
                If (app IsNot Nothing) Then
                   ' Si procede, cerramos Excel y disminuimos el recuento de referencias al objeto Excel.Application.
                   app.Quit()
                   While (Marshal.ReleaseComObject(app) > 0)
                      ' Sin implementación.
                   End While
                End If
             Catch ex As Exception
                Exit Try
             End Try
             app = Nothing
          End Try
       End Sub
    
     

    De todas formas me puso en contacto con la empresa de debe de leer el archivo Excel y a raíz de los problemas que nos estaban dando los archivos Excel (tanto en .xls como .xlsx) optamos por crear el archivo en formato .txt con anchos fijos de las columnas. Con este tipo de archivo pudimos solucionar este tema que no urgía bastante.

    No obstante seguimos sin saber la raíz del problema al abrir los archivos .xls

    un saludo.

    lunes, 1 de marzo de 2021 15:08