如何批量从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;} }
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(); }
在这里为什么需要 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 }
批量导入指定文档数据不单单解决了用户再次录入数据的工作量,也体现了设计的合理性,更系统变得更人性化,这样设计出来的系统,客户能不爱上它吗?
更多信息请访问Aceyoffice网站:http://www.aceyoffice.com/