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