0

我想允许我的应用程序从XLS文件中导入数据。我已经对CSV文件和XML文件执行此操作,但想为用户打开范围。我在加载文件时遇到问题。我们将文件 ( XLS, CSV, XML) 加载到数据集中并从那里开始处理。加载代码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, Y, 和N。稍后有代码将其转换为布尔值。这在一个CSV文件(连接字符串不同)中工作正常,但在一个文件中XLS,如果前 10 行是FALSEor TRUE,然后说第 11行是YES,那么我只会得到一个空条目。我猜它会读取前几个条目并根据它确定数据类型?

问题: 有没有办法关闭根据前几个条目识别列数据类型的机制?

4

4 回答 4

0

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

我填充了一个带有所有 TRUE 或 FALSE 的工作表列,然后随机输入了几个“是”或“否”值,它工作正常......

在调试模式下运行,然后在填充后单击 DataSet Visualizer 以查看结果。或者,将其添加到输出代码的末尾

// DataSet:          
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3];
string rowElevenColumn3 = row11Col3.ToString();
于 2011-05-03T20:17:37.413 回答
0

这个问题非常类似于Excel cell-values are truncated by OLEDB-provider and Excel reading in ASP.NET : Data not being read if column has different data formats 看起来在这些其他问题中讨论了几个可行的解决方案。

于 2009-11-25T12:53:17.100 回答
0

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

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

(根据需要更改版本)。在您的情况下,它推断出布尔值,因此忽略字符串值“yes”。

于 2009-11-25T12:53:30.657 回答
0

技巧是将标题行包含为从中推断数据类型的行,以便所有列都将被读取为字符串。然后,如果需要,您将能够解析代码以更正数据类型,而不会丢失值 - 用于此 HDR=No

objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source={0};Extended Properties='Excel 8.0;HDR=No;IMEX=1'", fi.FullName));
于 2018-05-16T12:45:23.180 回答