Asp.net mvc 3 导入带前导零的3位字段

Asp.net mvc 3 导入带前导零的3位字段,asp.net-mvc-3,c#-3.0,import-from-excel,oledbdataadapter,Asp.net Mvc 3,C# 3.0,Import From Excel,Oledbdataadapter,ASP.NET、C#、MVC 3、代码优先项目 我正在尝试从Excel电子表格导入数据。我已将所有单元格格式化为文本。 导入工作表中的示例行如下所示 Account Card ThreeCode Route 04562954830287127 32849321890233127 183 154839254 04562954830287128 32849321890233128 233 0456295483028

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

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

Account             Card               ThreeCode  Route  
04562954830287127   32849321890233127  183        154839254 
04562954830287128   32849321890233128  233
04562954830287129   32849321890233129  082
04562954830287130   32849321890233130  428
当我在debug中运行并深入ds数据集时,Account和Card列作为字符串导入,3位数和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");

啊,是的,excel驱动程序的乐趣。发生的情况是,它从数据类型的前十行(比如说前十行)确定,任何超出该格式的内容都将变为null

解决方案是使用一个更健壮的第三方驱动程序,通常需要花费一些钱,或者设置注册表项以对所有行进行完全采样,而不是默认的8行

查看此处的链接以获取TypeGuessRows

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

啊,是的,excel驱动程序的乐趣。发生的情况是,它从数据类型的前十行(比如说前十行)确定,任何超出该格式的内容都将变为null

解决方案是使用一个更健壮的第三方驱动程序,通常需要花费一些钱,或者设置注册表项以对所有行进行完全采样,而不是默认的8行

查看此处的链接以获取TypeGuessRows

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

似乎没有一种方法可以使此操作保持一致。我想出的解决办法是在Excel工作簿的ThreeCode列中添加1000。然后可以将数据导入数据集。然后,当读取数据时,只需去掉“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位数的数据集数据。

似乎没有一种方法可以使这项工作保持一致。我想出的解决办法是在Excel工作簿的ThreeCode列中添加1000。然后可以将数据导入数据集。然后,当读取数据时,只需去掉“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位数据集数据。

三位代码列中的大多数行包含三位数字。似乎采样更多的行不会让它将其解释为字符串。如果它不将其解释为字符串,我看不出它如何能够保留前导0。“threecode”列中的大多数行都包含三位数。似乎采样更多的行不会让它将其解释为字符串。如果它不将其解释为字符串,我看不出它如何能够保留前导的0。通过按照下面的值对所有行进行采样,excel驱动程序应该查询该列中的每个字段,如果它找到类似于字符串的内容,则它会将所有数据视为字符串。我已经编写了一个生产应用程序,在经历了与您提到的完全相同的问题的应用程序中进行了大量研究,并以这种方式解决了问题之后,该应用程序就完成了相同的修复。还要注意的是,由于最大长度问题,我使用了64位驱动程序,但我记得在这里这并不重要。您可以尝试按照设置IMEX,并确保在正确的位置设置了reg值(sas链接对此进行了讨论,MS站点上也有问题,但首先出现的是:)正如我之前所说的,由于它是一个3位数,测试确定它是一个双精度的数字,所以没有包含字符串的单元格。我尝试在数据的前8行前面加上一个引号,但从第9行开始返回System.DBNull。如果要导入200行,则没有一种实用的方法可以在所有行的前面加上一个引号。添加1000可以使用一个简单的公式=D2+1000,填充所有行,然后将其值粘贴回原始列。这不是一个混合数据问题。通过采样更多的行来降低导入速度并不能解决问题,此外,我不想弄乱最终用户的注册表。奇怪的是,它将带前导零的17位帐号解释为字符串,而不是3位帐号,即使工作表中的所有单元格都被格式化为文本。你能用一个3位数的数字复制这个问题吗?问题似乎是处理非常短的数字时出现的一个错误,这些数字被格式化为带前导零的文本。也许我错过了这个。这听起来像是一个混合数据问题-驱动程序将其解释为数字,然后看到前导零,并解释为文本,因此为空?遇到的数据类型是什么?是否可以使用第三方驱动程序?它们避免了所有这些垃圾:)这也是xls或xlsx开放式XML格式吗?通过按照下面的值对所有行进行采样,excel驱动程序应该查询该列中的每个字段,如果它找到了类似于字符串的内容,则它会将所有数据视为字符串。我已经编写了一个生产应用程序,在经历了与您提到的完全相同的问题的应用程序中进行了大量研究,并以这种方式解决了问题之后,该应用程序就完成了相同的修复。还要注意的是,由于最大长度的问题,我使用了64位驱动程序,但我记得在这里这并不重要