运用到的相关知识:
1)使用NPOI创建Excel文件并写入数据
2)泛型
3)特性和反射
从最主要的一个函数说起:
public static void ExportDataToExcelFile<T>(string strFilePath, List<T> data)
where T : class
1)函数的功能:将一个泛型List集合中的数据导出到一个Excel文件中去
2)第一个参数指定了Excel文件的路径,文件不存在则创建该文件,存在则覆盖
3)data是一个List集合,其中类型参数T要求是一个类(不知道能不能约束它必须拥有某些特性)
4)这里也可以不使用特性,只是反射出属性来,但是为了获得更多的信息(工作表名称、列的名称)我还是加上了特性
程序中用到的两个自定义特性类:
ExcelSheetAttribute特性类:
[AttributeUsage(AttributeTargets.Class)]
public sealed class ExcelSheetAttribute : Attribute
{
public ExcelSheetAttribute(string sheetName)
{
SheetName = sheetName;
}
private string _SheetName;
public string SheetName
{
get { return _SheetName; }
set { _SheetName = value; }
}
}
说明:该特性只能使用在class上面,如果为某个类使用该特性必须指定一个位置参数sheetName,该参数最终将指示工作表的名称,并不是要求函数ExportDataToExcelFile中的类型参数T必须运用该特性,运用了则使用提供的名称,没有使用该特性默认名称为“sheet1”。
ExcelColumn特性类:
[AttributeUsage(AttributeTargets.Property)]
public sealed class ExcelColumn : Attribute
{
public ExcelColumn(CellType type=CellType.STRING) //默认是字符串类型
{
ColumnType = type;
}
private CellType _ColumnType;
private string _ColumnName;
public CellType ColumnType
{
get { return _ColumnType; }
set { _ColumnType = value; }
}
public string ColumnName
{
get { return _ColumnName; }
set { _ColumnName = value; }
}
}
说明:该特性只能使用在属性上,其中包含两个属性ColumnType和ColumnName,其中ColumnType的类型是NPOI中提供表示Excel表格中单元格数据类型的一个枚举,在写入Excel文件时会使用该特性属性,而ColumnName则表示的是最终在Excel文件的头部显示的信息,表头名称。
一个使用了以上两个自定义特性的类示例:
[ExcelSheet("学生信息")]
public class StudentSheet
{
[ExcelColumn(CellType.NUMERIC,ColumnName="编号")]
public int ID { get; set; }
[ExcelColumn(CellType.STRING,ColumnName="姓名")]
public string Name { get; set; }
[ExcelColumn(CellType.STRING,ColumnName="性别")]
public string Sex { get; set; }
[ExcelColumn(ColumnName = "生日")]
public string Birthdate { get; set; }
[ExcelColumn(ColumnName = "学习日期")]
public string Studydate { get; set; }
[ExcelColumn(CellType.STRING,ColumnName="地址")]
public string Address { get; set; }
[ExcelColumn(CellType.STRING, ColumnName = "电子邮件")]
public string Email { get; set; }
[ExcelColumn(CellType.STRING, ColumnName = "电话")]
public string Telephone { get; set; }
}
说明:在具体使用的时候我们只需要定义这样的一个类,在类和属性上面添加适当的特性信息,再调用上面提到过的函数,就能拿到我们想要的数据,这里属性定义的顺序将决定最后Excel文件中各个列的顺序。
|