使用 OleDB 读取 Excel 文件返回格式错误的 UPC 编号

Posted

技术标签:

【中文标题】使用 OleDB 读取 Excel 文件返回格式错误的 UPC 编号【英文标题】:Reading Excel file with OleDB returns UPC numbers in wrong format 【发布时间】:2014-02-18 12:01:02 【问题描述】:

我必须在 Web 应用程序中使用 OleDB 读取 Excel 文件并将数据保存在数据库中。

使用 DataAdapter 或 OleDbDataReader 访问文件并读取它是有效的。我需要指定 IMEX=1 和 TypeGuessRows=0 因为文件中的数据有我需要解析的标题,但它们不在第一行。所以基本上,我需要阅读这些行,直到我遇到一个已知的标题,然后开始解析它之后的所有数据。

在第一列中,UPC 编号的值如下:5053366261702 但即使字段被读取为文本,OleDbDataReader 也会以科学的方式返回数字,如下所示:5.05337E+12

如果我不将这些行作为文本读取,则数字会正确返回,但标题会消失。

我添加了代码的重要部分。提前感谢您的帮助。

string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'";
using (OleDbConnection objConn = new OleDbConnection(conn))

      objConn.Open();
      var exceltables = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[]  null, null, null, "TABLE" );
      var tablename = exceltables.Rows[0]["TABLE_NAME"];
      using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "]", objConn))
      
            using (OleDbDataReader reader = objCmdSelect.ExecuteReader())
            
                while (reader.Read())
                
                    string abc = reader[0].ToString(); //do some parsing
                
                                
      

【问题讨论】:

【参考方案1】:

我找到了适合我的解决方案。我现在用两个不同的连接字符串打开文件。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='filename.xlsx';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'

第一个获取标题,当我找到它们时,我保存行号并使用 IMEX=0 再次打开文件。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='filename.xlsx';Extended Properties='Excel 12.0;HDR=No;IMEX=0;ImportMixedTypes=Text;TypeGuessRows=0'

string connHeaders = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'";
string connData = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=0;ImportMixedTypes=Text;TypeGuessRows=0'";

int dataStartRow = 0;
string tablename = "";

#region Open file to find headers
using (OleDbConnection objConn = new OleDbConnection(connHeaders))

    objConn.Open();
    var exceltables = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[]  null, null, null, "TABLE" );
    tablename = exceltables.Rows[0]["TABLE_NAME"].ToString();
    using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "] ", objConn))
    
        using (OleDbDataReader reader = objCmdSelect.ExecuteReader())
        
            while (reader.Read())
            
                if (reader[0].ToString().ToLower() == "upc")
                
                    for (int i = 0; i < reader.FieldCount; i++)
                    
                        //find all necessary headers
                    
                    break;
                
                dataStartRow++;
            
        
    

#endregion

#region Open file again to read data
using (OleDbConnection objConn = new OleDbConnection(connData))

    objConn.Open();
    using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "] ", objConn))
    
        using (OleDbDataReader reader = objCmdSelect.ExecuteReader())
        
            for (int i = 0; i < dataStartRow; i++) reader.Read();
            while (reader.Read())
            
                //read the line to save it in Database
            
        
    

【讨论】:

【参考方案2】:

我有一个适合我的简单答案。

File.WriteAllText(file, Regex.Replace( File.ReadAllText(file), "(?<=,)([0-9]12,)(?=,)", "\"$1\""));

这是有效的,因为它会在任何 12 位或更多位的字段周围加上双引号,这是科学记数法出现的时候。

【讨论】:

以上是关于使用 OleDB 读取 Excel 文件返回格式错误的 UPC 编号的主要内容,如果未能解决你的问题,请参考以下文章

Excel、OleDb 和前导零

我应该通过 OleDb Jet4.0 读取一个 excel 文件并保存到数据集中吗?

使用 OLEDB 数据提供程序读取 excel 文件

使用OLEDB读取Excel文件

使用 OLEDB 从 Excel 中读取数据

C#ListView控件OleDb方法读取EXCEL