C# Excel打开XML错误:";“发现无法阅读的内容”;创建简单示例时

C# Excel打开XML错误:";“发现无法阅读的内容”;创建简单示例时,c#,asp.net,excel,openxml,openxml-sdk,C#,Asp.net,Excel,Openxml,Openxml Sdk,当我试图打开由以下代码创建的文档时,我遇到了不明确的“excel发现不可读内容”错误: 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.x

当我试图打开由以下代码创建的文档时,我遇到了不明确的“excel发现不可读内容”错误:

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) { }
    }
}
public void GenerateWorkbookFromDB()
{
//制作模板文件的副本
Copy(HttpContext.Current.Server.MapPath(“ReportTemplate/test.xlsx”)、HttpContext.Current.Server.MapPath(“Reports/test.xlsx”)、true);
//打开复制的模板工作簿
使用(SpreadsheetDocument myWorkbook=SpreadsheetDocument.Open(HttpContext.Current.Server.MapPath(“Reports/test.xlsx”),true))
{
WorkbookPart WorkbookPart=My工作簿.WorkbookPart;
WorksheetPart WorksheetPart=workbookPart.WorksheetParts.First();
string origninalSheetId=workbookPart.GetIdOfPart(工作表部分);
WorksheetPart replacementPart=workbookPart.AddNewPart();
字符串replacementPartId=workbookPart.GetIdOfPart(replacementPart);
OpenXmlReader=OpenXmlReader.Create(工作表部分);
OpenXmlWriter=OpenXmlWriter.Create(replacementPart);
行r=新行();
单元c=新单元();
CellValue v=新的CellValue();
v、 Text=“测试”;
c、 附加(v);
while(reader.Read())
{
if(reader.ElementType==typeof(SheetData))
{
if(reader.IsEndElement)
继续;
writer.writeStarElement(新的SheetData());
用于(int行=0;行<20;行++)
{
writer.WriteStarteElement(r);
for(int col=0;col<4;col++)
{
编写元素(c);
}
writer.writeedelement();
}
writer.writeedelement();
}
其他的
{
if(reader.IsStartElement)
writer.writeStart元素(reader);
else if(reader.IsEndElement)
writer.writeedelement();
}
}
reader.Close();
writer.Close();
尝试
{
Sheet Sheet=workbookPart.Workbook.Subjections()。其中(s=>s.Id.Value.Equals(originalSheetId)).First();
sheet.Id.Value=replacementPartId;
workbookPart.DeletePart(工作表部分);
}
捕获(例外情况除外){}
}
}

非常感谢您的帮助或建议!:D

在工作簿中,数据字段中是否保留了任何字符?例如“”?我在XML解析中见过这种情况,因此它可能是非法字符。我不知道您的情况是否允许,但是HTTPUtility.HTMLEncode可以工作吗

我实际上找到了一种方法,通过改变我将文本输入单元格本身的方式来修复错误。请注意,在下面的代码中,我注释掉了这两行,并用什么替换了它们

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) { }
    }
}
public void GenerateWorkbookFromDB()
{
//制作模板文件的副本
Copy(HttpContext.Current.Server.MapPath(“ReportTemplate/test.xlsx”)、HttpContext.Current.Server.MapPath(“Reports/test.xlsx”)、true);
//打开复制的模板工作簿
使用(SpreadsheetDocument myWorkbook=SpreadsheetDocument.Open(HttpContext.Current.Server.MapPath(“Reports/test.xlsx”),true))
{
WorkbookPart WorkbookPart=My工作簿.WorkbookPart;
WorksheetPart WorksheetPart=workbookPart.WorksheetParts.First();
string origninalSheetId=workbookPart.GetIdOfPart(工作表部分);
WorksheetPart replacementPart=workbookPart.AddNewPart();
字符串replacementPartId=workbookPart.GetIdOfPart(replacementPart);
OpenXmlReader=OpenXmlReader.Create(工作表部分);
OpenXmlWriter=OpenXmlWriter.Create(replacementPart);
行r=新行();
单元c=新单元();
string txt=“测试”;
c、 CellValue=新的CellValue(txt.ToString());
c、 数据类型=新的枚举值(CellValues.String);
//v、 Text=“测试”;
//c、 附加(v);
while(reader.Read())
{
if(reader.ElementType==typeof(SheetData))
{
if(reader.IsEndElement)
继续;
writer.writeStarElement(新的SheetData());
用于(int行=0;行<20;行++)
{
writer.WriteStarteElement(r);
for(int col=0;col<4;col++)
{
编写元素(c);
}
writer.writeedelement();
}
writer.writeedelement();
}
其他的
{
if(reader.IsStartElement)
writer.writeStart元素(reader);
else if(reader.IsEndElement)
writer.writeedelement();
}
}
reader.Close();
writer.Close();
尝试
{
Sheet Sheet=workbookPart.Workbook.Subjections()。其中(s=>s.Id.Value.Equals(originalSheetId)).First();
sheet.Id.Value=replacementPartId;
workbookPart.DeletePart(工作表部分);
}
捕获(例外情况除外){}
}
}
我希望这能帮助其他可能遇到相同问题或类似问题的人


感谢那些试图回答的人;-)

对我有效的是修改web.config文件

我输入了maxRequestLength和executionTimeout,在那之后它工作得很好

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

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

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

我发现,当您将单元格对象添加到行集合时,需要确保它们的排列顺序正确。它们必须以在电子表格上显示的相同顺序出现。e、 g.A2、B2、C2。。。Z2,AA2,AB2。注tha
 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);
        }
    }