Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询时忽略Excel格式_C#_Excel_Winforms - Fatal编程技术网

C# 查询时忽略Excel格式

C# 查询时忽略Excel格式,c#,excel,winforms,C#,Excel,Winforms,我正在使用C#从Excel导入一组数据。问题是Excel试图通过提供字段格式来“帮助”。这会导致我的应用程序显示不正确的数据 例如,Excel中的列是“百分比”列。在这种情况下,“百分比”列用于存储完成率,但除了百分比之外,它还可以有文本值,如“已完成”、“未开始”、“已终止”。但当我在Excel表格中加载时,百分比变成数字(100%变成1,50%变成0,5等等),文本值变成空白 是否有一种方法可以强制从excel文件中获取平面文本,而忽略任何格式 使用的代码是: str

我正在使用C#从Excel导入一组数据。问题是Excel试图通过提供字段格式来“帮助”。这会导致我的应用程序显示不正确的数据

例如,Excel中的列是“百分比”列。在这种情况下,“百分比”列用于存储完成率,但除了百分比之外,它还可以有文本值,如“已完成”、“未开始”、“已终止”。但当我在Excel表格中加载时,百分比变成数字(100%变成1,50%变成0,5等等),文本值变成空白

是否有一种方法可以强制从excel文件中获取平面文本,而忽略任何格式

使用的代码是:

            string ExcelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + FileName + ";Extended Properties=Excel 12.0;";

            OleDbConnection_Excel = new OleDbConnection(ExcelConnectionString);
            OleDbConnection_Excel.Open();               
            Datatable_CheckSheet = OleDbConnection_Excel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            if (Datatable_CheckSheet == null)
            {
                MessageBox.Show("No Data Found");
            }
            else
            {
                OleDbDataAdapter OleDbDataAdapter_FillCommand;
                DataTable DataTable_ExcelImport;

                OleDbDataAdapter_FillCommand = new OleDbDataAdapter("select * from [" + Datatable_CheckSheet.Rows[0]["TABLE_NAME"].ToString() + "]", OleDbConnection_Excel);
                DataTable_ExcelImport = new DataTable();
                OleDbDataAdapter_FillCommand.Fill(DataTable_ExcelImport);
                                    BindingSource BindingDataSource_ExcelView = new BindingSource
                {
                    DataSource = DataTable_ExcelImport
                };
                datagridview1.AutoGenerateColumns = false;
                datagridview1.DataSource = BindingDataSource_ExcelView;
            } 

由于Excel不像其他数据库那样具有真正的模式,因此驱动程序会查看第一行数据以“猜测”列的数据类型。如果数据的前几行都是数字,则会将整个列视为数字

将扩展属性IMEX=1添加到连接字符串中,以将所有数据视为文本(字符串):


注意,这会将所有列视为字符串列,即使所有数据都是数字,因此可能需要您没有进行的额外解析;之前不需要,但它阻止驱动程序仅供参考,这不是Excel帮助(它甚至不参与该过程),而是OLEDB提供商试图确定数据类型。还有,据我所知,没有可靠的方法可以避免这种情况。@Rory有时候我真的很讨厌这样的自动帮助。。。即使是在基础excel中:| spreadshseet将单元格设置为GeneralFormat,excel在其中猜测格式。解决方案是将常规单元格格式更改为特定格式,以便excel驱动程序(JET或ACE)不会猜测。然后您需要添加OleDbConnection参数和每个字段的类型。这没有任何区别:它至少显示了字符串值吗?您可能仍然需要解析和重新格式化数值。不,就像它显示转换后的值之前一样(100%变为1,无百分比字符串为空)@A.bakker尝试在扩展属性周围加引号-我在回答中更新了示例。编辑之前已经这样做了,看到它抛出了错误。可能与Excel文件本身有关:/
";Extended Properties=""Excel 12.0;IMEX=1"""