0

这是我的问题:

我正在从 .NET MVC 应用程序上的 Excel 文件中读取数据,我正在做的是从 excel 中读取所有数据,然后遍历每条记录,将记录中包含的数据插入到我的业务模型中。

一切都完美无缺。但是,我发现有时从 excel 中检索一个字段时会返回一个空字符串。奇怪的是,这个字段可以包含一个简单的字符串或一个将被视为数组的字符串(它可以包含“|”字符来构建数组)在某些 excel 文件中,当“|”字段返回空时 char 存在,而其他不存在时,这种行为在该文件中是一致的。

还有其他字段可以接收分隔符并且总是可以正常工作。这两个字段之间的唯一区别是,工作的是纯字符串,而失败的是一串数字,可能是“|” 将它们分开。

我尝试更改分隔符(我尝试使用 '#' 得到相同的结果)并将单元格专门格式化为文本,但没有任何成功。

这是从excel中提取数据的方法

private DataSet queryData(OleDbConnection objConn) {
    string strConString = "SELECT * FROM [Hoja1$] WHERE NUMACCION <> ''";
    OleDbCommand objCmdSelect = new OleDbCommand(strConString, objConn);
    OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
    objAdapter1.SelectCommand = objCmdSelect;
    DataSet objDataset = new DataSet();
    objAdapter1.Fill(objDataset, "ExcelData");
    return objDataset;
}

我首先检查 excel 中的字段:

fieldsDictionary.Add("Hours", table.Columns["HOURS"].Ordinal);

后来,在循环数据集时,我使用以下方法提取数据:

string hourString = row.ItemArray[fieldsDictionary["Hours"]].ToString();

这个 hourString 在某些记录中是空的。在某些 Excel 文件中,当记录包含“|”时为空,而在其他 Excel 文件中不包含时为空。我还没有找到一个文件,它在两个类的记录上都返回空。

我对此感到很困惑。我很确定它必须与字段数据的数字性质有关,但无法理解为什么当我将 excel 文件上的单元格强制为“文本”时它不能解决

任何帮助都将受到欢迎。

4

1 回答 1

0

好的。我终于解决了这个问题。

如果 Excel 包含可能不同类的数据,则似乎 Excel 无法将整个列识别为相同的数据类型。即使您将单元格格式强制为工作簿上的文本,也会发生这种情况,因为当您查询数据时,它会根据收到的第一条记录将该字段识别为确定类型;这就是为什么不同的文件会清空不同类型的记录,以纯文本开头的文件会清空数值,反之亦然。

我找到了一个解决方案,只需将连接字符串更改为 Excel。

这是我原来的连接字符串

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=pathToFile;Extended Properties="Excel 8.0;HDR=Yes;"

这是解决问题的那个

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=pathToFile;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"

参数 IMEX=1 向 excel 表明它必须将所有混合数据列作为纯文本进行管理。如果您需要编辑 excel 文件,这对您不起作用,因为此参数也会以只读模式打开它。然而,它非常适合我的情况。

于 2012-11-29T08:11:21.073 回答