Asp.net mvc 3 导入带前导零的3位字段
ASP.NET、C#、MVC 3、代码优先项目 我正在尝试从Excel电子表格导入数据。我已将所有单元格格式化为文本。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
导入工作表中的示例行如下所示
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位驱动程序,但我记得在这里这并不重要