[.NET]Sheet1$不是有效的名稱

[.NET]Sheet1$不是有效的名稱

今天幫同事查一個「Sheet1$不是有效的名稱」的錯誤,一看就知道Excel的Sheet Name不是叫Sheet1。

看程式中是寫死Sheet1,可能較早以前的Excel預設的Sheet Name都是Sheet1開始,而這個測試的Excel則是叫「工作表1」。

那要把程式改成去讀「工作表1」的Sheet嗎?

上網有查到可透過GetOleDbSchemaTable來取到Excel的Sheet Name(Microsoft Jet database engine could not find the object 'sheet1$'.),這樣就不用寫死在程式中了,如下,

using (OleDbConnection excelConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=@你的ExcelPath@;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"))
{
	excelConn.Open();
	DataTable excelShema = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
	string firstSheetName = excelShema.Rows[0]["TABLE_NAME"].ToString();
	string query = string.Format("Select * from [{0}]", firstSheetName);
	using (OleDbDataAdapter DataAdapter = new OleDbDataAdapter(query, excelConn))
	{
		DataTable excelData = new DataTable("ExcelData");
		DataAdapter.Fill(excelData);
	}
	excelConn.Close();
}

 

當然,使用Linq to Excel比較方便一些,如下,

ExcelQueryFactory excel = new ExcelQueryFactory(@"@你的ExcelPath@如h:\t.xls");
if (excel.GetWorksheetNames().Count() > 0)
{
	var excelData = from c in excel.Worksheet(0)
						   select c;
}

 

NPOI也是可以的哦!

 

註:

不管是使用OLEDB or Linq to Excel,如果您的Excel欄位中有混合資料,如某欄前8行的資料是數值,之後是字串。

就有可能會造成讀取判斷錯誤,後面的資料讀入null。

如果有這種狀況,設定註冊機碼TypeGuessRows的值從8改成0或是適合的大小還是需要的哦!

詳細可參考保哥的Blog文章:透過 OleDb 精準讀入 Excel 檔的方法

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^