[.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:從零開始的軟體開發生活」
請大家繼續支持 ^_^