设计系统不单单要考虑到录入界面,对哪些用户已经保存的数据文件(基本上都是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
批量导入指定文档数据不单单解决了用户再次录入数据的工作量,也体现了设计的合理性,更系统变得更人性化,这样设计出来的系统,客户能不爱上它吗?