需求:wpf怎么用datagrid显示从excel读取的数据?
思路:
1、读取excel数据生成datatable;
2、datagrid根据datatable动态添加列;
3、datagrid数据绑定;
private void Button_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog()
{
DefaultExt = ".xls",
Filter = "Excel2003 Files (*.xls)|*.xls|"
};
if (openFileDialog.ShowDialog() == true) {
string filename = openFileDialog.FileName;
var dataTable = ExcelToDataTable(filename);
foreach (var col in dataTable.Columns) {
Dgrid.Columns.Add(new DataGridTextColumn() { Header = col.ToString(), Binding = new Binding(col.ToString()) });
}
Dgrid.ItemsSource = null;
Dgrid.ItemsSource = dataTable.DefaultView;}
}public static DataTable ExcelToDataTable(string filePath,bool hasTitle = true)
{
var dt = new DataTable();
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var hssfworkbook = new HSSFWorkbook(file);
var sheet = hssfworkbook.GetSheetAt(0);
var rows = sheet.GetRowEnumerator();
while (rows.MoveNext())
{
var row = (HSSFRow)rows.Current;
if (hasTitle)
{
for (var i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
dt.Columns.Add(cell.ToString());
}
hasTitle = false;
}
else
{
var dr = dt.NewRow();
for (var i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
if (cell == null)
{
dr[i] = null;
}
else
{
switch (cell.CellType)
{
case CellType.Blank:
dr[i] = "[null]";
break;
case CellType.Boolean:
dr[i] = cell.BooleanCellValue;
break;
case CellType.Numeric:
dr[i] = cell.ToString();
break;
case CellType.String:
dr[i] = cell.StringCellValue;
break;
case CellType.Error:
dr[i] = cell.ErrorCellValue;
break;
case CellType.Formula:
try
{
dr[i] = cell.NumericCellValue;
}
catch
{
dr[i] = cell.StringCellValue;
}
break;
default:
dr[i] = "=" + cell.CellFormula;
break;
}
}
}
dt.Rows.Add(dr);
}
}
}
return dt;
}