1

ASP.NET、C#、MVC 3、代码优先项目

我正在尝试从 Excel 电子表格中导入数据。我已将所有单元格格式化为文本。
导入工作表中的示例行如下。

Account             Card               ThreeCode  Route  
04562954830287127   32849321890233127  183        154839254 
04562954830287128   32849321890233128  233
04562954830287129   32849321890233129  082
04562954830287130   32849321890233130  428

当我在调试中运行并深入了解 ds DataSet 时,Account 和 Card 列作为字符串导入,3-Digit 和 Route 列作为双精度导入。问题出现在数据行 3 中以 0 (082) 开头的 3 位数字。它作为 System.DBNull 导入并且为空。我需要能够导入带前导零的 3 位代码。有没有办法强制导入为所有字符串或解决此问题的另一种方法?我在网上搜索并没有找到解决方案。这将从浏览器运行,因此与本地计算机上的注册表、dll 或 ini 文件无关。导入代码如下。预先感谢您的任何帮助。

public ActionResult ExcelToDS(string Path = "C;\File.xls")
{ 
  string strConn = "Provider= Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + "; " + "Extended Properties=Excel 8.0;";

  OleDbConnection conn = new OleDbConnection(strConn);
  conn.Open(); string strExcel = "";
  OleDbDataAdapter myCommand = null;
  DataTable dt = new DataTable();
  strExcel = "select * from [Import$]";
  DataSet ds = null; 
  myCommand = new OleDbDataAdapter(strExcel, strConn);
  ds = new DataSet(); myCommand.Fill(ds, "table1");
4

2 回答 2

1

啊,是的,Excel 驱动程序的乐趣。发生的情况是它从数据类型的前十行中做出决定,该格式之外的任何内容都变为空。

解决方案是使用更强大的第三方驱动程序,通常会花费一些东西,或者将注册表项设置为对所有行进行全面采样,而不是默认的 8 行。

在此处查看 TypeGuessRows 的链接 http://www.connectionstrings.com/excel

HKLM\Software\Wow5432Node\Microsoft\Jet\4.0\Engines\Excel 将值 TypeGuessRows 设置为零

于 2012-11-07T00:37:55.613 回答
0

似乎没有办法使这项工作始终如一。我想出的解决方法是将 1000 添加到 Excel 工作簿中的 ThreeCode 列。然后,您可以将数据导入数据集。然后当数据被读出时,您只需去掉“1”前缀。这是我的内联方法。

public static string last3(this string instring)
{ int len = instring.Length - 3; string outstring = instring.Substring(len, 3); return outstring; }

您可以在代码中调用:

card.3Dig = code.last3();

'card' 和 '3dig' 是要填充的类和字段。“代码”是 4 位数据集数据。

于 2012-11-07T15:18:36.047 回答