C#将ODS文件转换为DataSet时报外部表格式错误如何解决
ODS转DataSet报错「外部表不是预期的格式」解决方法
问题根因
你当前使用的Microsoft.Jet.OLEDB.4.0/Microsoft.ACE.OLEDB.12.0连接串配置错误,配置的Extended Properties为Excel 8.0/Excel 12.0,是专门用于读取xls/xlsx格式Excel文件的参数,无法识别ODS(OpenDocument电子表格)格式,因此触发格式不匹配报错。且Jet 4.0驱动本身完全不支持ODS格式读取,不存在可用的Jet连接串适配ODS。
可行解决方案
方案1:修正ACE OLEDB连接串适配ODS格式
该方案需要运行环境安装2010及以上版本的Microsoft Access Database Engine,64位环境正确连接串如下:connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + location + @";Extended Properties=""ODS 12.0;HDR=YES;IMEX=1"";";参数说明:
ODS 12.0:声明数据源为ODS格式,是解决当前报错的核心配置HDR=YES:识别第一行为表头IMEX=1:强制混合数据按文本读取,避免列类型识别异常
注意不要硬编码工作表名(比如你代码里写的[sheet1$]),读取前先查询schema获取实际工作表名,避免表名不匹配报错:
connection.Open(); DataTable sheetSchema = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string firstSheetName = sheetSchema.Rows[0]["TABLE_NAME"].ToString(); selectCommand.CommandText = $"SELECT * FROM [{firstSheetName}]";另外要保证程序编译目标平台(x86/x64)和环境安装的ACE驱动版本一致,否则会触发驱动未注册的报错。
方案2:使用专用表格解析库(生产环境推荐)
OLEDB方案依赖系统安装的驱动,部署兼容性差,推荐直接通过Nuget安装ExcelDataReader和ExcelDataReader.DataSet两个包,无需依赖任何Office/Access系统组件,原生支持ODS格式读取,32/64位环境通用,示例代码:using (FileStream fs = File.OpenRead(location)) { // 初始化ODS读取器 using (var reader = ExcelReaderFactory.CreateOpenDocumentReader(fs)) { // 直接读取为DataSet,第一行作为列名 DataSet ds = reader.AsDataSet(new ExcelDataSetConfiguration() { ConfigureDataTable = _ => new ExcelDataTableConfiguration() { UseHeaderRow = true } }); // 后续直接使用ds即可对接你原有的存储过程导入逻辑 DataTable dt = ds.Tables[0].Clone(); } }
注意:不要尝试把ODS文件后缀改成xls/xlsx再用Excel连接串读取,会直接损坏文件结构,依然会报格式错误。
内容的提问来源于stack exchange,提问作者Zaveed Abbasi
相关产品推荐
相关产品推荐

