我正在使用C#和OleDb从excel 2007文件中读取数据。
我正在使用的连接字符串是:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
以下是阅读excel的代码:
private OleDbConnection con = null;
private OleDbCommand cmd = null;
private OleDbDataReader dr = null;
private OleDbDataAdapter adap = null;
private DataTable dt = null;
private DataSet ds = null;
private string query;
private string conStr;
public MainWindow()
{
this.InitializeComponent();
this.query = "SELECT * FROM [Sheet1$]";
this.conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\301591\\Desktop\\Fame.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"";
}
private void btnImport_Click(object sender, RoutedEventArgs e)
{
this.ImportingDataSetWay();
}
private void ImportingDataSetWay()
{
con = new OleDbConnection(conStr);
cmd = new OleDbCommand(query, con);
adap = new OleDbDataAdapter(cmd);
ds = new DataSet();
adap.Fill(ds);
this.grImport.ItemsSource = ds.Tables[0].DefaultView;
}
这里grImport是我的WPF数据网格,我正在使用自动生成的列。
如何确保存储在Excel中的内容始终以字符串形式读取。 我不允许修改任何注册表值来实现此目的。有没有更好的方法来阅读excel。请指导我。如果您需要任何其他信息,请告诉我。
此致 Priyank
答案 0 :(得分:5)
您可以尝试oledb提供者连接字符串,如下所示。
HDR = NO表示oledb将所有行读作数据[NO HEADER]。因此,当您的标题列都是文本时,它会将所有列中的所有行数据视为文本。将数据填充到DataSet后,您必须删除第一行,因为它不是数据。
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";
答案 1 :(得分:0)
我们发现的一个修复方法是确保第一行包含标题。 即确保列名在第一行。如果可能的话。
然后在您的代码中,您必须以编程方式忽略第一行 同时,如果需要,可以将列名称从中删除。
在连接字符串中使用此选项。
IMEX=1;HDR=NO;
我不确定这个
TypeGuessRows=0;ImportMixedTypes=Text
答案 2 :(得分:0)
我有类似的问题..我通过拆分下面的字符串中提到的连接字符串来解决它。请注意,在扩展属性之后..有(char)34包围IMEX = 1字符串的添加。没有围绕(char)34,它会给出错误“找不到ISAM”。希望这也能解决ACE提供商的问题
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Server.MapPath("UploadedExcel/" + FileName + ".xls") +
";Extended Properties=" +
(char)34 + "Excel 8.0;IMEX=1;" + (char)34;