Aas.Net上傳Excel讀取時丟失數據的問題

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程 本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。 阅读详情

Aas.Net上傳Excel讀取時丟失數據的問題

2008-09-20 17:30:58
摘要:研究了ISAM驱动限制,分析了在.NET中采用Microsoft.Jet.OLEDB读取Excel文件产生数据丢失的原因,给出了解决此问题的方法。 
  关键词:Excel;数据访问;Ole DB;ISAM 
  中图分类号:TP 311.1文献标识码:A 文章编号:1009-3044(2007)04-10937-02 
   
  1 引言 
  在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产业链ASP协同商务平台”中遇到了类似需求。某汽车整车生产企业需要将其车辆发车信息发布到汽车产业链平台上去,其数据为内部ERP系统生成的Excel数据表,用户首先将该数据表上传至汽车产业链平台,平台将此Excel数据读取导入到平台内部的SQL Sever数据库中,以供其它应用使用。汽车产业链平台的开发使用的开发工具为VS.NET,使用的语言是C#,在开发的过程中发现使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。本文就对此问题产生的根源进行了分析并给出了相应的解决方法。 
   
  2 问题描述 
  Excel是Microsoft公司的电子表格处理软件,在现代办公及企业信息化的应用中使用非常广泛,正因如此,在程序设计中我们经常要通过访问Excel文件来获得数据,但Excel文件不是标准数据库[1]。 
  ASP.NET也是Microsoft公司的产品,作为.NET FrameWork框架中的一个重要组成部分,其主要用于Web设计。我们在.NET中访问读取Excel数据时一般采用Microsoft.Jet.OLEDB.4.0[2]。现以读取一个Excel文件auto.xls中sheet1工作表为例,工作表的内容如表1所示。 
  表1 sheet1表的数据内容 
  现将该表的数据内容读取并显示到到DataGrid中,简化的代码如下: 
  String ConnStr = " Provider = Microsoft.Jet.OLEDB.4.0; DataSource=c:/auto.xls;Extended Properties='Excel 8.0;HDR=YES';"; 
  OleDbConnection Conn=new OleDbConnection(ConnStr); 
  Conn.Open(); 
  string SQL="select * from [sheet1$]"; 
  OleDbDataAdapter da=new OleDbDataAdapter(SQL,ConnStr); 
  DataSet ds=new DataSet(); 
  da.Fill(ds); 
  DataGrid1.DataSource=ds; 
  DataGrid1.DataBind(); 
  Conn.Close(); 
  但是运行以上代码的结果并不是期望的,它将显示为表2所示的内容。可以发现第一个字段中为“1042”的两个数据项变为空。 
  表2 DataGrid1所显示的数据内容 
  有程序设计人员将以上代码OleDbConnection连接字符串中的Extended Properties一项作了如下改动,Extended Properties='Excel 8.0;HDR=NO;IMEX=1’,认为可以解决此问题。由于在开发“汽车产业链协同商务平台”中碰到过类似问题,作了大量的测试后发现,添加IMEX=1后并未实质上解决此问题。表现为:如果某字段前8条记录中全部为纯数字的话,那么在该字段随后的记录中含有字母或汉字的项将仍然变为空,但是如果该字段前8条记录中有一条不为纯数字,将能得到预期想要的结果。 
   
  3 问题分析 
  产生这种问题的根源与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驱动的这种机制还是让这列的数据变成空。 
   
  4 解决方法 
  从以上的分析中可以得知,当某列数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可避免的,要解决这个问题只能考虑采用其它数据读取方法。 
  在.NET中读取Excel文件的另外一种方法是回到使用传统COM组件,这种方法在很多技术文章或论文中都有涉及,本文不作赘述。需要指出的是,使用COM组件来读取Excel文件数据的效率较低,在作释放的时候有可能碰到不可预知的错误,特别开发Web应用的程序应该慎重使用。  

本文提出另外一种利用读取CSV纯文本格式解决此问题的方法。 
  (1)在读取Excel的.xls类型的文本数据之前,先将其转换为.csv格式,在Excel中直接另存为这种格式就可以达到转换的目的。CSV文件又称为逗号分隔的文件,是一种纯文本文件,它以“,”分隔数据列,本文表1的数据表用CSV格式存储后用纯文本编辑器打开的表现形式如表3所示。 
  表3 采用CSV格式保存的表1数据 
  需要指出的是,CSV文件也可以用Ole DB或ODBC的方式读取,但是如果采用这些方式读取其数据又会回到丢失数据的老路上,ISAM机制同样会发挥作用。 
  (2)采用普通的读取文本文件的方法打开文件,读取第一行,用“,”作为分隔符获得各字段名,在DataTable中创建对应的各字段,字段的类型可以统一创建成“String”。 
  
本文原文
  (3)逐行读取数据行, 用“,”作为分隔符获得某行各列的数据并填入DataTable相应的字段中。 
  实现的简化代码如下: 
  String line; 
  String [] split = null; 
  DataTable table=new DataTable("auto"); 
  DataRow row=null; 
  StreamReader sr=new StreamReader("c:/auto.csv",System.Text.Encoding.Default); 
  //创建与数据源对应的数据列 
  line = sr.ReadLine(); 
  split=line.Split(','); 
  foreach(String colname in split){ 
  table.Columns.Add(colname,System.Type.GetType("System.String")); } 
  //将数据填入数据表 
  int j=0; 
  while((line=sr.ReadLine())!=null){ 
   j=0; 
   row = table.NewRow(); 
   split=line.Split(','); 
   foreach(String colname in split){ 
   row[j]=colname; 
   j++;} 
   table.Rows.Add(row);} 
   sr.Close(); 
  //显示数据 
  dataGrid1.DataSource=table.DefaultView; 
  dataGrid1.DataBind(); 
   
  5 结语 
  在应用程序的设计中,需要访问Excel数据的情况非常普遍,本文以在.NET中对访问含有混合类型数据的Excel表格拟采取的方法进行探讨。当然,如果不存在混合类型的数据使用Microsoft.Jet.OLEDB为较佳方案。对于不是使用.NET开发的情况,本论文的分析和所提供的方法亦可参考。 
Google Earth Engine——使用STARFM 图像融合算法将Landsat 和 MODIS 融合得出2000-2023 NDVI长时序图(空间分辨率为 30 米、时间分辨率为 16 天) 非本地入侵物种是全球生态系统面临的主要威胁之一。野葛(Pueraria montana)是一种生长迅速的藤本植物,原产于亚洲,现已入侵美国一些地区,因此该物种的管理成为一个重要问题。利用 Landsat 和 MODIS 平台收集的数据,计算了 2000 年至 2015 年肯塔基州三个侵扰地点的归一化差异植被指数(NDVI)估算值。使用 STARFM 图像融合算法将大地遥感卫星和 MODIS 得出的 NDVI 结合成空间分辨率为 30 米、时间分辨率为 16 天的时间序列。 阅读详情

相关推荐

国土变更调查中六类拓扑错误的成因分析与高效修复实践

本文深入分析了国土变更调查中六类拓扑错误的成因,包括边界不一致和不规则图形等常见问题,并提出了高效的自动化修复实践。通过智能咬合算法、引力-斥力平衡模型等核心技术,显著提升了修复效率,节省人工质检时间70%。文章还分享了实战中的避坑指南和黄金法则,为相关从业人员提供了宝贵经验。

weixin_29202213的博客 359

Excel讀入dataset數據丟失的問題!

 摘要:研究了ISAM驱动限制,分析了在.NET中采用Microsoft.Jet.OLEDB读取Excel文件产生数据丢失的原因,给出了解决此问题的方法。   关键词:Excel;数据访问;Ole DB;ISAM   中图分类号:TP 311.1文献标识码:A 文章编号:1009-3044(2007)04-10937-02      1 引言   在应用程序的设计中,经常需要读取Excel数据或将

蝸牛的窩窩 1190

想发故障诊断论文?手把手教你用CWRU数据集复现第一个Baseline模型

本文提供了一份基于CWRU轴承数据集的故障诊断Baseline模型实战指南,手把手教你从数据准备到模型构建的全流程。通过详细的Python代码示例和学术级实验设计,帮助初学者快速复现第一个故障诊断模型,为发表高质量论文奠定基础。

weixin_28681255的博客 428

excel单个字段字数过多(内容过多),导入数据库 存在截断问题的解决方法

4、找到 TypeGuessRows 修改为 0。2、打开注册表(搜索框输入 regedit)1、关闭所有office软件。来源:微软官方技术方案。修改后,最好重启电脑。

哇咔咔的博客 6905

windows10下Boost的安装与初试

https://blog.csdn.net/s_lisheng/article/details/72871218 https://blog.csdn.net/yockie/article/details/8856190?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-12.vipsorttest&depth_1-utm_source=dis

焦露的博客 6393

STM32CubeMX定时器配置

因为只有当 CH2 处于 输入模式 时,硬件才能把这根脚送进滤波器(TI2FP2通道之前要滤波),再生成 TI2FP2 这条支路供 Slave-Mode 控制器使用,也就是说TI2FP2 并不是“独立存在”的,但在CubeMX配置时:如下图,我们只设置Slave Mode和TI1FP1,之后,CH1就自动配置为 Input Capture 了,下图发现,Channel1只能 Input Capture 或者Disable。哪来的主定时器和从定时器呢?把待测 PWM 的高电平当“门”,连接到ETR。

2402_89015641的博客 3183

C# 知识点记录

C# 知识点 1、decimal 表示128位数据类型 同浮点型相比,decimal类型具有更高的精度和更小的范围,使其更适合于财务与货币运算。 2、动态程序集 没有被编译至主程序,而是主程序在运行时动态调用或者生成的程序集。 C#加载程序集的机制: 一个C#应用程序在遇到当前应用程序域(AppDomain)里没有的程序集时,会自动搜索与应用程序在同一目录里的所有程序集,如果没有,抛出异常。 所以如果当我们的动态程序集放到和应用程序在同一个目录里时,不会产生序列化和反序列化的问题,而一旦我们把各种功能的程序

女孩子与计算机 281

计算机视觉教程1-1:透视空间与透视变换

在生活中,透视现象很常见,其物理本质是光的直线传播。由于人眼与相机在捕获图像时均存在透视现象,因此计算机几何基于透视空间进行研究。本节介绍透视变换原理

FRIGIDWINTER的博客 3090

C# OLEDB方式读取EXCEL,空值或值不完整问题解决

有时EXCEL有数据,但读取不完整,或都干脆为空,经测试,更改链接字符串,引用更高版本的引擎就好。 通常,我们在网上查到的字箱串如下: strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + strExcelFilePath + ";Extended...

Welcome to Garywang's IT BLOG. 3571

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

WEB浏览器视频流播放方案

基于Media Source Extensions播放视频流 浏览器播放视频的几种方法 一、H5 video标签 在浏览器播放视频,可以使用HTML5原生的video标签。但其播放的格式使用一定限制的,目前video只支持三种格式WebM、Ogg、MP4。 WebM:WebM 文件使用 VP8 视频编解码器和 Vorbis 音频编解码器 Ogg :Ogg 文件使用 Theora 视频编解码器和 Vorbis音频编解码器 MP4: MPEG 4文件使用 H264 视频编解码器和AAC音频编解码器 上面三种

machh的专栏 2381

ADO中GetCollect()函数获取EXCEL表格中完整数字的方法

ADO是一组由微软提供的COM组件,基于面向对象思想的编程接口。它建立在COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼,由三个主要对象Connection、Command、Recordset和几个辅助对象组成。 我们利用ADO技术的GetCollect...

weixin_34109408的博客 297

Windows 下运行 openclaw 出现“‘openclaw‘ 不是内部或外部命令,也不是可运行的程序或批处理文件“的解决方案

方案适用场景推荐指数检查并手动添加 PATH明确知道全局安装目录,只是没加进PATH⭐⭐⭐⭐⭐pnpm setup 自动配置使用 pnpm 安装,想要省心的自动化方式⭐⭐⭐⭐⭐npx 免安装临时运行快速验证核心程序是否正常,排除法排查⭐⭐⭐⭐清理残留后重装npm/pnpm 混用导致版本混乱⭐⭐⭐⭐改用 WSL2不熟悉 Windows 路径体系,长期使用⭐⭐⭐'openclaw' 不是内部或外部命令这类报错,本质上不是"程序坏了",而是。

一键难忘的博客 1万+

Aas.Net上传Excel读取时丟失数据的问题(转)

最近用到excel导入导出问题,发现这个文章很有用,转载一下! 摘要:研究了ISAM驱动限制,分析了在.NET中采用Microsoft.Jet.OLEDB读取Excel文件产生数据丢失的原因,给出了解决此问题的方法。   关键词:Excel;数据访问;Ole DB;ISAM

AC007 900

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Aas.Net上传Excel文档数据丢失的解决办法(转)

<br />2008-09-20 17:30:58<br />摘要:研究了ISAM驱动限制,分析了在.NET中采用Microsoft.Jet.OLEDB读取Excel文件产生数据丢失的原因,给出了解决此问题的方法。<br />  关键词:Excel;数据访问;Ole DB;ISAM <br />  中图分类号:TP 311.1文献标识码:A 文章编号:1009-3044(2007)04-10937-02 <br /><br />1 引言<br />  在应用程序的设计中,经常需要读取Excel数据或将Exc

shandianfeng的专栏 815

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

excel 读出的值为空 解决方案

明明看到Ecxel中有值,读出来的确是空值 null ,很奇怪吧。1。excel的连接字串中的扩展属性必须包含IMEX=1;2.修改注册表中的HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows的值为0。TypeGuessRows的系统默认值为8,表示系统从文件中的前8行数据中采样取得数据类型。如果前

libinlink的专栏 3133

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

1、问题出现       在开发应用程序的过程中,比较常用一功能就是通过oledb驱动读取excel、csv、text等文件;而最近有客户反映,在使用短信平台(下载地址:http://www.sms1086.com/product/detail-150.html),发现出现以下问题:     还有一种情况,excel只能导入部分,而其他的导入不进去。     而其他excel或text文件,不会...

weixin_34384557的博客 417

C#操作Office杂谈

操作两个Access数据库 从Excel导入数据 从Word导入数据

LazyLion2010的专栏 787

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007测试文件:D:/97-2003.xls和D:/2007.xlsx,两个文件的内容是一模一样的。测试环境:SQL Server 2000 / 2005。 接口类型 语法一览 注册表设置 单一数据类型列的类型解析 混合数据类型列的自然解

Limpire 1万+

从Excel导入SQL Server时的一个错误

用导入数据向导,将Excel文件导入到SQL Server数据库,头一回遇到这种错误: “作为源列XXX的数据对于所指定的缓冲区来讲太大”,如图所示:    查了一下,结果如下: 修改服务器的注册表:    HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel   下    双击右边的"Typ

sizheng0320的专栏 837

利用OleDb导入Excel数据丢失问题及解决方法

在开发的应用中,对于Excel数据导入,一直都利用OleDb,以前都收到用户反馈有啥问题。但这几天搞一个项目,也用到了这个东西,还在测试阶段就发现出了问题:经常会出现某一字段不允许有空值。按常规的认识,肯定是该行中某列的数据没有填写,但检测Excel表,并未发现有此情况。然后就是各种折腾,最终发现是该单元格被莫名置为空值了。所以开始一直怀疑是Excel表或程序有问题,实际是方向不对,从网上搜到一篇

程序呓语 3466

Excel导入,数字+文本,文本无法识别的解决方案

很多人都知道这个解决方案,不过本人比较菜,找了很久才知道,发现网上的解决方案都是都要结合起来才能,就整理了一下,大大路过,不要喷我,这是俺整理的,加上自己的实践         在导入Excel时,会有一个非常有趣的现象,就是数字的识别问题,当Excel中的某一列同时存在纯文本列与纯数字列时,非常有可能出现文本能导入而数字无法导入或者数字能导入而文本无法导入,本人经过多次试验发现,主要在于E

Hunk HUi 9753

OLEDB方式读取Excel丢失数据的原因和解决方法(转)

OLEDB方式读取Excel丢失数据的原因和解决方法(转)

mhx123456789的博客 287

Excel 有資料,但匯入到資料庫後卻是 NULL;設定登錄機碼 TypeGuessRows、連線字串 IMEX

Excel 有資料,但匯入到資料庫後卻是 NULL;設定登錄機碼 TypeGuessRows、連線字串 IMEX

只是記錄 1536

数据处理之以OLEDB方式读取Excel数据丢失的原因及解决方法

1.引言 在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,C#读取Excel的方式有两种,一种是通过OLEDB方式读取,另一种为通过COM组件方式读取。近段时间有客户反映,读取到程序中的Excel表,出现部分数据丢失的情况,笔者在此采用的是第一种方式读取(第二种读取比较慢,且不易控制),于是检查代码还有各种找资料,终于解决了该问题,在此记录导致丢失的原因...

weixin_30815427的博客 687
上一篇: Sql server 2005 connection string
下一篇: c#中 uint--byte[]--char[]--string相互转换汇总
msikruby
博客等级 码龄19年 11粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值