使用Microsoft Jet Engine读取XLS文件

时间:2009-11-25 12:38:45

标签: c# dataset xls oledbconnection

我想允许我的应用程序从XLS文件导入数据。我已经使用CSV个文件和XML文件执行此操作,但是希望为用户打开范围。我在加载文件时遇到问题。我们将文件(XLSCSVXML)加载到数据集中并从那里开始处理。 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();

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

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

4 个答案:

答案 0 :(得分:0)

此问题与Excel cell-values are truncated by OLEDB-providerExcel 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));