过程:
1.由Timer对象实现安排指定的任务在指定的时间进行重复的固定的延迟操作
a.设定时间间隔24小时:PERIOD_DAY = 24 * 60 * 60 * 100;
b.指定每天执行操作的时间:本文中设置时间使用Calendar对象,其中Calendar.HOUR_OF_DAY 与 Calendar.HOUR(一天12制)不同的是,其是24制的,对应一天24小时。
c.比较当前时间与设置时间的前后
d.执行操作:timer.schedule("任务对象","执行时间","时间间隔");
代码:
public class TimerManager {
//设置时间间隔24小时 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; public TimerManager() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY,14); calendar.set(Calendar.MINUTE, 28); calendar.set(Calendar.SECOND, 0); Date date=calendar.getTime(); //判断当前时间与设置时间的前后,如果当前时间在设置时间之后, //将设置时间日期往后推迟一天,以当前时间为准 。 if (date.before(new Date())) { date = this.addDay(date, 1); } Timer timer = new Timer(); RunTimerTask task = new RunTimerTask(); //任务对象 //执行操作 timer.schedule(task,date,PERIOD_DAY); } // 增加或减少天数 public Date addDay(Date date, int num) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, num); return calendar.getTime(); } }
2.将数据打包成Excel表
a.获取数据:
b.创建Excel表:创建Excel表具有的层次,如下:
工作薄 --> 数据表 --> 数据行 --> 单元格
WebBook --> Sheet --> Row --> Cell
c.向Excel表中输入数据:输入数据时,可分为表头与表身两部分,本文都是使用动态设置数据
输入表头时,从数据库中获取数据,可使用getMetaData()方法:tableHeader = resultSet.getMetaData();
输入表身时,需要利用类的反射机制,获取实体类的各种属性。
代码:
public class RunTimerTask extends TimerTask {
private static SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); CustomerManagerImpl customerManagerImpl = new CustomerManagerImpl(); @Override public void run() { try { // 第一步,创建一个webbook,对应一个Excel文件 HSSFWorkbook wb = new HSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet("客户数据表"); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short HSSFRow row = sheet.createRow((int) 0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
String[] columnNames = getColumnNames();
for (int i = 0; i < columnNames.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(columnNames[i]); cell.setCellStyle(style); } //从数据库中获取数据 List<Customer> customerList = getCustomerData(); Iterator<Customer> iterator = customerList.iterator(); //设置迭代器 int index = 0; while (iterator.hasNext()) { index++; row = sheet.createRow(index); Customer customer = (Customer) iterator.next(); // 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx方法得到属性值//因此为了与直接从数据库获取到的表头数据相对应,需要JavaBean中各属性get方法与数据库中各字段顺序一样。
Field[] fields = customer.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { HSSFCell hssfCell = row.createCell(i); Field field = fields[i]; String fieldName = field.getName(); // 获取getXxx()方法相对应的方法名字符串 String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); // 获取类字段属性值 Object value = customer.getClass().getMethod(methodName, new Class[] {}) .invoke(customer, new Object[] {});String textValue = null;
//可进行各种类型判断,并进行各种转换if (value instanceof Boolean) {
boolean bText = (Boolean) value; textValue = "男"; if (!bText) { textValue = "女"; } } else { textValue = value.toString(); } HSSFRichTextString hssfRichTextString = new HSSFRichTextString( textValue); hssfCell.setCellValue(hssfRichTextString); } }return wb;
/* * 将Excel文件保存到本地 * FileOutputStream fout = new * FileOutputStream("F:/Users/shymain/customer.xls"); * wb.write(fout); fout.close(); */}