【发布时间】:2020-01-14 00:23:02
【问题描述】:
我在 ASP.NET Web API 项目中使用NPOI 将 DataTable 转换为 Excel。
但是我从回复中什么也没得到。这是我的代码:
public HttpResponseMessage GetExcelFromDataTable(DataTable dt)
{
IWorkbook workbook = new XSSFWorkbook(); // create *.xlsx file, use HSSFWorkbook() for creating *.xls file.
ISheet sheet1 = workbook.CreateSheet();
IRow row1 = sheet1.CreateRow(0);
for (int i = 0; dt.Columns.Count > i; i++)
{
row1.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
}
for (int i = 0; dt.Rows.Count > i; i++)
{
IRow row = sheet1.CreateRow(i + 1);
for (int j = 0; dt.Columns.Count > j; j++)
{
row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
}
}
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(ms);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = string.Format("{0}.xlsx", dt.TableName);
return result;
}
我在workbook.Write(ms) 之后设置了一个断点来检查ms.Length,但它返回一个异常:System.ObjectDisposedException。
我哪里做错了?
【问题讨论】:
-
NPOI 的 xlsx 变体可以做到这一点,而另一个则没有。这只是图书馆的奇怪之处,有点糟糕。您可以通过执行 ms.ToArray() 并将其输入新的 MemoryStream 来解决它,但这有点可悲和浪费。
-
@alun 谢谢,它有效!但是像你说的那样真的很浪费......我将它标记为一个workaround,看看它是否可以在未来成为slove。再次感谢您。
-
@alun 谢谢。我正在使用 stream.getbuffer() 生成 xlsx 但在 MS Excel 中给出了“...损坏的数据..”消息。将 stream.getbuffer 更改为 ms.ToArray() 解决了这个问题。
-
在我的例子中 Response.BinaryWrite(ms.ToArray()) 和 Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 解决了这个问题。见例子goo.gl/m3xPa7
-
尝试设置:result.Content = new ByteArrayContent(ms.GetBuffer());
标签: c# excel asp.net-web-api npoi