我想允许我的应用程序从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行是FALSE
或TRUE
,那么说第11个说YES
,然后我得到一个空条目。我猜它会读取前几个条目并根据它确定数据类型?
问题:有没有办法根据前几个条目关闭标识列数据类型的机制?
答案 0 :(得分:0)
此问题与Excel cell-values are truncated by OLEDB-provider和Excel reading in ASP.NET : Data not being read if column has different data formats非常相似似乎在这些其他问题中讨论了几个可行的解决方案。
答案 1 :(得分:0)
有一个注册表设置可以告诉Jet提供程序要读取多少行来推断列的数据类型。我相信默认为8。它是:
HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows
(根据情况更改版本)。在你的情况下,它有不同的布尔值,因此忽略字符串值“是”。
答案 2 :(得分:0)
尝试通过堆栈溢出发布的OleDBAdapter Excel QA。
我用一个TRUE或FALSE填充了一个工作表列,然后随机地输入了几个“是”或“否”值,它运行正常......
在调试模式下运行,然后在填充后单击DataSet Visualizer以查看结果。 或者,将其添加到输出代码的末尾
// DataSet:
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3];
string rowElevenColumn3 = row11Col3.ToString();
答案 3 :(得分:0)
技巧是将标题行包含在用于推断数据类型的行中,以便所有列都将作为字符串读取。然后,如果需要,您将能够解析代码以更正数据类型,而不会丢失值 - 用于此HDR =否
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));