Error de Excel Open XML: "se encontró contenido ilegible" al crear un ejemplo simple

Recibo el error ambiguo "Excel encontró contenido ilegible" cuando intento abrir el documento creado por el siguiente código:

public void GenerateWorkbookFromDB()
{
    //Make a copy of the template file
    File.Copy(HttpContext.Current.Server.MapPath("ReportTemplate/test.xlsx"), HttpContext.Current.Server.MapPath("Reports/test.xlsx"), true);

    //Open up the copied template workbook
    using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(HttpContext.Current.Server.MapPath("Reports/test.xlsx"), true))
    {
        WorkbookPart workbookPart = myWorkbook.WorkbookPart;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
        string origninalSheetId = workbookPart.GetIdOfPart(worksheetPart);

        WorksheetPart replacementPart = workbookPart.AddNewPart<WorksheetPart>();
        string replacementPartId = workbookPart.GetIdOfPart(replacementPart);

        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
        OpenXmlWriter writer = OpenXmlWriter.Create(replacementPart);

        Row r = new Row();
        Cell c = new Cell();
        CellValue v = new CellValue();
        v.Text = "test";
        c.Append(v);

        while (reader.Read())
        {
            if (reader.ElementType == typeof(SheetData))
            {
                if (reader.IsEndElement)
                    continue;
                writer.WriteStartElement(new SheetData());

                for (int row = 0; row < 20; row++)
                {
                    writer.WriteStartElement(r);

                    for (int col = 0; col < 4; col++)
                    {
                        writer.WriteElement(c);
                    }

                    writer.WriteEndElement();
                }

                writer.WriteEndElement();
            }
            else
            {
                if (reader.IsStartElement)
                    writer.WriteStartElement(reader);
                else if (reader.IsEndElement)
                    writer.WriteEndElement();
            }
        }
        reader.Close();
        writer.Close();

        try
        {
            Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Id.Value.Equals(origninalSheetId)).First();
            sheet.Id.Value = replacementPartId;
            workbookPart.DeletePart(worksheetPart);
        }
        catch (Exception ex) { }
    }
}

¡Cualquier ayuda o sugerencia es muy apreciada! :D

preguntado el 16 de mayo de 11 a las 18:05

¿De dónde obtiene exactamente este error? Cuando observa el xlsx en la herramienta Office Open Xml, ¿cuál es el xml en esa ubicación en particular? -

Cuando intento abrir el documento después de llamar a GenerateWorkbookFromDB () Excel me da el error. Me da la opción de abrirlo de todos modos haciendo clic en "Sí". Sin embargo, no quiero que los usuarios de mi aplicación tengan que hacer clic en eso cada vez: D -

7 Respuestas

De hecho, encontré una manera de corregir el error cambiando la forma en que ingreso el texto en la celda. Observe en el código a continuación donde comenté las 2 líneas y con qué las reemplacé.

public void GenerateWorkbookFromDB()
{
    //Make a copy of the template file
    File.Copy(HttpContext.Current.Server.MapPath("ReportTemplate/test.xlsx"), HttpContext.Current.Server.MapPath("Reports/test.xlsx"), true);

    //Open up the copied template workbook
    using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(HttpContext.Current.Server.MapPath("Reports/test.xlsx"), true))
    {
        WorkbookPart workbookPart = myWorkbook.WorkbookPart;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
        string origninalSheetId = workbookPart.GetIdOfPart(worksheetPart);

        WorksheetPart replacementPart = workbookPart.AddNewPart<WorksheetPart>();
        string replacementPartId = workbookPart.GetIdOfPart(replacementPart);

        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
        OpenXmlWriter writer = OpenXmlWriter.Create(replacementPart);

        Row r = new Row();
        Cell c = new Cell();
        string txt = "test";
        c.CellValue = new CellValue(txt.ToString());
        c.DataType = new EnumValue<CellValues>(CellValues.String);
        //v.Text = "test";
        //c.Append(v);

        while (reader.Read())
        {
            if (reader.ElementType == typeof(SheetData))
            {
                if (reader.IsEndElement)
                    continue;
                writer.WriteStartElement(new SheetData());

                for (int row = 0; row < 20; row++)
                {
                    writer.WriteStartElement(r);

                    for (int col = 0; col < 4; col++)
                    {
                        writer.WriteElement(c);
                    }

                    writer.WriteEndElement();
                }

                writer.WriteEndElement();
            }
            else
            {
                if (reader.IsStartElement)
                    writer.WriteStartElement(reader);
                else if (reader.IsEndElement)
                    writer.WriteEndElement();
            }
        }
        reader.Close();
        writer.Close();

        try
        {
            Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Id.Value.Equals(origninalSheetId)).First();
            sheet.Id.Value = replacementPartId;
            workbookPart.DeletePart(worksheetPart);
        }
        catch (Exception ex) { }
    }
}

Espero que esto ayude a cualquier otra persona que pueda estar experimentando el mismo problema o algo similar.

Gracias a quienes intentaron responder ;-)

contestado el 17 de mayo de 11 a las 09:05

Estuve buscando esto durante mucho tiempo, saluda Daniel, el líder de mi equipo se estaba enojando mucho conmigo :( pero estoy muy feliz de haber encontrado esto - Canvas

Alguna idea de cómo solucionar el error de esta respuesta: stackoverflow.com/questions/19529436/…... Aunque cuando hago clic en SÍ para abrir el archivo, todo está como está, pero no puedo hacer ninguna otra modificación al archivo. - Si8

Espero que pueda ser de utilidad para alguien.

Recibí el mismo mensaje de error y, en mi caso, el motivo resultó ser un nombre demasiado largo de una hoja de trabajo.

Excel siguió truncándolo a 31 caracteres. Entonces, una vez que limité el nombre de la hoja de trabajo que asigné en código a 31 caracteres, el problema se resolvió.

Respondido 05 Jul 12, 23:07

Muchas gracias por señalar esto, me salvó al menos una hora o más. - Fedor

Lo que encontré fue que debe asegurarse de que cuando agregue los objetos Cell a la colección de filas, los coloque en el orden correcto. Deben aparecer en el mismo orden en que aparecerán en la hoja de cálculo. por ejemplo, A2, B2, C2 ... Z2, AA2, AB2. Tenga en cuenta que si intenta comparar los valores de las columnas para colocarlas, se clasificarán con AA2 entre A2 y B2, lo que provocará un error cuando intente abrir la hoja.

contestado el 16 de mayo de 12 a las 20:05

Lo corrigí configurando el tipo correcto en Cell. Por ejemplo, en mi caso tengo dos tipos de valores: numéricos y cadenas.

 public static void WriteValueOnCell(Cell cell, object value)
    {
        var sValue = value = x.ToString();
        var isValueNumeric = value.GetType().IsNumeric();
        cell.DataType = (isValueNumeric)? CellValues.Number : CellValues.String;
        cell.CellValue = new CellValue(sValue);
    }
    //This example uses this Helper. It informs if an object type is Numeric ;-)
    public static class TypeHelper
    {
        private static readonly HashSet<Type> NumericTypes = new HashSet<Type>
        {
            typeof(int),  typeof(double),  typeof(decimal),
            typeof(long), typeof(short),   typeof(sbyte),
            typeof(byte), typeof(ulong),   typeof(ushort),
            typeof(uint), typeof(float)
        };

        public static bool IsNumeric(this Type myType)
        {
            return NumericTypes.Contains(Nullable.GetUnderlyingType(myType) ?? myType);
        }
    }

Respondido 30 ago 16, 10:08

Alguna idea de cómo solucionar el error de esta respuesta: stackoverflow.com/questions/19529436/…... Aunque cuando hago clic en SÍ para abrir el archivo, todo está como está, pero no puedo hacer ninguna otra modificación al archivo. - Si8

en el libro de trabajo, ¿hay caracteres reservados en los campos de datos? como '<' o '>'? He visto que eso sucede con el análisis de XML, por lo que podría ser un carácter ilegal. No sé si sus circunstancias lo permiten, pero ¿funcionaría HTTPUtility.HTMLEncode?

contestado el 16 de mayo de 11 a las 23:05

El libro de trabajo que está copiando y colocando todo es de una plantilla en blanco. No veo cómo se podría poner algo en ninguna celda que no sea "prueba". - Daniel

buena atrapada Daniel. Yo tampoco lo sé, solo estaba haciendo una puñalada en la oscuridad con respecto a XML. - MecurioJ

Lo que funcionó para mí fue modificar el archivo web.config.

¡Puse un maxRequestLength y executionTimeout y funcionó bien después de eso!

en System.Web, ponga lo siguiente:

httpRuntime requestValidationMode="2.0" maxRequestLength="1048576" executionTimeout="600"

Pruébelo y vea si ayuda.

Respondido 28 Oct 12, 21:10

Tuve este problema y después de usar la herramienta SDK descubrí que CellValues.Date en realidad no es compatible. Si está intentando formatear sus celdas para que tengan el tipo de datos apropiado y recibe este mensaje, intente dejar sus celdas de fecha como CellValues.String.

Respondido 03 Abr '13, 19:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.