java 保留小数与四舍五入以及时间日期的转换和excel读入与数据库写入
2015-05-27 10:53
549 查看
之前进行开发了一段小程序,开发过程中发现短短白来行的代码需要用到很多的知识现在进行总结
先贴代码,后面做详细的解释
由于是单独的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);
为批量插入,具体可以参考之前的博文
先贴代码,后面做详细的解释
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 b5f0 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);
为批量插入,具体可以参考之前的博文
相关文章推荐
- java 日期的格式化、解析、数据库相关操作、获取系统时间、String与Date的转换
- java和数据库之间的日期和时间转换
- java和数据库之间的日期和时间转换
- C#:org.in2bits.MyXls 文本格式日期 转换,以及设置单元格格式,保留两位小数点
- java和数据库之间的日期和时间转换
- Java日期时间以及日期相互转换
- JAVA,jsp,oracle获取系统当前时间以及日期格式转换!
- Java日期时间,以及相互转换
- java日期、时间以及数据库映射处理
- Java转换Json日期/Date(1487053489965+0800)/格式以及js时间格式 Tue Feb 14 2017 14:06:32 GMT+0800
- Java:对double值进行四舍五入,保留两位小数的几种方法
- java double类型保留小数和四舍五入
- java时间的转换以及时间的比较
- Java中四舍五入保留两位小数或不保留小数
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
- Java:对double值进行四舍五入,保留两位小数的几种方法
- java8新特性lambda表达式, 函数式接口以及Steam流和新的日期时间例子代码
- 保留两位小数:数据库字段类型NUMBER,Java字段类型Double类型
- js中Date日期格式转换以及时间和毫秒之间的转换
- java 四舍五入保留小数