之前进行开发了一段小程序,开发过程中发现短短白来行的代码需要用到很多的知识现在进行总结
先贴代码,后面做详细的解释
代码语言:javascript复制public class ImportData {
static SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
static DecimalFormat decimalFormatter = new DecimalFormat("###.##");
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@10.16.67.55:1526:ehrtst2";
conn = DriverManager.getConnection(url, "hrmidea", "Midea2014");
stmt = conn.createStatement();
FileInputStream sourceFile = new FileInputStream("C:\Users\hp\Desktop\total.xls");
POIFSFileSystem poiFileSystem = new POIFSFileSystem(sourceFile);
HSSFWorkbook workBook = new HSSFWorkbook(poiFileSystem, true);
sourceFile.close();
HSSFSheet sheet = workBook.getSheetAt(0);
System.out.println(sheet.getLastRowNum());
// for(int i = 2; i<90; i ){
for(int i = 2; i<sheet.getLastRowNum(); i ){
HSSFRow row = sheet.getRow(i);
String empName = getCellValue(row.getCell((short)0)); //员工姓名
String empCode = getCellValue(row.getCell((short)1)); //员工工号
String worktime = getCellValue(row.getCell((short)2)); //科技工时
String source = getCellValue(row.getCell((short)3)); //来源
String beginDate = getCellValue(row.getCell((short)4)); //开始时间
Date enddateTemp = formater.parse("2015-05-31");
String endDate= formater.format(enddateTemp);
String msg = empName "t" empCode "t" worktime "t" source "t" beginDate "t";
//System.out.print(msg);
String sql1 = "select c_employeeid, c_code, c_name, c_employeestatus, c_unitid, c_unitname, c_jobid, c_jobname, c_joborder from tb_inf_employee_0526 where c_code='" empCode "'";
rs = stmt.executeQuery(sql1);
if(rs.next()){
BigDecimal empid = (BigDecimal)rs.getObject("c_employeeid");
String name = (String)rs.getObject("c_name");
String employeestatus = (String)rs.getObject("c_employeestatus");
BigDecimal unitid = (BigDecimal)rs.getObject("c_unitid");
String unitname = (String)rs.getObject("c_unitname");
BigDecimal jobid = (BigDecimal)rs.getObject("c_jobid");
String jobName = (String)rs.getObject("c_jobname");
String jobOrder = (String)rs.getObject("c_joborder");
if(beginDate!=null&&beginDate.length()>1){
//System.out.println("");
//todo
}else{
if(!"0".equals(worktime)){
Date date = formater.parse("2015-06-01");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
BigDecimal bigDecimal = new BigDecimal(worktime).setScale(0, BigDecimal.ROUND_HALF_UP);
calendar.add(2,-bigDecimal.intValue());
date = calendar.getTime();
beginDate = formater.format(date);
//System.out.println(beginDate);
//todo
}
}
String sql2 = "insert into TB_INF_TECPERSONINFO_0526 (C_OID,C_EMPOID,C_OPERATETIME,C_OPERATOR,C_BEGINDATE,C_ENDDATE,C_UNITID,C_UNITNAME,C_JOBID,C_JOBNAME,C_JOBORDER,C_JOBSENIORITYACC) VALUES (hibernate_sequence.nextval," empid.longValue() ",sysdate,0,to_date('" beginDate "','yyyy-mm-dd'),to_date('" endDate "','yyyy-mm-dd')," unitid.longValue() ",'" unitname "'," jobid.longValue() ",'" jobName "','" jobOrder "',0)";
stmt.addBatch(sql2);
}else{
msg = "根据工号找不到对应员工;";
}
}
stmt.executeBatch();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(Exception e2){
e2.printStackTrace();
}
}
}
public static String getCellValue(HSSFCell hssfCell){
String cellValue = null;
if (hssfCell != null) {
switch (hssfCell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC :
if (HSSFDateUtil.isCellDateFormatted(hssfCell))
cellValue = formater.format(hssfCell.getDateCellValue());
else
cellValue = decimalFormatter.format(hssfCell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING :
cellValue = hssfCell.getStringCellValue().trim();
break;
case HSSFCell.CELL_TYPE_FORMULA :
if (!Double.isNaN(hssfCell.getNumericCellValue())) {
if (HSSFDateUtil.isCellDateFormatted(hssfCell))
cellValue = formater.format(hssfCell.getDateCellValue());
else
cellValue = decimalFormatter.format(hssfCell.getNumericCellValue());
} else if (!hssfCell.getStringCellValue().equals("")) {
cellValue = hssfCell.getStringCellValue().trim();
} else {
// 存在不可识别的数据格式
throw new InfoCenterException(InfoCenterExceptionType.UNKNOWNDATATYPEEXCEPTION,
new Object[]{String.valueOf(hssfCell.getCellNum() 1)});
}
break;
case HSSFCell.CELL_TYPE_BLANK :
cellValue = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN :
cellValue = String.valueOf(hssfCell.getBooleanCellValue());
break;
default :
//存在不可识别的数据格式
throw new InfoCenterException(InfoCenterExceptionType.UNKNOWNDATATYPEEXCEPTION,
new Object[]{String.valueOf(hssfCell.getCellNum() 1)});
}
}else {
//单元格为空时,返回空串
cellValue = "";
}
return cellValue;
}
}
第一个函数是主函数,主要用于读取excel的内容,然后根据empCode在数据库中查询一些资料,再对excel的时间进行一些处理,最后将处理过的内容放到一个新的数据库中
由于是单独的java demo,为了方便测试,首先是对数据库进行链接,按照驱动,URL,用户名,密码,和statement的方式进行链接
最后,加入了关闭数据库链接的语句,这里主要是为了养成良好的习惯
然后对excel的导入进行了code,这里提一句用poi在ssh中是比较常见的,
excel的导出可以参考http://blog.csdn.net/evangel_z/article/details/7332535
ecel的导入可以参考http://sarin.iteye.com/blog/845035
这里我们对比上文可以看到
读入有两种方式:
一种是
excelFile = new File(filePath); InputStream is = new FileInputStream(excelFile);// 获取文件输入流 HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 一种是 FileInputStream sourceFile = new FileInputStream("C:\Users\hp\Desktop\total.xls"); POIFSFileSystem poiFileSystem = new POIFSFileSystem(sourceFile); HSSFWorkbook workBook = new HSSFWorkbook(poiFileSystem, true); sourceFile.close(); 两者的不同,第二种必须是excel文件,而第一种可以是其他文件,第二种方法第四种要加入进来
http://www.yiibai.com/apache_poi/apache_poi_core_classes.html这里写了HSSFWorkbook不同构造函数的区别
接下来就是按照getCellValue(HSSFCell hssfCell)函数读取每行每列的数据,这里需要提到的是这个函数,可以对不同的类型进行转码
第一个case是对区分日期和真正的数字
第二个case是字符串
第三个是对应公式即CELL_TYPE_FORMULA
第四个是空格
第五个是布尔类型
这个函数可以作为读取excel的工具类
之后的sql1是用于查询语句,纯sql语句,用stmt.executeQuery(sql1)来执行,大数据的话用批量执行,具体参考之前的博文
之后就是最重要的日期转换,按照客户需求,如果读取的列里面没有开始时间,则设定结束时间为2015-05-31,开始时间为结束时间减去worktime(单位为月)
如果有开始时间则不更改开始时间,结束时间也为2015-05-31
这里就涉及到日期的增减,具体功能实现的步骤如下
static SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); 建立一个格式,通过函数getCellValue(HSSFCell hssfCell)可以把excel里面的时间读取成这个格式,
然后进行逻辑判断,如果没有开始时间,则设定结束时间,具体代码如下
Date date = formater.parse("2015-06-01"); //设定data Calendar calendar = Calendar.getInstance(); calendar.setTime(date); //转换成日期格式
下一步应该用结束时间减去worktime,在处理这里时发现,worktime可能为小数,根据要求要四舍五入,这里运用了下面的方法
BigDecimal bigDecimal = new BigDecimal(worktime).setScale(0, BigDecimal.ROUND_HALF_UP);
上面的0代表保留的位数,后面代表四舍五入
具体四舍五入和保留小数位数的方法可以参考,里面还有凑整等一系列的方法
http://www.cnblogs.com/xd502djj/archive/2011/07/21/2112683.html
最后进行减去,并转换回data
calendar.add(2,-bigDecimal.intValue()); 2代表减月份 date = calendar.getTime(); 转换会时间 beginDate = formater.format(date); 转换成相应的string
日期的加减可参考http://blog.csdn.net/liwenfeng1022/article/details/6534176/
最后拼接成sql进行插入
String sql2 = "insert into TB_INF_TECPERSONINFO_0526 (C_OID,C_EMPOID,C_OPERATETIME,C_OPERATOR,C_BEGINDATE,C_ENDDATE,C_UNITID,C_UNITNAME,C_JOBID,C_JOBNAME,C_JOBORDER,C_JOBSENIORITYACC) VALUES (hibernate_sequence.nextval," empid.longValue() ",sysdate,0,to_date('" beginDate "','yyyy-mm-dd'),to_date('" endDate "','yyyy-mm-dd')," unitid.longValue() ",'" unitname "'," jobid.longValue() ",'" jobName "','" jobOrder "',0)";
这里面涉及到序列代码,当前时间,时间插入,字符,数组,等方式,是个很好的案例,第一个为序列值,数据库为oracle的命令,mysql会有点不同 stmt.addBatch(sql2);
为批量插入,具体可以参考之前的博文