读书人

C#读取Excel文件显示到Datagird控件中

发布时间: 2013-03-10 09:38:39 作者: rapoo

C#读取Excel文件显示到Datagird控件中 ,读取Execl过程有问题,请教
问题是:
在导入的过程中有几个字段提示:无法将类型为“System.DBNull”的对象强制转换为类型“System.String”,只有第一个字段,被遍历出来其他字段一遍历就提示上述问题?请教了?

源码:
C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.OleDb;
using System.Data;
using Microsoft.Win32;
using System.Data.SqlClient;

namespace 读取Execl数据
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}


/// <summary>
/// 读取Execl文件返回DataSet方法
/// </summary>
/// <returns>返回结果集</returns>
public DataSet ReaderExecl(string sql)
{
string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txtfiles.Text +";Extended Properties=Excel 8.0;";

using (OleDbConnection OleCon = new OleDbConnection(conn))
{
OleCon.Open();
using (OleDbCommand OleCmd = new OleDbCommand())
{
DataSet Myds = new DataSet();
OleCmd.CommandText =sql; //"select * from [sheet1$]";
OleDbDataAdapter adapter = new OleDbDataAdapter();
OleCmd.Connection = OleCon;
adapter.SelectCommand=OleCmd;
adapter.Fill(Myds);
return Myds;


}
}
}

/// <summary>
/// 选择Execl文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnBWFiles_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofdExcel = new OpenFileDialog();
ofdExcel.Filter = "XLS文件|*.xls";
if (ofdExcel.ShowDialog() == true)
{
string filename = ofdExcel.FileName;
}
txtfiles.Text = ofdExcel.FileName;
}
/// <summary>
/// 把读取的数据显示到datagrid控件中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExecl_Click(object sender, RoutedEventArgs e)
{
if (txtfiles.Text.Length <= 0)
{
MessageBox.Show("请选择Execl文件");
return;
}
if (txtsql.Text.Length <= 0)
{
MessageBox.Show("请输入sql查询语句");
return;
}

ReaderExecl(txtsql.Text);

DataSet dt = ReaderExecl(txtsql.Text);
DataTable tb = dt.Tables[0];


ListExecl[] les =new ListExecl[tb.Rows.Count];



for (int i = 0; i < tb.Rows.Count; i++)
{
ListExecl le = new ListExecl();
le.haoduan = (string)Convert.ToString(tb.Rows[i]["号段"]);
le.shengfen = (string)tb.Rows[i]["省份"];
le.chengshi = (string)tb.Rows[i]["城市"];
le.kaxing = (string)tb.Rows[i]["卡型"];
le.quhao = (string)tb.Rows[i]["区号"];
les[i] = le;
}
datagrid.ItemsSource = les;
}

}
}

[解决办法]
加上非空判断。。
[解决办法]
if(tb.Rows[i]["号段"] != DBNull)
{
le.haoduan = Convert.ToString(tb.Rows[i]["号段"]);
}
else
{
le.haoduan = String.Empty;
}
[解决办法]
你别 (string)tb.Rows[i]["区号"]; 这样转换
直接ToString()就可以了,
即:tb.Rows[i]["区号"].ToString();
VS的datarow.ToString()已经替你处理的Null的情况

读书人网 >C#

热点推荐