Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

jueves, 27 de noviembre de 2014

Encontrando errores en los archivos xlsx (Ms Excel 2007 - 2010) con Open XML SDK Validation

Entrada original en el blog de Brian Jones (autor Zeyad Rajabi).

Lo único que hice fue acomodar y corregir un poco el código para crear un método que llame al Open XML SDK Validation. Este método escribirá en la ventana de Resultados los errores del archivo xlsx cuya ruta está en la variable "path", y puede ponerse dentro de cualquier clase:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Validation;

static void validarExcel(string path)
{
   OpenXmlValidator validator = new OpenXmlValidator();
   using (SpreadsheetDocument excelFile = SpreadsheetDocument.Open(path, true))
  {
      try
      {
            int count = 0;
            foreach (ValidationErrorInfo error in validator.Validate(excelFile))
            {
                     count++;
                     Trace.WriteLine("Error " + count);
                     Trace.WriteLine("Description: " + error.Description);
                     Trace.WriteLine("Path: " + error.Path.XPath);
                     Trace.WriteLine("Part: " + error.Part.Uri);
                     Trace.WriteLine("-------------------------------------");
             }
      }
      catch (Exception ex)
      {
               Trace.WriteLine(ex.Message);
      }
        excelFile.Close();
    }
}

Por ejemplo, un error que hallé en un archivo xlsx generado desde C# fue que, al ponerles nombres a cada hoja de cada archivo de excel, éstos no pueden tener más de 32 caracteres. Al abrir el archivo xlsx en MS Excel 2010 me tiraba este error (no ocurre en OpenOffice):


 "Registros Reparados: Propiedades de la hoja de /xl/workbook.xml"

Este error se repara en la línea donde se declara el objeto Sheet y se corrige truncando la cadena con el nombre de la hoja a menos de 32 caracteres:

String myName = "nombremuymuymuymuymuymuymuymuymuylargo";

Sheet sheet = new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart), SheetId = worksheetNumber, Name = new string(myName.Take(31).ToArray()) };


Más información en este enlace.

Mike Gledhill tiene una excelente sección acerca de cómo escribir archivos xlsx con Open XML.