【问题标题】:Reading Excel file with OleDB returns UPC numbers in wrong format使用 OleDB 读取 Excel 文件返回格式错误的 UPC 编号
【发布时间】: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
                }
            }                    
      }
}

【问题讨论】:

    标签: c# excel oledb number-formatting oledbconnection


    【解决方案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 位或更多位的字段周围加上双引号,这是科学记数法出现的时候。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多