2012-02-22 59 views
2

我正在使用C#和OleDb從Excel 2007文件中讀取數據。我使用使用Oledb讀取Excel文件 - 將Excel文件的內容僅作爲文本對待

連接字符串是:

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

您的excel文件是否有標題行? – 2012-02-22 09:21:39

+0

是的,我的頭排有 – 2012-02-22 09:57:50

回答

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\""; 
+0

感謝您的建議。它現在還在爲我工作:(:(我已經更新了上面的問題代碼,請你回顧一下,讓它知道它是否正確? – 2012-02-23 09:35:38

+0

HDR = YES shoud是HDR = NO,並刪除第一行DataSet中的DataTable – 2012-02-23 09:39:05

+0

Okies :) :)我會盡力讓你知道。再次感謝。 – 2012-02-23 11:04:57

0

我們發現的一種修復方法是確保第一行包含標題。 即確保您的列名在第一行。如果可能的話。

然後在你的代碼中,如果需要的話,你必須以編程方式忽略第一行,而 在同一時間從你的列名開始。

在連接字符串中使用它。

 IMEX=1;HDR=NO; 

我不知道這

 TypeGuessRows=0;ImportMixedTypes=Text 
0

我有類似的問題。我通過在下面的字符串中提到分裂的ConnectionString解決它。請注意,在擴展屬性之後..(字符)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;