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.