java查询sql导出到excel方法

1、首先,我们需要知道的是:可以直接使用sql语句(命令行)查询之后导出到excel
mysql -uroot -ppassword -e
"select * from XXX " tase_db > /home/A.xls

准备篇:
2、实验室的需求,需要每天执行一次查询语句,并且输出到excel中,因此有两个变量,第一个是每次调用都需要的前一天的unix时间戳,第二个是excel名必须为20180126这种日期的格式。
3、sql语句参数的传入比较麻烦。因此考虑使用java来将参数写好再使用命令行调用sql语句。
4、并且,本次还需要实现每天一次 定时调用,因此考虑使用java来实现定时调用

实现(挫折)篇
4、首先,我在网上找了一个每天执行一次的java代码。在具体实现里面更换成:使用 Runtime.getRuntime().exec(cmd);方法直接调用命令行。
5、对于动态的参数,首先是前一天的时间戳,需要先获得现在的时间戳:calendar.getTimeInMillis() 然后除以1000后 减掉一天的秒数86400
前一天的日期格式:String xls = "" + calendar.get(Calendar.YEAR) + calendar.get(Calendar.MONTH) + (calendar.get(Calendar.DAY_OF_MONTH)-1);
6、命令行 cmd = "mysql -uroot -ppassword -e \"select B.store_display_name,B.app_name,B.version,B.url from tase_app_android_unofficial_checksum A,tase_app_android_unofficial_visualization B WHERE A.loaded_time/1000 >" + yesterday_time + " and A.app_id = B.app_id\" tase_db > /home/softsec/crawler-report/" + xls + ".xls";
7、使用命令行调用 Process proc = Runtime.getRuntime().exec(cmd);
proc.waitFor();

8、然后使用maven将这个java代码封装成jar包,再放进linux系统中。使用java -jar 执行jar包

发现跑了之后 不会生成excel表,原因是:命令行中有 > 这个符号 ,这是一个重定向符号,会生成管道,而Runtime.getRuntime().exec在需要生成管道的时候会失效。

改进篇
9、改进的思路就是,把跑命令行改成,将命令行写进shell脚本,用命令跑shell脚本。
10、需要看到资料:1、shell脚本实现sql 2、shell传入参数
11、最后的shell脚本:(crawler.sh)
#!/bin/bash
mysql -uroot -ppassword --default-character-set=gbk -e "select B.store_display_name,B.app_name,B.version,B.url from tase_app_android_unofficial_checksum A,tase_app_android_unofficial_visualization B WHERE A.loaded_time/1000 > $1 and A.app_id = B.app_id" tase_db >> /home/softsec/crawler-report/$2.xls
12、更改的cmd代码:
String cmd = "sh crawler.sh " + yesterday_time + " " + xls;

补充篇
13、还有一个问题,就是把 excel从linux取出来,打开后会发现 中文乱码
14、原因是因为mysql导出的excel编码 默认是utf-8,而windows的excel默认是gbk
15、解决方案:如上面改进篇的shell脚本中, 在前面添加一句 --default-character-set=gbk即可

你可能感兴趣的:(运维,java,sql,excel)