实现思路
最近在学习C#的编程,想分享一下自己的学习过程,本方法显示数据的办法比较固定,需要定义一个数据模型类,再C#的窗体应用中,使用一个button按钮和GridView组件,引用NPOI读取Excel数据,使用反射GetProperies绑定student类的public属性,通过遍历添加到dataRows列表,再把dataRows的数据绑定到GridView进行展示。请大家参考,欢迎指定批评。
确定导入的数据
建立数据模型
class Student
{
public string 学号 { set; get; }
public string 班级 { set; get; }
public string 姓名 { set; get; }
public string 性别 { set; get; }
public string 身份 { set; get; }
}
代码实现
private void excelBtn_Click(object sender, EventArgs e)
{
var dig = new OpenFileDialog()
{
Title = "请选择要导入的文件",
Filter = "Excel Files|*.xlsx;*.xls",
Multiselect = false//是否可以多选文件
};
//选择文件时取消
if (dig.ShowDialog()!=DialogResult.OK) {
return;
}
var inputFilename = dig.FileName;
//返回指定的路径字符串的扩展名,Extension扩展
var ext = Path.GetExtension(inputFilename);
// MessageBox.Show("ext:"+ext);
//定义工作簿
IWorkbook workbook;
//使用文件流,FileMode .Open打开现有文件
using (var stream = new FileStream(inputFilename, FileMode
.Open))
{
//扩展名判断
if (".xlsx".Equals(ext, StringComparison.OrdinalIgnoreCase))
{
//打开.xlsx文件
workbook = new XSSFWorkbook(stream);
}
else
{
//打开.xls文件
workbook = new HSSFWorkbook(stream);
}
//获取第一个表
var sheet= workbook.GetSheetAt(0);
//定义行号,从第二行开始读
int rowindex = 1;
//反射,获取student类的公共属性
var properties = typeof(Student).GetProperties(BindingFlags.Instance | BindingFlags.Public);
//定义一个泛型student列表
var dataRows = new List<Student>();
while (true) {
//获取行
var row = sheet.GetRow(rowindex);
if (row == null) {
break;
}
//实例对象
var rowData = new Student();
//定义列
int columIndex = 0;
foreach (var property in properties)
{
//遍历反射对象的属性,比如学号,班级,姓名
var cell = row.GetCell(columIndex);
property.SetValue(rowData, cell.ToString(), null);
columIndex++;
}
//添加到列表保存
dataRows.Add(rowData);
rowindex++;
}
//添加到GridView显示
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dataRows;
}
}
最后效果: