none
Error al intentar crear Workbooks RRS feed

  • Pregunta

  • Saludo a los del foro,

     

    aki molestando por un problema que tengo en C# al momento de crear un Workbooks en excel... la instancia a Excel la crea bien el problema esta al utilizar este comando:

     

    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

    excel.Visible = true;

     

    // linea donde brinca el error

    Workbook wb = excel.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);

     

    este es el error que me muestra:

    >> Formato antiguo o tipo de biblioteca no válida. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

     

    ya busque en internet y no he obtenido solucion al problema... alguien por favor podria ayudarme?

     

    de ante mano mil gracias

    martes, 22 de julio de 2008 1:30
    Moderador

Respuestas

  • para kien llegue a tener este problema, la forma de resolverlo es la siguiente:

     

    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

    Microsoft.Office.Interop.Excel._Workbook wrkBooks;

     

    // lineas para resolver el problema

    System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

     

    // crear Workbook

    wrkBooks = (Microsoft.Office.Interop.Excel._Workbook)(excel.Workbooks.Add(Missing.Value));

     

    // restaura el CultureInfo

    System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI;

    excel.Visible = true;

    excel.UserControl = true;

     

    Saludos,

     

    Motivo:

    This is actually a bug in Excel. It occurs when you are automating excel and you are using an english version of excel but have your locale set to another language.

    You should set the current culture of the thread to "en-US" before calling the method, and set it back afterwards

    miércoles, 23 de julio de 2008 0:55
    Moderador

Todas las respuestas

  • para kien llegue a tener este problema, la forma de resolverlo es la siguiente:

     

    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

    Microsoft.Office.Interop.Excel._Workbook wrkBooks;

     

    // lineas para resolver el problema

    System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

     

    // crear Workbook

    wrkBooks = (Microsoft.Office.Interop.Excel._Workbook)(excel.Workbooks.Add(Missing.Value));

     

    // restaura el CultureInfo

    System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI;

    excel.Visible = true;

    excel.UserControl = true;

     

    Saludos,

     

    Motivo:

    This is actually a bug in Excel. It occurs when you are automating excel and you are using an english version of excel but have your locale set to another language.

    You should set the current culture of the thread to "en-US" before calling the method, and set it back afterwards

    miércoles, 23 de julio de 2008 0:55
    Moderador
  • Gracias hermano!! me sirvió de muchísimo!!! un gran abrazo desde paraguay!!
    lunes, 17 de mayo de 2010 15:01
  • Muchas gracias por la informacion!
    jueves, 10 de junio de 2010 15:17
  • Muchísimas gracias por la información a mi también me ha servido de mucho, estaba algo atascado con esto.

    Saludos.

    lunes, 12 de julio de 2010 7:47
  • Evidentemente fue un aporte utilísimo, porque 3 años despues sigue estando vigente!

    Podría haber buscado durante una vida, por otros lados, sin descubrir que el tema venía por el lenguaje del Office instalado.

    Me falta leer desde la aplicación ue lenguaje de Ofice hay instalado para aplicar o no la corrección, y listo!

    Muchísimas gracias.

    lunes, 23 de agosto de 2010 18:09
  • que bueno que aun siga siendo de utilidad. generalmente uno busca en español por ende ahora utilizo todo en Ingles hay más documentación es este Idioma.

    Saludos,


    No le temas a la competencia, temele a tu propia incompetencia.
    lunes, 23 de agosto de 2010 18:24
    Moderador
  • Hola, tengo una duda a lo mejor te paso cuando usaste Excel, a mi ya no me marca errores el codigo en el server pero cuando le doy clic al boton para exportar no hace nada  :S :S no habre el excel y ya no se me vienen ideas a la cabeza de que podra ser tendras alguna idea??

     

    Esto pasa solo en el servidor cuando estoy localmente me sale todo a la perfección.

    Saludos y Muchas gracias

    jueves, 26 de agosto de 2010 19:06
  • ya lo depurastes para ver donde falla?

    No le temas a la competencia, temele a tu propia incompetencia.
    jueves, 26 de agosto de 2010 19:09
    Moderador
  • No lo puedo depurar ya que esta en un servidor :s con el iis, y localmente no me sale ningun error
    jueves, 26 de agosto de 2010 21:22
  • sip pero localmente y no me salen errores y me funciona todo correctamente..

    jueves, 26 de agosto de 2010 21:27
  • y el server tiene instalado MS Office y que versión?, podria ser la versión el problema coloca el codigo dentro de try... catch... para que muestre cualquier error que ocurra

    saludos,


    No le temas a la competencia, temele a tu propia incompetencia.
    jueves, 26 de agosto de 2010 21:30
    Moderador
  • Si tiene el Office 2003, el try cath ya lo tengo pero no me manda error..

    Podrá ser por el office 2003???

    jueves, 26 de agosto de 2010 23:14
  • y tu que version de office usas?

    No le temas a la competencia, temele a tu propia incompetencia.
    jueves, 26 de agosto de 2010 23:28
    Moderador
  • Office 2007 tengo instalado en mi pc.
    viernes, 27 de agosto de 2010 0:02
  • en las referencias del proyecto, buscar la referencia a "Microsoft.Office.Interop.Excel" lo seleccionas y en las propiedades busca una que dice "Copy Local" y cambia el valor a true

    compila e instala el programa e intenta a ver.


    No le temas a la competencia, temele a tu propia incompetencia.
    viernes, 27 de agosto de 2010 0:10
    Moderador
  • 0_0 disculpame soy un poco lenta jeje..

    Haber entre a mi proyecto en visual, veo mi carpeta de las referencias que es el "bin" selecciono la referencia de Microsoft... pero en la propiedades solo me dice Auto-Refresh-Path,FileName y FullPath no me dice nada de Copy Local :( sss... Me puedes decir como entro a la propiedad que me dices porfa

    Mil gracias

    viernes, 27 de agosto de 2010 0:39
  • mira esta Imagen

    No le temas a la competencia, temele a tu propia incompetencia.
    viernes, 27 de agosto de 2010 0:49
    Moderador
  •  

    um um um um creo que no te dije que estoy haciendolo en aplicación Web. Algun otra idea de porque no me funciona :D

    viernes, 27 de agosto de 2010 0:55
  • noup.... si es web noup...

    No le temas a la competencia, temele a tu propia incompetencia.
    viernes, 27 de agosto de 2010 0:57
    Moderador
  • :'( que triste ni modo muchisimas gracias por tu ayuda :D

    byebye

    viernes, 27 de agosto de 2010 1:26
  • bueno, eso no significa que no te podamos ayudar.

    no se si ya habias visto este link http://support.microsoft.com/kb/317719/es

    Saludos,


    No le temas a la competencia, temele a tu propia incompetencia.
    viernes, 27 de agosto de 2010 3:13
    Moderador
  • Gracias!!!! Deje de odiar a MS por un rato gracias a tu solución, jajaja!
    martes, 16 de noviembre de 2010 17:18
  • Estimado, tengo el siguiente problema.

    Cuando lo ejecuto en mi equipo ningún problema, pero cuando lo ejecuto en el servidor me sale lo siguiente:

    "No se puede abrir o guardar más documentos debido a que el espacio en disco o la memoria son insuficientes. • Para disponer de más memoria cierre los libros o programas que no necesite. • Para liberar espacio en el disco, elimine los archivos que no necesita del disco en el que desea guardar los documentos."

    el error pasa al ejecutar esta linea:

    _wBook

     

    = (Excel._Workbook)_excel.Workbooks.Add(Missing.Value);

    Estoy ocupando lo mismo codigo que respondieron aquí, he revisado por todos lados, en el servidor se instalo el mismo excel.

    NO SE QUE MÁS HACER, por favor si me pueden ayudar, AGRADECIDO

    jueves, 18 de noviembre de 2010 14:21
  • mmm... el error esta bien claro, verifica que el directorio temporal del servidor no este lleno o que tengas acceso para crear archivos en el, caso contrario prueba cambiando DefaultFilePath a un directorio donde el usuario logeado tenga control total de la carpeta

    ejemplo:

    CultureInfo cultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    
    Excel.Application excel = new Excel.Application();
    excel.DefaultFilePath = "c:\\"; // <- cambiar directorio predeterminado
    Excel._Workbook wBook = (Excel._Workbook)(excel.Workbooks.Add(Missing.Value));
    excel.Visible = true;
    excel.UserControl = true;
    

    prueba a ver si asi te funciona.

    Salu2,


    No le temas a la competencia, temele a tu propia incompetencia.
    jueves, 18 de noviembre de 2010 17:45
    Moderador
  • Potro, gracias por responder, pero el error aparece en la sig. linea:

    _wBook

     

    = (Excel._Workbook)_excel.Workbooks.Add(Missing.Value);

    la cual se ejecuta mucho antes de guardar el archivo

    en el sig. link, está la clase que estoy usando:

    http://www.raam.cl/clase.txt

    Ayudenmeeeeee, Ayudenmeeeeee.....

     

    jueves, 18 de noviembre de 2010 17:52
  • Sorry potro, no habia visto bien la linea..

    lo pruebo y te cuento

    jueves, 18 de noviembre de 2010 17:53
  • Con la pena de mi alma.. NoNes.. No funca......

    No se puede abrir o guardar más documentos debido a que el espacio en disco o la memoria son insuficientes. • Para disponer de más memoria cierre los libros o programas que no necesite. • Para liberar espacio en el disco, elimine los archivos que no necesita del disco en el que desea guardar los documentos.

    Ayudenme.. ayudenme......!

    jueves, 18 de noviembre de 2010 18:01
  • Muchas gracias por el aporte!!! Me solucionó perfectamente el problema!

    Tuve que poner esas lineas luego de realizar los ciclos for que setean la data en las celdas, ya que sino me saltaba el mismo error que cuando quería crear la hoja de trabajo.

     

    Saludos y muchísimas gracias!!

     


    domingo, 6 de marzo de 2011 2:44
  • hola, tengo una app windows form con VS2010 con VB y framework 4.0 y uso el microsoft.interop.excel version 11 (y tambien he probado con la 12) y ya puse esa linea de codigo que mencionas pero igual sigue saliendo error en esta linea:

     'Creamos las variables<br/>    Dim exApp As New Microsoft.Office.Interop.Excel.Application<br/>    Dim exLibro As Microsoft.Office.Interop.Excel._Workbook<br/>    Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet<br/><br/><br/>    Dim excel As New Microsoft.Office.Interop.Excel.Application()<br/><br/>    Dim CurrentCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture<br/>    System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("es-ES")<br/><br/>    Try<br/>      'Añadimos el Libro al programa, y la hoja al libro<br/>      'exLibro = exApp.Workbooks.Add<br/>      exLibro = DirectCast(excel.Workbooks.Add(Missing.Value), Microsoft.Office.Interop.Excel._Workbook) 'aqui es donde se cae mostrando el mismo error que comentas<br/>      System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI<br/>
    


    Alguna otra idea por la que este pasando esto? con el framework 4.0 no hay problemas, exporta excelente, pero con el 2.0 me sale eso.El cambio de framework esta descartado.

     

    espero me puedan ayudar. Desde ya, gracias.

     

    Saludos

     

    miércoles, 29 de junio de 2011 23:14
  • Muchas gracias!!!  :)
    martes, 29 de mayo de 2012 14:17
  • Esto es en agradecimiento a todos los que ayudan a que personas como nosotros a que resolvamos esos problemas tan latosos.  Aqui entrego un documento que contiene todo lo que recopilé sobre este asunto de la creación de hojas de cálculo, inserción de imagenes, etc, y que por fin ya me funciona todo. Gracias:

    Crear hoja de Excel: Usando Automatización

    (Microsoft.Office.Interop.Excel)

    C#

    Aclaración: Esta técnica no es recomendada para ser utilizada desde asp.net:

    http://support.microsoft.com/kb/257757

    • En el proyecto agregar las referencias:

    Microsoft.Office.Interop.Access (la de versión más actualizada. Pestaña de .NET de “Add reference”).

    Microsoft Office 12.0 Object Library (la de versión más actualizada. Pestaña de .COM de “Add reference”).

    • Se debe configurar el DCOM.

    Esto es para Windows vista, pero para Windows 7 puede no ser necesario.

    Desde la línea de comandos se ejecuta dcomcnfg.exe.

    • En: Servicios de componentes/Equipos/Mi Pc/Configuración DCOM, al seleccionar este último se pide que se registren algunos componentes, dar aceptar.
    • Seleccionar Microsoft Excel application dentro de Configuración DCOM, click derecho – propiedades

    En la pestaña de “Seguridad” personalizar “Permisos de inicio y activación” y “Permisos de acceso” agregando a “Todos”.

    En la pestaña de “Identidad” seleccionar al usuario interactivo.

    • La carpeta de la aplicación que esté definida como temporal para ser la receptora de los documentos Excel temporales que se van a crear debe poder ser accesada por el grupo “Todos” en cuanto a su seguridad.

    • Notas sobre codificación:
      • Todo el bloque de código que ejecute comandos de COM debe estar en un método separado y ser llamado desde dentro de un try – finally. Esto para que se cierren todos los procesos Excel utilizados al crear las hojas de cálculo.

            try

            {

                TodoExcel();

            }

            finally

            {

                GC.Collect();

                GC.WaitForPendingFinalizers();

            }

    • Dentro del método que aquí llamaremos “TodoExcel”, una vez que se termine de generar la hoja de cálculo, deben liberarse cada uno de los objetos COM utilizados, ya que si se omite liberar uno de ellos esto impedirá que se cierre el proceso Excel generado.

    NOTA: Deben utilizarse objeto simples, es decir, en lugar de:

    Workbook lLibro = lAppExcel.Workbooks.Add(lFaltante)

                                        Usar: 

          Workbooks lLibros = lAppExcel.Workbooks;

          Workbook lLibro = lLibros.Add(lFaltante)

                            Esto para tener la seguridad de liberar todos los objeto COM utilizados.

    • Antes de ejecutar cualquier comando COM debe cambiarse el culture info del thread a “en-US”, esto porque hay un bug en Excel que provoca una excepción de “Formato antiguo o tipo de biblioteca no válida” cuando la automatización está en una versión de lenguaje distinta a la de la configuración local.
    • Ejemplo, está ubicado en el code behind de una página .aspx que cuenta con un gráfico del tipo Chart (.NET component):

        private void TodoExcel()

        {

            // Path y Nombres para los archivos de excel y la imagen:

            string lCarpetaTemporal =

       ConfigurationSettings.AppSettings["Temporal"].ToString();

            lCarpetaTemporal =

       Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath,

    lCarpetaTemporal);

            string lNombreImagen = Guid.NewGuid().ToString() + ".png";

            chrtGrafica.SaveImage(Path.Combine(lCarpetaTemporal, lNombreImagen));

            string lArchivoExcel = Path.Combine(lCarpetaTemporal,

       Guid.NewGuid().ToString());

            string lArchivoImagen = Path.Combine(lCarpetaTemporal, lNombreImagen);

            object lFaltante = Type.Missing;

            // Respaldar el Culture info actual

            System.Globalization.CultureInfo lCultureInfoActual =

                System.Threading.Thread.CurrentThread.CurrentCulture;

            // Cambiar el culture info del thread

            System.Threading.Thread.CurrentThread.CurrentCulture =

                new System.Globalization.CultureInfo("en-US");

            Microsoft.Office.Interop.Excel.Application lAppExcel = new

    ApplicationClass();

            Workbooks lLibros = lAppExcel.Workbooks;

            Workbook lLibro = lLibros.Add(lFaltante);

            Worksheet lHojaExcel = (Worksheet)lLibro.ActiveSheet;

            Range lRangoCeldas = lHojaExcel.get_Range("a1", "a1");

            Shapes lImagenes = lHojaExcel.Shapes;

            try

            {

                /* Que sobrescriba el archivo excel sin preguntar.

                   Aunque tambien oculta las excepciones si no encuentra archivos o

                   el path no tiene derechos de escritura, etc. */

                lAppExcel.DisplayAlerts = false;

                // Agregar un letrero en bold en la col 1 reng 1

                lRangoCeldas = lHojaExcel.get_Range("a1", "a1");

                lRangoCeldas.Font.Bold = true;

                lHojaExcel.Cells[1, 1] = “Encabezado”;

                // Insertar una imagen

                lImagenes.AddPicture(lArchivoImagen,

                     Microsoft.Office.Core.MsoTriState.msoFalse,

                     Microsoft.Office.Core.MsoTriState.msoCTrue, 1, 43, 200, 200);

                // Alinear celdas a la derecha, ancho de 15, backColor, bordes

                lRangoCeldas = lHojaExcel.get_Range("b2", "d8");

                lRangoCeldas.HorizontalAlignment = 4;  // Alineación Derecha

                lRangoCeldas.ColumnWidth = 15;

       lRangoCeldas.Interior.Color =

    System.Drawing.ColorTranslator.ToOle  

      (System.Drawing.Color.FromArgb(15461355));

                lRangoCeldas.Borders[XlBordersIndex.xlEdgeBottom].Weight = 2;

                lRangoCeldas.Borders[XlBordersIndex.xlEdgeTop].Weight = 2;

                lRangoCeldas.Borders.Color =

    System.Drawing.ColorTranslator.ToOle

      (System.Drawing.Color.FromArgb(10526880));

                // Formatos generales

                lHojaExcel.Cells.NumberFormat = "#,#0.00";

                ((Range)lHojaExcel.Cells[1, 1]).EntireColumn.ColumnWidth = 30;

                ((Range)lHojaExcel.Cells[1, 1]).EntireColumn.HorizontalAlignment =

    2;  // Alineación Izquierda

                lLibro.SaveAs(lArchivoExcel, lFaltante, lFaltante, lFaltante, false,

    lFaltante, XlSaveAsAccessMode.xlNoChange, lFaltante, lFaltante,

    lFaltante, lFaltante, lFaltante);

            }

            finally

            {

                Marshal.FinalReleaseComObject(lRangoCeldas);

                Marshal.FinalReleaseComObject(lImagenes);

                Marshal.FinalReleaseComObject(lHojaExcel);

                lLibro.Close(lFaltante, lFaltante, lFaltante);

               

                // Restaurar el CultureInfo

                System.Threading.Thread.CurrentThread.CurrentCulture =

    lCultureInfoActual;

                Marshal.FinalReleaseComObject(lLibro);

                Marshal.FinalReleaseComObject(lLibros);

                lAppExcel.Quit();

                Marshal.FinalReleaseComObject(lAppExcel);

            }

        }

    La parte del finally es sumamente importante ya que de omitir la liberación del algunos de los objetos COM ocasionaría que no se cierre el proceso Excel abierto y se quedara colgado.

    martes, 29 de mayo de 2012 16:31