2009-11-25 76 views
0

我想允许我的应用程序从XLS文件导入数据。我已经用CSV文件和XML文件执行此操作,但希望为用户打开范围。我在加载文件时遇到问题。我们将文件(XLS,CSV,XML)加载到数据集中并从那里开始处理。为XLS加载代码如下使用Microsoft Jet引擎读取XLS文件

FileInfo fi = new FileInfo(filename); 

//create and open a connection with the supplied string 
OleDbConnection objOleDBConn; 
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName)); 
objOleDBConn.Open(); 

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

if (dt == null || dt.Rows.Count == 0) 
{ 
    return; 
} 

string sheet = dt.Rows[0]["TABLE_NAME"].ToString(); 

//then read the data as usual. 
OleDbDataAdapter objOleDBDa; 
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn); 
objOleDBDa.Fill(data); 
objOleDBConn.Close(); 

所以我的数据被加载好了,但它似乎设置各列的数据类型,这是我的一列的问题。这是一个场,我们选择接受False,True,Yes,No,YN。有一些代码稍后将其转换为布尔值。这工作正常CSV文件(连接字符串不同),但在XLS,如果前10行是说FALSETRUE,然后说第11说YES,那么我只是得到一个空条目。我猜它读取了前几个条目,并根据它来确定数据类型?

问题:有没有一种方法可以根据前几个条目关闭标识列数据类型的机制?

+0

你可以尝试添加的MaxScanRows = 1到连接字符串的扩展属性,再有纸张的第一行中的文本字段。我从来没有尝试过,但它可能工作? – Tester101 2009-11-25 13:08:56

回答

0

有一个注册表设置来告诉Jet提供程序要读取多少行以推断列的数据类型。它默认为8我相信。它是:

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows 

(更改版本适用)。在你的情况,它已经传染布尔值,因此忽略字符串值“是”。

+0

谢谢,但如果您没有权限访问注册表会发生什么情况,因为该用户的安全策略被锁定。我不相信微软会写一个功能,为了关闭它,你必须设置功能来测试一切,只是为了发现你不想使用该功能,似乎倒退了。 谢谢 将 – wdhough 2009-11-26 10:35:28

+0

短片分裂成许多8行床单,没有太多,你可以做那么。 – 2009-11-26 12:05:49

0

试试这个OleDBAdapter Excel QA我通过堆栈溢出发布。

我填写工作表列瓦特/所有的TRUE或FALSE,然后在几个摔“是”或“否”值随机它工作得很好......在调试模式下

运行,然后点击DataSet Visualizer填充后查看结果。 或者,这增加了代码的结尾输出

// DataSet:   
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3]; 
string rowElevenColumn3 = row11Col3.ToString(); 
相关问题