Dan*_*iel 5 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.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) { }
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助或建议非常感谢!:d
Dan*_*iel 11
我实际上找到了一种通过改变我将文本输入单元格本身的方式来修复错误的方法.请注意下面的代码中我注释了2行以及我用它们替换它们的内容.
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) { }
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助其他可能遇到相同问题或类似问题的人.
感谢那些试图回答的人;-)
小智 5
我希望它对某些人有用.
我得到了相同的错误消息,在我的情况下,原因是一个太长的工作表名称.
Excel将其截断为31个字符.因此,一旦我将代码中指定的工作表名称限制为31个字符,问题就解决了.