在每天黄金时刻将数据库中数据获取包装成Excel表
过程:
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表的更多相关文章
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- 在mysql数据库中制作千万级测试表
在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...
- python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...
- sqlserver将数据库的数据导成excel文档方法
sqlserver将数据库的数据导成excel文档方法 最近公司需要下载uniport的数据跟之前的数据进行对比,所以避免不了需要将数据库的数据导出来,把SQLServer表中的数据导出为Excel文 ...
- 在MySQL数据库中创建一个完整的表
1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器) use t1; //t1是数据库名 如图所示: 2.在此数据库中建立数据库表 2.1 先建立表结构(可以理解为表的列名,也就是字段名)在实 ...
- sql搜索数据库中具有某列的表
在接口中明明有某个节点,但在数据库中却找不到,为此本人写了一个sql,以供快速查找. Select distinct syscolumns.name,sysobjects.name from sysc ...
- NPOI从数据库中导出数据到Excel
首先要添加NPOI.dll程序集 https://yunpan.cn/cMeSTELJSXmJJ 访问密码 8d83 把里面的程序集都添加到引用里 下面的代码是从数据库导出到Excel { //pa ...
- 统计一个数据库中,无记录的表的sql语句
SQL Server数据库中统计无记录数的表 大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称. /************************************ ...
- FM同步数据库中结构已经发生变化的表
接触Cognos很久了,最近遇到一个小问题. 在FM模型设计的过程中,有一张表jd_f_order.之后为了更全面的分析这个数据,在这个事实表中引入了一个新的字段商品类型字段,结构如图 但是由于jd_ ...
随机推荐
- hibernate VS mybatis
1: 一般来说,业务逻辑比较简单,集增删改查就可以满足需求,建议使用hibernate,而复杂的业务逻辑,尤其是多表关联查询,建议使用mybatis. 2: hibernate有更好的二级缓存机制,可 ...
- Linux系统如何查看版本信息?
查看版本号 我在Ubuntu下做测试 1 命令行执行 cat /etc/issue (切记cat后要空一格)即可看到版本信息. 2 登录linux,在终端输入 cat /proc/version ...
- Flutter实战视频-移动电商-28.列表页_商品列表后台接口调试
28.列表页_商品列表后台接口调试 主要调试商品列表页的接口 这个接口是最难的因为有大类.小类还有上拉加载 先配置接口 config/service_url.dart //const serviceU ...
- PL/SQL 的 事务处理
原文连接 http://blog.csdn.net/lhl6688/article/details/42874109 BEGIN DECLARE V_COUNT INTEGER; -- 表中记录 ...
- HDU2846【字典树】
题意: 百度. 思路: 一个串的插入只能搞出这个串的前缀,然而对于要query的串是子串,所以插入的时候暴力插入所有字母开头的串.... 然后还要注意到自己的串本身会叠加字典树中的前缀,要标记掉. # ...
- 换装demo时美术遇到的问题详解
1.武器替换:MAX的东西进Unity,根骨骼X轴会有270度的旋转. 解决方法:由程序强制武器进入Unity后的旋转角度. 2.蒙皮问题:face和hair等脖子以上部位蒙皮的时候,导入Unity后 ...
- unity3d easytouch教程
http://www.taikr.com/group/6/thread/1987 说一说easytouch的简单使用方法,和移动平台上的rpg游戏一样,我们肯定也不陌生,我们经常玩游戏的时候用的都是虚 ...
- C++函数返回值与引用
对于函数的返回值,看似简单,但并非如此,比如: int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况? 首先,func将返回值 ...
- [Xcode 实际操作]七、文件与数据-(21)ARKit增强现实框架的使用
目录:[Swift]Xcode实际操作 本文将演示ARKit增强现实框架的使用. 创建一个新的项目:[Create a new Xcode project] ->在打开的模板选择中,选择增强现实 ...
- Peptidomics analysis of milk protein-derived peptides
released over time in the preterm infant stomach
(文献分享一组-陈凌云)
题目:Peptidomics analysis of milk protein-derived peptides released over time in the preterm infant st ...