什么是NPOI

NPOI是一个开源的C#读写Excel、WORD的组件,可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

使用NPOI的优势

(1)完全开源

(2)包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)

(3)同时支持文件的导入和导出

(4)你不需要在服务器上安装微软的Office,可以避免版权问题

(5)使用起来比Office PIA的API更加方便,更人性化。

....

简单报表导出使用

因为我使用的是DataTable,所以这里仅对如何将DataTable导出到Excel

/// <summary>
/// 导出数据到excel
/// </summary>
/// <param name="dataTable">数据源</param>
/// <param name="fileName">文件名称</param>
/// <param name="language">语言</param>
public string DataTableExcel(DataTable dataTable,string cPath, string fileName,int language)
{
try
{
//创建EXCEL工作薄
IWorkbook workBook = new XSSFWorkbook();
//创建sheet文件表,这里可以改成你希望的sheet命名
ISheet sheet = workBook.CreateSheet("sheet1");
#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, language));
}
#endregion
#region 填充Excel单元格中的数据
//给工作薄中非表头填充数据,遍历行数据并进行创建和填充表格
for (int i = 0; i < dataTable.Rows.Count; i++)
{
//表示从整张数据表的第二行开始创建并填充数据,第一行已经创建。
IRow row = sheet.CreateRow(i + 1);
//遍历并创建每个单元格cell,将行数据填充在创建的单元格中。
for (int j = 0; j < dataTable.Columns.Count; j++)
{
//将数据读到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();
string filePath = System.Web.HttpContext.Current.Server.MapPath(cPath);
if (!Directory.Exists(filePath))//如果不存在就创建file文件夹
Directory.CreateDirectory(filePath);
fileName = SetFileName(fileName, language) + ".xlsx";
string fullName = Path.Combine(filePath, fileName);
if (System.IO.File.Exists(fullName))
System.IO.File.Delete(fullName);
using (FileStream fs = new FileStream(fullName, FileMode.Create, FileAccess.Write))
{
try
{
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
catch (Exception ex)
{
Log.Instance.Error("DataTableExcel:"+ex.Message);
return "";
}
finally
{
//出现异常时,手动释放fs写对象
fs.Dispose();
//出现异常时,手动释放stream流对象,防止卡死的现象
stream.Dispose();
}
}
return fileName;
}
catch (Exception ex)
{
Log.Instance.Error("DataTableExcel:" + ex.Message);
return "";
}
#endregion
}

SetColumnName(string name,int language)方法,是对列表字段名称进行定义,因为我用到了多语言,所以这里传入了一个语言标识字段参数

SetFileName(string name, int language)方法,是对导出的文件进行命名,因为方法做的是封装,所以名称会根据当前导出的报表进行命名,同时因为是多语言版本,所以增加了一个语言标识字段参数

通过NuGet包管理导入我们需要的NPOI包,在项目引用那里点击右键—>管理NuGet程序包

使用NPOI实现WEB端报表数据导出到Excel_i++

在浏览里面输入NPOI点击右侧的下载即可完成对依赖的导入

使用NPOI实现WEB端报表数据导出到Excel_c#_02