1. 程式人生 > >ASP.NET 讀取EXCEL 單元格 無法讀取 空值 不顯示

ASP.NET 讀取EXCEL 單元格 無法讀取 空值 不顯示

讀取excel時,某些單元格為空值

前些日子,寫了一個excel匯入資料庫的共同batch,突然有一天發現當我修改excel某一列的值的時候突然讀不出來值了.奇怪之餘,做了一些調研.

原來如此:

當我們用olebb讀取excel的時候,如果沒有配置imex=1的屬性,微軟的處理機制是將列轉換為同一型別來讀取的.例如你在第一行寫的數字格式,而第二行寫的字元格式,就會出現某些列有值卻讀不出來.其實問題也很簡單,如果知道問題所在的話.屬性設定為"imex=1"即可

附以下參考:

string xlsdriver = @"provider=microsoft.jet.oledb.4.0;data source={0};extended properties='excel 8.0;imex=1';";
oledbconnection conn = new oledbconnection(string.format(xlsdriver, filename));

"hdr=yes;" indicates that the first row contains columnnames, not data.
"hdr=no;" indicates the opposite.
"imex=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. note that this option might affect excel sheet write access negative.

加上imex=1這個屬性,excel單元格的值就會以文字型讀取,避免由於資料型別不一致導致某些值讀不出來的

找不到可安裝的ISAM

在進行將Excel匯入到應用程式時,提示“ 找不到可安裝的ISAM “的解決方案:

1.連線字串問

Extended Properties='Excel 8.0;HDR=NO;IMEX=1'

(1)HDR表示要把第一行作為資料還是作為列名,作為資料用HDR=no,作為列名用HDR=yes;通過Imex=1來把混合型作為文字型讀取,避免 null值。

(2)左右兩個單引號不能少

2.只需註冊 Excel ISAM即可

在“執行”對話方塊中輸入回車即可:Regsvr32 c:\WINDOWS\system32\msexcl40.dll

public DataSet ExcelReader(string excelName)
{
// 拼寫連線字串,開啟連線
string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
OleDbConnection objConn = new OleDbConnection(strConn);
objConn.Open();
// 取得Excel工作簿中所有工作表
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbDataAdapter sqlada = new OleDbDataAdapter();
DataSet ds = new DataSet();
// 遍歷工作表取得資料並存入Dataset
foreach (DataRow dr in schemaTable.Rows)
{
try
{
string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
sqlada.SelectCommand = objCmd;
sqlada.Fill(ds, dr[2].ToString().Trim());
}