我有NPOI 2.2.1并且我意识到在生成XLSX文件并使用Excel 2013打开时,会出现一个消息框,告诉您遇到了问题,但Excel可能会尝试从中恢复。单击“是”时,最终显示工作表。
这是代码:
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet(this.Title);
using (var exportData = new MemoryStream())
{
workbook.Write(exportData);
return exportData.GetBuffer();
}
如您所见,我只创建工作簿,添加工作表然后返回bytes数组。该数组使用以下代码存储在文件中:
string targetFile = System.IO.Path.Combine(System.IO.Path.GetTempPath(), String.Concat(btnExportar.Tag, "_", DateTime.Now.ToString("yyyyMMddHHmmss"), ".xlsx"));
System.IO.File.WriteAllBytes(targetFile, xls.GetExcelData());
使用XLS文件没有问题。
此致 海梅
答案 0 :(得分:2)
问题不在于NPOI,而在于您使用http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#user-data-execution。这不是您想要用于此目的的方法,因为GetBuffer()返回内存流底层的原始缓冲区(通常是超大),而不会在流的当前位置切断它。这将在最后留下未初始化的数据,从而导致Excel中的错误消息。
从MemoryStream中获取所有字节,使用GetBuffer():
using (var exportData = new MemoryStream())
{
workbook.Write(exportData);
// return exportData.GetBuffer();
return exportData.ToArray();
}