.net NPOI List集合导入导出封装(反射)
一、 导出一个只有一个sheet的excel表格
/// <summary>
/// 导出一个只有一个sheet的excel表格
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">数据源集合</param>
/// <param name="filePath">选择的文件夹的路径(包括拓展名)(不给默认第一行)</param>
/// <param name="startRow">表格中数据开始行(根据表格里的坐标)(不给默认第一列)</param>
/// <param name="startColumn">表格中数据开始列(根据表格里的坐标)</param>
static public void ExportOneSheepExcel<T>(List<T> list, string filePath, int startRow = 1, int startColumn = 1)
{
int a = startRow - 1; //接收传来的开始行,得到开始行下标
int b = startColumn - 1;//接收传来的开始列,得到开始列下标
//创建工作本
HSSFWorkbook book = new HSSFWorkbook();
//创建sheet
ISheet sheet = book.CreateSheet("Sheet1");
//获取类的映射
Type t = typeof(T);
//获取类属性
PropertyInfo[] ps = t.GetProperties();
#region 如果要创建列头
/*
创建列头(行)
IRow headRow = sheet.CreateRow(a);
for (int i = 0; i < ps.Length; i++)
{
row.CreateCell(b).SetCellValue(ps[i].Name);
b++;
}
a++;
*/
#endregion
//创建身体
for (int j = 0; j < list.Count; j++)
{
IRow row = sheet.CreateRow(a);//创建身体的行
//列下标回归
b = startColumn - 1;
//列
for (int k = 0; k < ps.Length; k++)
{
row.CreateCell(b).SetCellValue(ps[k].GetValue(list[j])!=null? ps[k].GetValue(list[j]).ToString():null);
b++;
}
a++;//开始下一行
}
//判断有没有这个文件
if (File.Exists(filePath))
{
File.Delete(filePath);
}
//写入文件//没有就创建,有就打开
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
book.Write(fs);
}
}
二、 要按照设定sheet的尺寸,分成多个sheet,最终得到一个excel表格
/// <summary>
/// 要按照设定sheet的尺寸,分成多个sheet,最终得到一个excel表格
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">总数据集合</param>
/// <param name="filePath">表格存放文件夹的路径(包括拓展名)</param>
/// <param name="sheetSize">每一个sheet的尺寸</param>
/// <param name="startRow">表格中数据开始行(根据表格里的坐标)(不给默认第一行)</param>
/// <param name="startColumn">表格中数据开始列(根据表格里的坐标)(不给默认第一列)</param>
static public void ExportManySheepExcel<T>(List<T> list, string filePath, int sheetSize, int startRow = 1, int startColumn = 1)
{
int a = startRow - 1; //接收传来的开始行,得到开始行下标
int b = startColumn - 1;//接收传来的开始列,得到开始列下标
//获取类的映射
Type t = typeof(T);
//获取类属性
PropertyInfo[] ps = t.GetProperties();
//创建工作本
HSSFWorkbook book = new HSSFWorkbook();
int sheetCount = Convert.ToInt32(Math.Ceiling(list.Count * 1.0 / sheetSize));
for (int i = 1; i <= sheetCount; i++)//循环次数为sheet个数
{
//此时的集合为
List<T> newList = list.Skip((i - 1) * sheetSize).Take(sheetSize).ToList();
//创建sheet
ISheet sheet = book.CreateSheet($"Sheet{i}");
#region 如果要创建列头
/*
//创建列头(行)
IRow headRow = sheet.CreateRow(a);
for (int j = 0; j < ps.Length; j++)
{
headRow.CreateCell(b).SetCellValue(ps[j].Name);
b++;
}
a++;
*/
#endregion
//创建身体
for (int k = 0; k < newList.Count; k++)
{
IRow row = sheet.CreateRow(a);//创建身体的行
b = startColumn - 1;//列下标回归
//列
for (int n = 0; n < ps.Length; n++)
{
row.CreateCell(b).SetCellValue(ps[n].GetValue(newList[k])!=null? ps[n].GetValue(newList[k]).ToString():null);
b++;
}
a++;
}
a = startRow - 1;//行下标回归
b = startColumn - 1;//列下标回归
}
//判断有没有这个文件
if (File.Exists(filePath))
{
File.Delete(filePath);
}
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
book.Write(fs);
}
}
三、从Excel表格导入数据成为list集合类型
这个后面数据类型可以自己设置
/// <summary>
/// 从Excel表格导入数据成为list集合类型 (字段必须对应)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filePath">表格的路径(包括名字和后缀名)</param>
/// <param name="startRow">表格开始行数(参照表格)(不给默认第一行)</param>
/// <param name="startColumn">表格开始列(不给默认第一列)</param>
/// <param name="endRow">表格最后一行数(不给默认表格最后有数据的一行)</param>
/// <returns></returns>
static public List<T> GetListFromExcel<T>(string filePath, int startRow=1, int startColumn = 1, int endRow = -1)
{
//获取类的映射
Type t = typeof(T);
//获取类属性
PropertyInfo[] ps = t.GetProperties();
List<T> list = new List<T>();
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//读取工作本
HSSFWorkbook book = new HSSFWorkbook(fs);
//获取sheet
ISheet sheet = book.GetSheet("Sheet1");//默认就是Sheet1
//获得最后一行的下标
int temp;
if (endRow==-1)//如果没给最后一行的行数
{
temp = sheet.LastRowNum;
}
else
{
temp = endRow - 1;
}
//读内容
IRow row = null;
for (int i = startRow - 1; i <= temp; i++)//决定了循环多少次
{
//获得行
row = sheet.GetRow(i);
//实例化
T m = (T)Activator.CreateInstance(t);
//列的下标回归
int b = startColumn - 1;
//循环赋值
for (int j = 0; j < ps.Length; j++)
{
//判断这一列单元格存不存在(是否为空)
ICell cell = row.GetCell(b);
if (cell == null)//为空跳过
{
b++;
continue;
}
//获得这一列字段类型
string pType = ps[j].PropertyType.ToString();
switch (pType)
{
case "System.Int32"://Int32
ps[j].SetValue(m, Convert.ToInt32(cell.NumericCellValue));
break;
case "System.String"://String
ps[j].SetValue(m, cell.StringCellValue);
break;
case "System.Double"://Double
ps[j].SetValue(m, cell.NumericCellValue);
break;
case "System.Decimal"://Decimal
ps[j].SetValue(m,Convert.ToDecimal(cell.NumericCellValue));
break;
case "System.Boolean"://Bool
ps[j].SetValue(m, cell.StringCellValue.ToString().Equals("是") ? true : false);
break;
case "System.DateTime"://DateTime
ps[j].SetValue(m, cell.DateCellValue);
break;
default:
break;
}
b++;
}
list.Add(m);
}
}
return list;
}
四、返回DataTable
static public DataTable GetListFromExcel(string filePath,string tableName= "Sheet1")
{
DataTable dt = new DataTable();
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
XSSFWorkbook book = new XSSFWorkbook(fs);
ISheet sheet = book.GetSheet(tableName);
IRow headerRow = sheet.GetRow(0);
int endColumn = headerRow.LastCellNum;
for (int j = 0; j < endColumn; j++)
{
dt.Columns.Add();
}
IRow row = null;
for (int i = 0; i <= sheet.LastRowNum; i++)
{
row = sheet.GetRow(i);
dt.Rows.Add();
for (int j = 0; j < endColumn; j++)
{
ICell cell = row.GetCell(j);
if (cell == null)
{
continue;
}
if (cell.CellType==CellType.Numeric)
{
if (DateUtil.IsCellDateFormatted(cell))
{
dt.Rows[i][j] = cell.DateCellValue.ToString("yyyy/MM/dd");
}
else
{
dt.Rows[i][j] = cell.ToString();
}
}
else
{
dt.Rows[i][j] = cell.ToString();
}
}
}
}
return dt;
}