asp.net mvc利用NPOI导入导出Excel

fangpengyu 2014-05-07 10:46:24
导出Excel 2003没有问题,导出Excel2007老是出现无法访问已关闭的流,请帮忙解决,或是哪位有mvc导入导出excel的工具类能提供,谢谢!
        
public static MemoryStream ExportToExcel(DataSet ds,ExcelType excelType,string header)
{
IWorkbook workbook = null;
if (excelType==ExcelType.Office2003)
{
workbook = new HSSFWorkbook();//2003
}
else
{
workbook = new XSSFWorkbook();//2007
}

#region 开始循环DS中的Table,DS中的每个表创建一个Sheet
for (int p = 0; p < ds.Tables.Count; p++)
{
#region 创建一个sheet
ISheet sheet = workbook.CreateSheet("sheet" + (p + 1));
//设置大标题行
int rowCount = 0;


//设置全局列宽和行高
sheet.DefaultColumnWidth = 14; //全局列宽
sheet.DefaultRowHeightInPoints = 15; //全局行高
//设置标题行数据
int a = 0;


IRow row1 = sheet.CreateRow(rowCount); //创建报表表头标题列
//for (int k = 0; k < ds.Tables[p].Columns.Count; k++)
//{ //将DataTable的列标题输出到Excel
// columnName = ds.Tables[p].Columns[k].ColumnName;
// row1.CreateCell(a).SetCellValue(columnName);
// a++;
//}

string[] columnHeaders = header.Split(new char[] {','});//按逗号拆分标题
var style = SetCellBorder(workbook);

for (int k = 0; k <columnHeaders.Length; k++)
{ //将传递过来的字符串表头进行拆分到Excel

string columnName = columnHeaders[k];
ICell cell=row1.CreateCell(a);
cell.SetCellValue(columnName);

#region 设置单元格的边框
cell.CellStyle = style;
#endregion
a++;
}

//填写ds数据进excel
for (int i = 0; i < ds.Tables[p].Rows.Count; i++) //写行数据
{
IRow row2 = sheet.CreateRow(i + rowCount + 1);
int b = 0;
for (int j = 0; j < ds.Tables[p].Columns.Count; j++)
{
string dgvValue = string.Empty;
dgvValue = ds.Tables[p].Rows[i][j].ToString();
ICell cell = row2.CreateCell(b);
cell.SetCellValue(dgvValue);

#region 设置单元格的边框
cell.CellStyle = style;
#endregion
b++;
}
}

#endregion
}
#endregion

//创建excel
MemoryStream memoryStream = new MemoryStream();
workbook.Write(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
return memoryStream;
}


调用的方式

string header = "编号,用户名,姓名,角色";
MemoryStream ms =ExcelHelper.ExportToExcel(ds, ExcelType.Office2003, header);
return File(ms, "application/vnd.ms-excel", "用户信息");
...全文
804 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
追寻_ 2016-07-12
  • 打赏
  • 举报
回复
具体地址 http://www.cnblogs.com/codedreams/p/5662740.html
追寻_ 2016-07-12
  • 打赏
  • 举报
回复
可参考我的解决方法 http://www.cnblogs.com/codedreams/
liuyunhuanying 2014-10-29
  • 打赏
  • 举报
回复
这是NPOI的一个bug,不知道现在有没有修复。2007返回的stream已经关闭了。 建议返回memorystream,然后调用ToArray方法读取stream的内容太。
green66 2014-07-09
  • 打赏
  • 举报
回复
请问楼主有没有解决这个问题啊?我也遇到了相同的问题
threenewbee 2014-05-09
  • 打赏
  • 举报
回复
那你外面有没有对ms释放或者调用dispose?
fangpengyu 2014-05-07
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
application/vnd.ms-excel修改为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet试试看 http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/05/08/office-2007-open-xml-mime-types.aspx
试了,不管用,主要是这里报错
MemoryStream ms =ExcelHelper.ExportToExcel(ds, ExcelType.Office2007, header);
threenewbee 2014-05-07
  • 打赏
  • 举报
回复
application/vnd.ms-excel修改为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet试试看 http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/05/08/office-2007-open-xml-mime-types.aspx

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧