过程:

  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();
      */

    }

在每天黄金时刻将数据库中数据获取包装成Excel表的更多相关文章

  1. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  2. 在mysql数据库中制作千万级测试表

    在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...

  3. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

  4. sqlserver将数据库的数据导成excel文档方法

    sqlserver将数据库的数据导成excel文档方法 最近公司需要下载uniport的数据跟之前的数据进行对比,所以避免不了需要将数据库的数据导出来,把SQLServer表中的数据导出为Excel文 ...

  5. 在MySQL数据库中创建一个完整的表

    1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器) use t1; //t1是数据库名 如图所示: 2.在此数据库中建立数据库表 2.1 先建立表结构(可以理解为表的列名,也就是字段名)在实 ...

  6. sql搜索数据库中具有某列的表

    在接口中明明有某个节点,但在数据库中却找不到,为此本人写了一个sql,以供快速查找. Select distinct syscolumns.name,sysobjects.name from sysc ...

  7. NPOI从数据库中导出数据到Excel

    首先要添加NPOI.dll程序集 https://yunpan.cn/cMeSTELJSXmJJ  访问密码 8d83 把里面的程序集都添加到引用里 下面的代码是从数据库导出到Excel { //pa ...

  8. 统计一个数据库中,无记录的表的sql语句

    SQL Server数据库中统计无记录数的表 大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称. /************************************ ...

  9. FM同步数据库中结构已经发生变化的表

    接触Cognos很久了,最近遇到一个小问题. 在FM模型设计的过程中,有一张表jd_f_order.之后为了更全面的分析这个数据,在这个事实表中引入了一个新的字段商品类型字段,结构如图 但是由于jd_ ...

随机推荐

  1. Vue 变化检测问题

    受现代Javascript的限制,Vue不能检测到对象属性的添加和删除,因为Vue在初始化时将属性转为getter/setter,所以属性必须在data对象上才能让Vue转换它,Vue不允许在已经创建 ...

  2. B. Vanya and Food Processor【转】

    B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes input s ...

  3. 洛谷 - P3786 - 萃香抱西瓜 - 状压dp

    重构一下就过了,不知道之前错在哪里. #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull ...

  4. 将字符串中的字符按Z字形排列,按行输出

    示例1: Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR" 示例2: Pyth ...

  5. ZOJ3166【找环值最小】

    题意: 给你一幅图,要你找一个hotel能够满足出去回来,而且保证权值最小: 思路: 可以搜环,然后取最小权值环,拿个点: floyd方便,初始话自己到自己就是无穷,然后就枚举一下给出的hotel就好 ...

  6. Codeforces Round #375 (Div. 2)【A,B【模拟】,D【DFS】】

    PS_B:阿洗吧!B题卧槽数组开了250... PS_D:D题主要挂在了50*50口算得了250,数组开小,然后一开始还错了.= =哎,以后对于数据范围还是注意一点: 卧槽,这场可真二百五了... A ...

  7. 聊聊IT行业加班的问题

    IT行业(包括互联网行业)是快速发展的行业,有时候一家公司同时可能要开发多个项目,并发进行,在公司开发人员相对固定的情况下,要想在指定的时间内完成项目谈何容易. 项目多.任务重.需求的不明确.技术难关 ...

  8. NDAP 日志

    2014.04.29 1.理论债券价格CalculateExpetedBondPrice计算有误差 CalculateLibrary中的计算理论债券价格(计算理论期货价格的反函数)和正确结果有误差(可 ...

  9. 进击python第一篇:相遇

    1.第一句Python代码 在 当前目录下创建 hello.py 文件,内容如下: print "hello,world!" 执行 hello.py 文件,即: python he ...

  10. 如何在Linux服务器上部署禅道

    最近换了新的项目团队,由于新团队比较年轻化,没有实行正规的项目管理,于是我自告奋勇要为团队管理出一份力,帮助团队建立敏捷化的项目管理,经过多方考究和对比后,选择了目前较受欢迎的开源项目管理软件:禅道. ...