为什么无法将完整Excel工作表读取到Datatable变量dtExcelData中

上图为将Excel工作表读取到Datatable变量(dtExcelData)时出现部分数据丢失问题对应的代码截图。
问题原因及对应解决方案
驱动自动推断列类型导致不匹配数据丢失
多数开发者使用OLEDB/ACE驱动读取Excel时,驱动默认仅扫描前8行内容推断列数据类型,后续行如果出现和推断类型不匹配的内容,会直接被置为空值。
解决方法:在连接字符串末尾添加IMEX=1参数,强制将混合类型列识别为文本类型读取;如果仍有问题,修改系统注册表中对应驱动的TypeGuessRows参数值为0,让驱动扫描全表内容判断列类型。隐藏行/列被过滤导致数据丢失
部分Excel读取组件默认不会读取手动设置为隐藏的行、列内容,如果你读取的工作表存在隐藏内容,会出现对应位置数据缺失的情况。
解决方法:如果使用EPPlus、NPOI等第三方组件读取,读取前调整配置,强制读取所有行、列,不受可见性限制。比如EPPlus中读取时无需额外过滤行的Hidden属性即可拿到全量数据。代码逻辑误过滤有效数据
如果你的代码中存在空行跳过、空单元格过滤的逻辑,可能会将包含特殊格式、不可见字符的有效单元格误判为空值过滤。
解决方法:逐行调试读取逻辑,查看单元格取值后转换的过程,避免转换失败直接赋值为空,也可以暂时注释掉所有过滤逻辑,验证是否是逻辑误判导致的数据丢失。公式单元格未读取计算结果
如果缺失内容的单元格是通过公式计算得到的,部分读取组件默认会读取公式文本而非计算结果,如果你没有做公式解析的逻辑,会出现对应位置数据为空的情况。
解决方法:读取前开启组件的公式计算配置,比如NPOI使用FormulaEvaluator类,EPPlus调用Calculate()方法计算全表公式后再读取单元格值。
内容的提问来源于stack exchange,提问作者Prajwal Shahu

