做完Data Conversion(数据转换)后的总结

Data Conversion
    刚参加工作,公司分派给我的第一个任务是做Data Conversion(数据转换),说准确点就是编写控制台程序将excel文件中的数据导入到数据库中。公司提供给了我六种模板的excel文件,就是说我的程序需要做六种操作才能完成所有的任务。
    由于我以前没有Data Conversion和操作Excel文件的实际经验,所以同事们帮了我很多忙,在网络上也找了不少资料。现在任务暂时告一个段落了,我想应该总结一下经验,也给其他做这个的朋友一些参考。
    接到任务的前一两天,同事告诉我,让我看一下相关的资料。我在网络上找了好久,也找到了很多。发现这种转换有两种方法:一种是使用Excel.dll组件展开来做的;一种是用类似sql语句来做的。前一种方法很复杂,而且我找到的资料都大同小异,都只是简单介绍怎么使用组件中封装的类,对于如何将一个范围内的数据读取出来然后做处理的,我觉得就只一个参考代码有用。后一种相对就简单多了,没有使用那么复杂的类。同事给了我一些参考代码,用的是后一种方法。我也就很快上手了。
    一个星期,我就做好了4个模板的代码,还包括做了一些单元测试。但是,事情并不那么简单。编写这个代码,实际上没有什么技术含量,需要的只是对模板、数据库设计和一些逻辑的理解。做着做着,我就这样想。可是第二个星期,我发现问题越来越多,我要修改我的代码,有三天晚上要加班到9点。问题出在哪里?经验。
    经验1.做异常处理。之前写程序,很少去想把哪些代码try-catch一下,基本上很少写。我自己做单元测试,debug时并没有问题,拿给测试人员测试一下,程序都崩溃了。我个郁闷呐,仲哥给我说怎么不处理异常,我无言以对。我恨死异常了!我就加异常吧,可是这面try一下,那里try一下,里面try一下啊,外面try一下,整个代码难看死了。最后总结了一下,一般最外面放一个try,然后,在循环里面,为了不让循环里的代码出现异常而跳出,在循环里面放一个。这样就可以了,不那么臃肿了!
    经验2.小心copy。嗨,做这个Data Conversion给仲哥和小罗找了不少麻烦呢。自己的代码检查不仔细,逻辑不严密,异常又没有做好处理,经常出错,他们还要陪我一起加班。虽然有多了模板,但是代码还是有相同或相似的,所以就copy代码,这样一来,自己的逻辑就很容易散。数据很有可能被丢掉,这是很大的错误。我很吃亏!
    经验3.程序重要的是稳定的功能,而不是好看,或者用到高级的技术。这是老鸟告诉我的。客户并不懂代码,只要程序稳定,不出差错,客户就会很满意了。所以,必要是还是要硬编码。
    经验4.操作excel数据应该注意的问题。
 1>从excel读取数据时,excel文件很有可能没有关闭,这样就可能抛异常。同所有数据库操作一样,数据库最后都应该关闭。(见代码1)
 2>从excel读取工作表名时,一定要注意,用GetOleDbSchemaTable()方法读取出的表有许多是不需要的。特别是当excel文件数据中用到了统计或者其他一些高级处理,就会出现一些你看不到的工作表名。处理这个时我很苦恼,我不知道最后怎么用程序判断哪个是我需要读取的表明。通过这次的Data Conversion, 在仲哥的带领下,总结了一下最好的获取这个真正需要的工作表(sheet)的方法(见代码2)。这里是这样的一个规律:用GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null)方法读取出的表名与工作表名有关,它是 'sheetname$' 这样的构成。
 3>从excel读取出的数据,如果是时间的话,要注意。我调式程序的时候发现,如果读取的数据对应的单元格被设定为时间格式的话,它可能今天读取的是一个时间字符串,明天就是一个double值的字符串了。这是要用单独的方法做处理的。(见代码3)。还有就是区域的问题,用DateTime.parse(datestring)时,本地机器使用区域设置是美国或者中国,获得是时间是有天壤之别的。一般的数据的话,要注意删除英文逗号。

 

/// 代码1


        /// get data from Excel into DateSet
        ///

        /// excel filepath
        /// sheet name(like 'lee$')
        ///
        public DataSet createDataSet(string file, string name)
        {
            DataSet ds = new DataSet();

            string strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + file + ";Extended Properties=/"Excel 8.0;HDR=Yes;IMEX=1;/"";
            using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strConnString))
            {
                try
                {
                    if (conn.State != ConnectionState.Open)
                    {
                        conn.Open();
                    }
                    string sqlSelect = "select * from [" + name + "]";
                    System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(sqlSelect, conn);
                    adapter.Fill(ds, "ds");
                }
                catch (Exception ex)
                {
                    common ocm = new common(ConfigurationSettings.AppSettings["rootPath"], "false");
                    ocm.logClass("Exception");
                    ocm.logMessage(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            return ds;
        }

/// <summary>代码2
        /// Get Excel sheets' Name
        /// </summary>
        /// <param name="filepath">Excel filepath</param>
        /// <returns>array of sheetsname(like 'lee$')</returns>
        public string[] GetSheetNames(string filepath)
        {
            OleDbConnection objConn = null;
            DataTable dt = null;

            try
            {
                // Connection String. Change the excel file to the file you will search.
                String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
                // Create connection object by using the preceding connection string.
                objConn = new OleDbConnection(connString);

                // Open connection with the database.
                if (objConn.State != ConnectionState.Open)
                {
                    objConn.Open();
                }
                // Get the data table containg the schema guid.
                dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if (dt == null)
                {
                    return null;
                }
               
                List<string> namelist =new List<string>();
                foreach (DataRow row in dt.Rows)
                {
                    string tbName = row["TABLE_NAME"].ToString();
                    if (tbName.Contains("$"))
                    {
                        string[] temp = tbName.Replace('/'', ' ').Trim().Split('$');
                        if (temp.Length == 2 && temp[1] == string.Empty)
                        {
                            namelist.Add(temp[0] + "$");
                        }
                    }
                }              

                return namelist.ToArray();
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                if (objConn != null)
                {
                    objConn.Close();
                    objConn.Dispose();
                }
                if (dt != null)
                {
                    dt.Dispose();
                }
            }
        }
/// 代码3<summary>
        /// Get Date from Excel Cell
        /// </summary>
        /// <param name="str">it may be double or date like '2008-6-4'</param>
        /// <returns></returns>
        public DateTime SetExcelDateCell(string str)
        {
            DateTime date = DateTime.Now;
            try
            {
                date = DateTime.FromOADate(double.Parse(str));
            }
            catch (Exception e)
            {
                try
                {
                    date = DateTime.Parse(str);
                }
                catch
                {
                    throw new Exception("is not in date fomat.");
                }
                
            }
            return date;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值