如何批量从Excel文件中导入数据到数据库(一)

设计系统不单单要考虑到录入界面,对哪些用户已经保存的数据文件(基本上都是Excel文件)难道需要用户再次将已有的数据进行录入吗?答案肯定是:No,一个好的设计和编码人员再设计系统和编码时,更多的需要考虑到界面友好,用户操作简单和设计合理,能更多的从用户的角度来分析设计系统。

下面来说说实际工作中遇到了一些问题,我们需要做如何的处理呢?

用户需求形成无非来源对客户的需求和现有文档的资料,将用户现有的文档变成要操作的界面。对于已有数据我们更倾向于用批量导入到数据库中,举个简单例子:

以医院病人为例,病人有如下信息,如何将下面的文档中内容导入数据库,需要哪些步骤来完成:

1.创建病人信息对象Patient,该对象中包含属性如下:ID(序号)、Name(姓名)、Sex(性别)、Age(年龄) and PatintID.

注:用BirthDay(DateTime)替换Age更为合理,这里仅为了说明如何从文档中读取数据,就简单用Age属性。

 /// <summary>
    /// 病人基本信息对象
    /// </summary>
    public class Patient
    {
        /// <summary>
        /// 序号
        /// </summary>
        public int ID { get; set;}
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set;}
        /// <summary>
        /// 性别
        /// </summary>
        public string Sex { get; set;}
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set;}
        /// <summary>
        /// 病人就诊卡号
        /// </summary>
        public string PatintID { get; set;}        
    }
View Code

2.用Acey.ExcelX组件进行读取文件。方法如下:

在用Acey.ExcelX组件前,需要加入Acey.ExcelX组件引用,加到命名空间中。

using Acey.ExcelX;

 /// <summary>
        /// 从指定的excel文档中获取Patient对象集合。
        /// </summary>
        /// <param name="fileName">指定的excel文档</param>
        /// <returns></returns>
        public static List<Patient> GetPatientListFromExcel(string fileName)
        {
            //创建Patient对象集合。
            List<Patient> list = new List<Patient>();
            //创建Workbook对象通过打开指定的Excel文档。
            IWorkbook workbook = ExcelxApplication.Open(fileName);
            //获取以0为基数的Worksheet对象。
            IWorksheet worksheet = workbook.Worksheets[0];
            //获取工作表中最大数据行。
            int maxRow = worksheet.MaxDataRow;
            //获取工作表中最大数据列。
            int maxCol = worksheet.MaxDataColumn;
            IRange range = worksheet.Cells.CreateRange(0, 0, maxRow, maxCol);
            DataTable table = range.ExportDataTable();

            for (int row = 0; row <= maxRow; row++)
            {
                Patient patient = new Patient();
                for (int col = 0; col <= maxCol; col++)
                {
                    ICell cell = worksheet.Cells[row, col];
                    switch (col)
                    {
                        case 0://序号
                            patient.ID = ObjectToInt(cell.Value);
                            break;
                        case 1://姓名
                            patient.Name = ObjectToString(cell.Value);
                            break;
                        case 2://性别
                            patient.Age = ObjectToInt(cell.Value);
                            break;
                        case 3://病人就诊号
                            patient.PatintID = ObjectToString(cell.Value);
                            break;
                    }
                }
                list.Add(patient);
            }
            return list;
        }
        
        /// <summary>
        /// 将Obj转换为Int类型值。
        /// </summary>
        /// <param name="obj">Obj对象。</param>
        /// <returns>返回Int类型值。</returns>
        public static int ObjectToInt(object obj)
        {
            if (obj == null) return 0;
            int value;
            int.TryParse(obj.ToString(), out value);
            return value;
        }

        /// <summary>
        /// 将Obj转换为String类型的值
        /// </summary>
        /// <param name="obj">Obj对象。</param>
        /// <returns>返回String类型值。</returns>
        public static string ObjectToString(object obj)
        {
            if (obj == null) return string.Empty;
            return obj.ToString();
        }
View Code

在这里为什么需要 patient.Name = ObjectToString(cell.Value);而不是patient.Name= cell.Value.ToString(); 如果读取文档中该单元格是空单元格,那么object obj =cell.Value;返回值obj为null,如果你直接换为ToString();就会引起空异常,为了代码严谨行还是建议用ObjectToString方式进行转换。

 3.将对象列表的信息插入到数据库中。

 1  /// <summary>
 2         /// 插入Patient对象信息到数据库中
 3         /// </summary>
 4         /// <param name="list"></param>
 5         public void Insert(List<Patient> list)
 6         {
 7             foreach (Patient patient in list)
 8             {
 9                 string strsql = "Insert into ...";
10                 //执行插入操作....
11             }
12         }
View Code


批量导入指定文档数据不单单解决了用户再次录入数据的工作量,也体现了设计的合理性,更系统变得更人性化,这样设计出来的系统,客户能不爱上它吗?

更多信息请访问Aceyoffice网站:http://www.aceyoffice.com/

 

posted @ 2013-09-10 23:27  AceyOffice  阅读(1501)  评论(0编辑  收藏  举报