您的位置:首页 > 编程语言 > Java开发

java实现从数据库读取数据写入excel,写入多个sheet,6万数据耗时100秒附近

2017-11-24 16:48 1166 查看
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class JDBCUtil2 {
//24小时导出一次数据
public static final long PERIOD=24*60*60*1000;
public static final SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//excel行的最大值
public static final double maxRow=10000;
public static int totalData=0;
//设置一个定时器
/*
//public static void setTimer(){
public static void main(String[] args) {
try {
new Timer().scheduleAtFixedRate(new TimerTask() {
public void run() {
exportData();
}
//},sdf.parse("2017-11-23 10:56:50"), 10000);
//每天24点导出一次数据
},sdf.parse("2017-11-23 00:00:00"), PERIOD);
} catch (ParseException e) {
e.printStackTrace();
}
}
*/
public static void main(String[] args) {
//public static void exportData() {
new Thread(new Runnable() {
public void run() {
while(true) {
System.out.println("当前时间:"+sdf.format(new Date()));
try {
Thread.sleep(10000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
//读取数据库总数据量,赋值给静态变量,避免频繁读取数据库
getTotal();
long l1=System.currentTimeMillis();
String[] title=getHeadString();
List<String[]> bigList= readDate(title);
if(bigList.size()<=0) {
System.out.println("表中没有数据");
}else {
writeExcel(bigList,title);
long l2=System.currentTimeMillis();
System.out.println("数据导出消耗时长:"+(l2-l1)/1000+"s");
}

}
public static int getTotalSheet() {
//totalData=getTotal();
int totalSheet=(int)Math.ceil(totalData/maxRow);
return totalSheet;
}
//设置表头
public static WritableCellFormat getHeader() {
// 定义字体
WritableFont font = new WritableFont(WritableFont.TIMES, 10,
WritableFont.BOLD);
try {
// 黑色字体
font.setColour(jxl.format.Colour.BLACK);
} catch (WriteException e1) {
e1.printStackTrace();
}
WritableCellFormat format = new WritableCellFormat(font);
try {
// 左右居中
format.setAlignment
4000
(jxl.format.Alignment.CENTRE);
// 上下居中
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
// 黑色边框
format.setBorder(Border.ALL, BorderLineStyle.THIN, jxl.format.Colour.BLACK);
// 黄色背景
format.setBackground(jxl.format.Colour.YELLOW);
} catch (WriteException e) {
e.printStackTrace();
}
return format;
}
//创建文件,获取数据,写入excel
public static void writeExcel(List<String[]> list,String[] title) {
String fileName = "D:\\demo/data2.xls";
Label label;
//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
try {
WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName));
File dbfFile = new File(fileName);
if (!dbfFile.exists() || dbfFile.isDirectory()) {
dbfFile.createNewFile();
}
int sheets=getTotalSheet();//创建多少个sheet
//写入数据
for(int i=0;i<sheets;i++) {
WritableSheet ws = wwb.createSheet("列表" + (i + 1), i);  //创建一个可写入的工作表
//添加表头
for(int j=0;j<title.length;j++) {
label = new Label(j, 0, title[j], getHeader());
ws.setColumnView(j, 20);
ws.addCell(label);
}
//设置单元格属性
WritableCellFormat wc = new WritableCellFormat();
// 设置居中
wc.setAlignment(Alignment.CENTRE);
// 设置边框线
wc.setBorder(Border.ALL, BorderLineStyle.THIN);
int num =(int)(i * maxRow);
int index = 0;
for (int m = num; m <list.size(); m++) {
if (index == maxRow) {//判断index == mus的时候跳出当前for循环
break;
}
String[] arrData = list.get(m);
for (int k = 0; k < arrData.length; k++) {
ws.setColumnView(k, 20);
//System.out.println("arrData=>"+k+"="+arrData[k]);
//new Label(0, 0, "This is a Label cell",wcfF);
//第一个是代表列数, 第二是代表行数,第三个代表要写入的内容,第四个是可选项,是输入这个label里面的样式
ws.addCell(new Label(k, index+1, arrData[k]));
}
index++;
}
}
wwb.write();//从内存中写入文件中
System.gc();
wwb.close();//关闭资源,释放内存
} catch (Exception e) {
e.printStackTrace();
}
}
//获取链接
public static  Connection getConnection() {
Connection conn=null;//创建一个数据库链接
System.out.println("开始尝试链接数据库");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");//加载Oracle驱动
String url="jdbc:oracle:thin:@localhost:1521:XE";
String user="system";
String password="password";
conn=DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭链接
public static void closeConn(Connection conn) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//查询出来所有的数据条数
public static void getTotal() {
Connection conn=getConnection();
String sql="SELECT COUNT(1) AS COUNT FROM TEST04 ";
PreparedStatement ps;
int num=0;
try {
ps = conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
num=rs.getInt("COUNT");
};

} catch (SQLException e) {
e.printStackTrace();
}
//System.out.println(num);
closeConn(conn);
totalData=num;
//return num;
}
//读取数据
public static List<String[]> readDate(String[] title) {
Connection conn=getConnection();
List<String[]> list =new ArrayList<String[]>();
String[] p=null;
String sql="SELECT T.* from TEST04 T";
try {
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while(rs.next()) {
p=new String[71];
for(int k=0;k<title.length;k++) {
p[k]=rs.getString(title[k]);
}
list.add(p);
}
System.out.println("数据读取完毕");
} catch (SQLException e) {
e.printStackTrace();
}
//关闭链接
closeConn(conn);
return list;
}
public static String[] getHeadString() {
String[] title= {
"ID             ".trim()
,"A_ID           ".trim()
,"A_NAME         ".trim()
,"A_GENDER       ".trim()
,"A_CARDID       ".trim()
,"A_ADDRESS      ".trim()
,"A_PHONENUM     ".trim()
,"A_COMPANY      ".trim()
,"A_LASTCOMPANY  ".trim()
,"A_LEADER       ".trim()
,"A_BIRTHDAY     ".trim()
,"A_SALARY       ".trim()
,"A_SCHOOLE      ".trim()
,"A_SKILL        ".trim()
,"A_QQNUMBER     ".trim()
,"B_ID           ".trim()
,"B_NAME         ".trim()
,"B_GENDER       ".trim()
,"B_CARDID       ".trim()
,"B_ADDRESS      ".trim()
,"B_PHONENUM     ".trim()
,"B_COMPANY      ".trim()
,"B_LASTCOMPANY  ".trim()
,"B_LEADER       ".trim()
,"B_BIRTHDAY     ".trim()
,"B_SALARY       ".trim()
,"B_SCHOOLE      ".trim()
,"B_SKILL        ".trim()
,"B_QQNUMBER     ".trim()
,"C_ID           ".trim()
,"C_NAME         ".trim()
,"C_GENDER       ".trim()
,"C_CARDID       ".trim()
,"C_ADDRESS      ".trim()
,"C_PHONENUM     ".trim()
,"C_COMPANY      ".trim()
,"C_LASTCOMPANY  ".trim()
,"C_LEADER       ".trim()
,"C_BIRTHDAY     ".trim()
,"C_SALARY       ".trim()
,"C_SCHOOLE      ".trim()
,"C_SKILL        ".trim()
,"C_QQNUMBER     ".trim()
,"D_ID           ".trim()
,"D_NAME         ".trim()
,"D_GENDER       ".trim()
,"D_CARDID       ".trim()
,"D_ADDRESS      ".trim()
,"D_PHONENUM     ".trim()
,"D_COMPANY      ".trim()
,"D_LASTCOMPANY  ".trim()
,"D_LEADER       ".trim()
,"D_BIRTHDAY     ".trim()
,"D_SALARY       ".trim()
,"D_SCHOOLE      ".trim()
,"D_SKILL        ".trim()
,"D_QQNUMBER     ".trim()
,"E_ID           ".trim()
,"E_NAME         ".trim()
,"E_GENDER       ".trim()
,"E_CARDID       ".trim()
,"E_ADDRESS      ".trim()
,"E_PHONENUM     ".trim()
,"E_COMPANY      ".trim()
,"E_LASTCOMPANY  ".trim()
,"E_LEADER       ".trim()
,"E_BIRTHDAY     ".trim()
,"E_SALARY       ".trim()
,"E_SCHOOLE      ".trim()
,"E_SKILL        ".trim()
,"E_QQNUMBER     ".trim()};
return title;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐