2013-04-03 255 views
4

我讀使用C#這樣讀取Excel文件(.xlsx)格式文件

string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + 
          ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\";"; 

var output = new DataSet(); 

using (var conn = new OleDbConnection(strConn)) 
{ 
    conn.Open(); 

    var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

    foreach (DataRow row in dt.Rows) 
    { 
     string sheet = row["TABLE_NAME"].ToString(); 

     var cmd = new OleDbCommand("SELECT * FROM [+"+sheet+"+]", conn); 
     cmd.CommandType = CommandType.Text; 

     OleDbDataAdapter xlAdapter = new OleDbDataAdapter(cmd); 

     xlAdapter.Fill(output,"School"); 
    } 
} 

.xlsx文件但我在xlAdapter.Fill收到錯誤(輸出, 「學校」); 錯誤是

The Microsoft Office Access database engine could not find the object '+_xlnm.Print_Area+'. Make sure the object exists and that you spell its name and the path name correctly. 

我無法弄清楚,什麼是錯的代碼中發生的事情。

+0

什麼是您的excel文件的版本? – Alex

+0

是否有這樣做的理由?你不能用一些現有的庫來閱讀'* .xlsx'文件嗎? – harry180

+0

@voo它是excel 2007文件。 –

回答

3

我相信您的工作表被命名爲_xlnm.Print_Area。 嘗試改變這一行

var cmd = new OleDbCommand("SELECT * FROM [+"+sheet+"+]", conn); 

var cmd = new OleDbCommand("SELECT * FROM ["+sheet+"]", conn); 
0

變量sheet包含值:+_xlnm.Print_Area+

+_xlnm.Print_Area+並不實際存在。

這就是爲什麼錯誤來了。

檢查該對象。

+0

從哪裏可以看到此對象? –

+0

看到,在你的數據庫'xlnm.Print_Area'這個特定的表或對象是否存在?如果沒有[這絕對不是]從這個值來的地方[通過調試器]。 – Freelancer

+0

row [「TABLE_NAME」]。ToString()給出的表名爲xlnm.Print_Area,但我知道爲什麼它給了這個。 –

0

我會檢查你在row["TABLE_NAME"].ToString();值。或者,您可以嘗試OpenXML SDK:How to: Parse and read a large spreadsheet document (Open XML SDK)

+0

row [「TABLE_NAME」]。ToString()給出的表名稱爲xlnm.Print_Area,但我不知道它爲什麼給出這個。 –

+0

您是否嘗試過從Excel清除源文檔中的打印區域?1.單擊要清除打印區域的工作表上的任意位置。 2.在頁面佈局選項卡的頁面設置組中,單擊清除打印區域。 – jle

0

當您在表中定義打印區域「_xlnm.Print_Area」自動加入您的新表。請刪除excel表格的打印區域表格或使用以下代碼

if (!dr["TABLE_NAME"].ToString().Contains("_xlnm#Print_Area")) 
{  
    obj.SheetName = dr["TABLE_NAME"].ToString(); 
    lst.Add(obj); 
}