您的位置:首页 > 编程语言 > ASP

ASP.NET WebApi 服务端导出数据到Excel

2017-11-07 22:30 260 查看

ASP.NET服务器端导出数据到Excel

在web项目使用过html的拼接成table表格的形式导出数据到excel,但是导出execl表格不能直接修改和保存,存在数据丢失的情况,采用这种文件流的形式就不会出现excel表不能修改的情况了。

解决方案中需要引用的类库如下:

ICSharpCode.SharpZipLib.dll

NPOI.dll

NPOI.OOXML.dll

NPOI.OpenXml4Net.dll

NPOI.OpenXmlFormats.dll

NPOI.XML

也就是通过引用NPOI插件,服务器端实现导出数据到Excel。

插件下载地址:

http://download.csdn.net/download/realjh/10108407

项目中用到的代码实现例如:

/// 导出数据到excel
/// </summary>
/// <param name="dataTable"></param>
/// <param name="fileName"></param>
/// <param name="sheetName"></param>
public static void DataTableExcel(DataTable dataTable, string fileName, string sheetName)
{
//创建EXCEL工作薄
IWorkbook workBook = new XSSFWorkbook();
//创建sheet文件表
ISheet sheet = workBook.CreateSheet(sheetName);
#region 创建Excel表头
//创建表头
IRow header = sheet.CreateRow(0);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
//给表创建列单元格并填充列名称,此处只做首行列Columns创建和填充
ICell cell = header.CreateCell(i);
cell.SetCellValue(SetColumnName(dataTable.Columns[i].ColumnName));
}
#endregion
#region 填充Excel单元格中的数据
//给工作薄中非表头填充数据,遍历行数据并进行创建和填充表格
for (int i = 0; i < dataTable.Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);//表示从整张数据表的第二行开始创建并填充数据,第一行已经创建。
for (int j = 0; j < dataTable.Columns.Count; j++)//遍历并创建每个单元格cell,将行数据填充在创建的单元格中。
{
//将数据读到cell单元格中
ICell cell = row.CreateCell(j);
cell.SetCellValue(dataTable.Rows[i][j].ToString());//对数据为null的情况进行处理
}
}
#endregion
#region 工作流创建Excel文件
//工作流写入,通过流的方式进行创建生成文件
MemoryStream stream = new MemoryStream();
workBook.Write(stream);
byte[] buffer = stream.ToArray();
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
try
{
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
catch
{
//异常不做任何处理,好处是让客户感觉没有问题,缺点是不利于查找程序的问题,需要日志文件跟踪。
}
finally
{
fs.Dispose();//出现异常时,手动释放fs写对象
stream.Dispose();//出现异常时,手动释放stream流对象,防止卡死的现象
}
}
#endregion
}
/// <summary>
/// 辅助方法拼接列名,当然这个列名称可以直接在sql语句中采用column as "中文列名称"即可
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private static string SetColumnName(string name)
{
string columnName = string.Empty;
#region 匹配列名称
switch (name)
{
case "YUANQU":
columnName = "院区";
break;
case "HISCODE":
columnName = "院区编号";
break;
case "DEPT_NAME":
columnName = "科室名称";
break;
case "USER_ID":
columnName = "员工工号";
break;
case "USER_NAME":
columnName = "员工姓名";
break;
case "LX_NAME":
columnName = "类型";
break;
case "AVESCORE":
columnName = "平均成绩";
break;
case "SCORE":
columnName = "综合表现";
break;
case "TB_DATE":
columnName = "评价日期";
break;
case "KHJG":
columnName = "评价标准";
break;
case "PJLB_NAME":
columnName = "评价类型";
break;
}
#endregion
return columnName;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: