Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 575|回复: 0

通过oledb驱动读取excel、csv数据丢失解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-1 15:26:29 | 显示全部楼层 |阅读模式

    1、问题出现

          在开发应用程序的过程中,比较常用一功能就是通过oledb驱动读取excel、csv、text等文件;而最近有客户反映,在使用短信平台(下载地址:http://www.sms1086.com/product/detail-150.html),发现出现以下问题:

    image

        还有一种情况,excel只能导入部分,而其他的导入不进去。

        而其他excel或text文件,不会出现此类问题。但是将有问题的excel粘贴到新建的文件中,还会出现类似问题。

    2、网上解答

        在博客园http://www.cnblogs.com/clare-zhang/archive/2012/05/30/2525884.html给出了解决方案:

        查询注册表,将TypeGuessRows=8 修改为 TypeGuessRows=0

        下图是Win10 64位企业版的修改位置,操作系统不通,修改地方不通;建议查询注册表,修改所有TypeGuessRows为0

    QQ图片20170218184340

        按照此方法,可解决Excel数据丢失问题。棒棒的~~~~~~~~

    3、读取Text文件数据丢失

        Excel文件问题解决了,但是在读取csv、text文件,仍然出现数据丢失的问题,是什么原因引起的呢?与excel对比,不难发现,还是注册表配置的问题。

        通过查询注册表,找到Text的驱动:

    image

        修改MaxScanRows=0即可解决问题。

    4、TypeGuessRows详解

        要使用 Jet OLE DB 提供程序访问 Excel 工作簿,请使用具有下列语法的连接字符串:

        Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\sms.xls;Extended Properties="Excel 8.0;HDR=YES;"

        在连接字符串中,用 Data Source 参数指定工作簿的完整路径和文件名。Extended Properties 参数可包含两种属性:一个属性用于 ISAM 版本,一个属性用于指示表是否包括标题。
        使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(F1 表示第一个字段,F2 表示第二个字段,依此类推)。

        与传统的数据库不同,在 Excel 表中没有指定列的数据类型的直接方式。而是,OLE DB 提供程序通过对一列中的八行进行扫描来猜测 该字段的数据类型。您可以通过为连接字符串的扩展属性中的 MAXSCANROWS 设置指定一个一 (1) 至十六 (16) 之间的值,来更改要扫描的行数。

        而注册表中TypeGuessRows=8,默认从前8行进行扫描来猜测该字段的数据类型,设置TypeGuessRows=0表示不猜测数据类型。

    5、MaxScanRows详解

        与Excel注册表参数雷同,MaxScanRows=19(16进制)表示从前25行进行扫描猜测该字段的数据类型。

        在不修改注册表的情况下,可通过以下连接字符串实现(VB代码):

    strConn = ""
    strConn = strConn & "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFolder & ";"
    strConn = strConn & "Extended Properties="
    strConn = strConn & Chr(34)
    strConn = strConn & "text;CharacterSet=UNICODE;HDR=Yes;FMT=Delimited;IMEX=1;MaxScanRows=0;"
    strConn = strConn & Chr(34)
     
    Set cn = New ADODB.Connection
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0" ' this line is redundant, but it helps you read the code
        .ConnectionString = strConn
        .Properties("Jet OLEDB:Registry Path") = "SOFTWARE\TacticalApps\MyApp\1.0"
        .Mode = adModeRead
        .Open
    End With

        腾信集团(www.sms1086.com)欢迎您的光临~~~

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 20:00 , Processed in 0.069008 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表