导入Excel时,会丢失一些手机号,或者固定电话号

问题出在于,他们将数据填入Excel时,有些格式是数值类型,有些是文本类型

当用OLEDB读取Excel的时候,在Extended Properties中若没有配置IMEX=1的属性,微软的处理机制是将列转换为同一类型来读取的.例如在第一行写的数值格式,而第二行写的文本格式,就会出现某些列有值却读不出来.其实问题也很简单,如果知道问题所在的话.属性设置为"IMEX=1"即可。

代码如下:

string strConn;
        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + AimFile + ";Extended Properties=‘Excel 8.0;IMEX=1‘;";
        OleDbConnection conn = new OleDbConnection(strConn);
        //读取工作区“Sheet1”中的数据
        OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", strConn);
        DataSet myDataSet = new DataSet();
        myCommand.Fill(myDataSet);

return myDataSet;//返回数据集

C#读取Excel需要注意的:

IMEX=1:混合模式

HDR=Yes; 是否让第一行作为列头

两者必须一起使用。

本以为这样就OK了。但在实际使用过程中,这样设置还是不行,查阅了不少资料才发现,原来还有一个注册表里的信息需要修改,这样带能让excel不再使用前8行的内容来确定该列的类型。

C#读取Excel之注册表修改内容如下:

在HKLM\Software\Microsoft\Jet\4.0\Engines\Excel有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0,就可以解这个问题了!

解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=‘Excel 8.0;HDR=Yes;IMEX=1‘";
            OleDbConnection conn = new OleDbConnection(strConn);
主要是驱动的问题,需要添加hdr 和 imex,
其中,hdr取值yes,no ,表示第一行是否为字段名
imex  取值1,2,其中1  正是解决此问题的关键

C#导入Excel遇到数字字母混合列数据丢失解决详解

错误重现:

-----------------------------------------------------------------------

在导入Excel读取数据时,其中的一个字段保存的值有如下格式:"2011072014","20110Aad10","25124Adfa","例子asdfadf"  这样的 混合了 "字母/数字/中文"数据, 在Excel表格中的前 8条 或 前 8+ 条数据中的 这个列中的数据都是 由纯数字组成的,如"2011072012","2011072013","2011072014",到了大于8行的时候的该列的数据组成变成了 数字+中文 + 字母的组合,这样就会出现取不到该列值的问题

错误原因:

-----------------------------------------------------------------------

Excel读取数据列的格式 是按照每一列前8个数据的类型来判断读写时的类型的。比如前8个数据有3个是字幕,5个是数字,那么这一整列都是以数字型来读的,类型最多的那么不管第8条之后是什么类型,都当作这个类型来读取,那些字母都读不了。

使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。

产生这种问题的根源与Excel ISAM[3](Indexed Sequential Access Method,即索引顺序存取方法)驱动 程序的限制有关,Excel ISAM 驱动程序通过检查前几行中实际值确定一个 Excel 列的类型,然后选择能够代表其样本中大部分值的数据类型 [4]。也即Excel ISAM查找某列前几行(默认情况下是8行),把占多的类型作为其处理类型。例如如果数字占多,那么其它含有字母等文本的数据项 就会置空;相反如果文本居多,纯数字的数据项就会被置空。 
  现具体分析在第1节程序代码Extended Properties项中的HDR 和IMEX所代表的含义。HDR用来设置是否将Excel表中第一行作为字段名,“YES”代表是,“NO”代表不是即也为数据内容;IMEX是用来告诉 驱动程序使用Excel文件的模式,其值有0、1、2三种,分别代表导出、导入、混合模式。

当我们设置IMEX=1时将强制混合数据转换 为文本,但仅仅这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行 为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型,随后行里的含有文本的数据仍然变空。 
  另一个改进的措施是IMEX=1与注册表 值TypeGuessRows配合使用,TypeGuessRows 值决定了ISAM 驱动程序从前几条数据采样确定数据类型,默认为“8”。可以通过 修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的该注册表值来更 改采样行数。但是这种改进还是没有根本上解决问题,即使我们把IMEX设为“1”, TypeGuessRows设得再大,例如1000,假设数据表有 1001行,某列前1000行全为纯数字,该列的第1001行又是一个文本,ISAM驱动的这种机制还是让这列的数据变成空。

在sql server用法

SELECT * 
FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0‘,
‘Data Source="E:\数据.xls";
User ID=Admin;Password=;Extended properties=‘‘Excel 8.0;HDR=YES;IMEX=1‘‘‘)

-----------------------------------------------------------------------

在项目中加入如下代码,自动修改注册表!

RegistryKey reg_TypeGuessRows = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Jet\4.0\Engines\Excel");
reg_TypeGuessRows.SetValue("TypeGuessRows", 5000);

原文地址:https://www.cnblogs.com/Jayson-yang/p/11504122.html

时间: 2024-10-14 11:10:19

导入Excel时,会丢失一些手机号,或者固定电话号的相关文章

导入Excel时编码格式的备忘录

今天妹妹在做计算机二级的题目,是让将"员工信息.csv"导入到Excel, 导入时让选择字符集,选项有:GB18030,GB2312,GB2312-80: 以前也没关注过字符集的情况,百度了下几个字符集的区别,建议选择GF18030,因为有姓名字段,防止有生僻字,但标准答案是GF2312-80. 又有一道题目是将"员工档案.txt"导入excel,但是这个题目的标准答案就是GB18030. 随后查询了csv格式的系统默认编码为GB2312. txt文件的编码格式有四

java导入excel时处理日期格式(已验证ok)

在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171.如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理.正确的处理方法是先判断单元格的类型是否则NUMERIC类型,然后再判断单元格是否为日期格式,如果是的话, 创建一个日期格式,再将单元格的内容以这个日期格式显示出来.如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了.具体代码如下:

java导入excel时遇到的版本问题

java中读取excel文件时对不同的版本提供了不同的读取方法,这就要求我们在读取excel文件时获取excel文件的版本信息从而通过不同的版本去使用不同的读取方式, 在WorkbookFactory.create()函数中,做过对文件类型的判断,所以我们如果想通过修改文件后缀去创建对应的Workbook对象是行不通的,我们看一下源码是如何判 判断笨笨类型从而创建对应的对象的: public static Workbook create(InputStream inp) throws IOExc

导入EXCEL时的日期转换

1 /// <summary> 2 /// 读取EXCEL中的日期进行转换 3 /// </summary> 4 /// <param name="objValue"></param> 5 /// <returns></returns> 6 private DateTime ConvertExcelDateTime(object objValue) { 7 if (objValue is DateTime) 8 {

报表工具如何实现多次导入Excel

很多人在开发报表的时候会遇到将多张表样相同的excel导入到模板,然后提交至数据库中.但问题是很多情况,在线导入不支持一次性选择多个excel,一次只能选择一个excel,也不能将多个excel中的数据在不提交入库的前提下导入到模板中,即如果在导入excel之前,web页面里面有数据,导入excel之后会覆盖之前的数据. 那这样的问题是不是无法解决呢? 解决的思路是利用FineReport自定义一个excel导入按钮,在点击该按钮的时候将上一次导入到模板中的数据进行提交,同时刷新页面,让页面恢复

sqlserver 导入excel

安装完office2013和sqlserver2017时,不知道是盗版问题还是啥 原因, 在sqlserver导入excel时,报错. 在把Excel导入SQL server时出现“未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ”该怎么办 网上查了好多路子,大同小异,数次下载安装重启后仍不行.后来发现必须安装2007版的,2007版的,2007版的  重要事情说三遍 下载地址 https://dl.pconline.com.cn/download/1059627.htm

java通过poi包导入Excel

使用Apache POI包导入Excel时是需要根据行和列取到对应的值,因此取值时需要知道该列所对应的值应存放到对象的那个字段中去,表格出现变动就会变的比较麻烦,因此此处使用自定义注解的方式,在对象中标明该属性所对应的表头,从程序中遍历表头找到与之对应的单元格,方便数据的导入. 所需的jar包:(用了一下工具类,因此多导入了两个包) <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&

Excel自文本导入内容时如何做到单元格内换行

前言:今天在处理数据的时候,在数据库中用到了\n换行符号,目的是在同表格内做到数据多行显示,比如  字段名1  字段名2  字段名3  1 数据一行 数据二行 数据三行 例子是在sql查询后的结果   2 例子如上  数据未导出  本来在sql查询后是如此显示的,但是后来导出文本格式,Excel自文本导入内容时就会报错,那么问题来了, 如何做到Excel自文本导入内容时如何做到单元格内换行? 正文:在网上找了很多例子,其中有位前辈讲的很有道理,原话如下: excel实现自动换行的两个必要条件1.

c#操作excel导入导出时同时向用户表插入账户与密码

<><><><>本代码源于师兄<><><><><><> 1:首先需要在前端显示界面View视图中添加导入Excel和导出Excel按钮: @using (Html.BeginForm()) { } 这里注意,导出Excel是通过获取当下的表单的方式来导出数据的. 2:然后为导入Excel添加导入方法function: js部分以图片存放 3:添加点击事件后弹出来的操作界面(importe