Excel Open XML错误:创build简单示例时发现“无法读取的内容”

当我尝试打开由以下代码创build的文档时,出现含糊不清的“excel found unreadable content”错误:

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) { } } } 

任何帮助或build议非常感谢! :d

我实际上find了一种方法来改变我input文本到单元格本身的方式来修复错误。 注意在下面的代码中,我注释了2行,我用什么replace了它们。

 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) { } } } 

我希望这可以帮助任何可能遇到同样问题或类似问题的人。

感谢那些试图回答;-)

我希望这对某些人有用。

我得到了同样的错误消息,在我的情况下原因是一个工作表的太长的名字。

Excel保持截断为31个字符。 所以一旦我将我在代码中分配的工作表名称限制为31个字符,问题就解决了。

我发现的是,当你将Cell对象添加到行集合时,需要确保将它们按正确的顺序放置。 它们必须以与电子表格中显示的顺序相同的顺序显示。 例如A2,B2,C2 … Z2,AA2,AB2。 请注意,如果您尝试比较列的值来放置它们,它们将在A2和B2之间进行sorting,这将导致错误,当您尝试打开表单时。

我通过在Cell上设置正确的types来纠正它。 例如,在我的情况下,我有两种types的值:数字和string。

  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); } } 

在工作簿中,有没有在数据字段中保留的字符? 如“<”或“>”? 我已经看到了XMLparsing发生,所以它可能是一个非法的字符。 我不知道你的情况是否允许,但HTTPUtility.HTMLEncode的工作?

什么对我来说是修改web.config文件。

我把一个maxRequestLength和执行超时,它在那之后罚款!

在System.Web下,放入以下内容:

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

尝试一下,看看是否有帮助。

我有这个问题,使用SDK工具后,我发现CellValues.Date实际上并不支持。 如果您尝试将单元格设置为具有适当的DataType并且您收到此消息,请尝试将您的date单元格作为CellValues.String。