前言:我们经常需要根据客户提的需求模板,进行数据导出功能。
前期准备:Excle模板 (需要其存在具体地址)。
话不多说,直接上代码:
using System.IO;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using NPOI.HPSF;public void Excel()
{
//读文件
FileStream fsTemp;
IWorkbook workbook;
ISheet worksheet;
string templatePath = @"模板文件位置";
if (!File.Exists(templatePath))//是否为空
{
throw new Exception("模板文件不存在!");//文件不存在,给提示
}
fsTemp = File.OpenRead(templatePath);//读取模板文件
workbook = new XSSFWorkbook(fsTemp);//赋值模板文件
fsTemp.Close();//关闭模板文件
//写文件
//获取sheet工作表
worksheet = workbook.GetSheetAt(0);//0即为工作簿中的第一张工作表worksheet.GetRow(1).Cells[4].SetCellValue(赋值内容);//单元格赋值从(0,0)开始算
注意:若是需要从数据库读取数据,请参考http://t.csdn.cn/rpB9k
//保存文件
string savePath ="保存地址"; //例如:Excel\xxx\xx.xlsx
FileInfo fi = new FileInfo(savePath); //创建目录逻辑,路径没有则创建
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream fsDest = File.Create(savePath);
workbook.Write(fsDest);
fsDest.Close(); //关闭}
Excel 填充Winfrm窗体:
using System.IO;
using NPOI.SS.UserModel;/// <summary>
/// 获取Excel到Datatable中
/// </summary>
/// <param name="filePath">Excel路径</param>
/// <returns>返回DataTable数据</returns>
public static DataTable GetExcel(string filePath)
{
IWorkbook iwkX;
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
iwkX = WorkbookFactory.Create(fs);
fs.Close();
}
//sheet
DataTable dt = new DataTable();
for (int h = 0; h < iwkX.NumberOfSheets; h++)
{
ISheet sheet = iwkX.GetSheetAt(h);
var rows = sheet.GetRowEnumerator();
bool isMove = rows.MoveNext();
//循环sheet
if (isMove)
{
var Cols = (IRow)rows.Current;
dt.TableName = sheet.SheetName;
for (int i = 0; i < Cols.LastCellNum; i++)
{
string str = Cols.GetCell(i).ToString();
dt.Columns.Add(Cols.GetCell(i).ToString());
}
while (rows.MoveNext())
{
var row = (IRow)rows.Current;
var dr = dt.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
if (cell == null)
{
dr[i] = "";
}
else
{
string strdr = cell.ToString();
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
}
}
return dt;
}