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; } }
相关文章推荐
- java SpringMVC中 POI读取数据库数据并写入Excel表格中,并实现下载功能
- phpexcel 读取含多个sheet的excel,将从数据库中检索出的数据分别写入该excel不同的sheet中 并导出该excel
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
- java从Excel文件读取数据到数据库和从读取数据库数据写入Excel
- java实现excel数据重新写入数据库
- ObjectARX中调用ADO封装类实现数据库查询读取写入数据的一个类实例
- NPOI组件实现EXCEL大数据的读取和写入
- 从数据库读取数据写入excel并调用Winrar加密压缩输出
- poi+jdbc实现从数据库中导出表的数据字典结构(单个sheet和多个sheet供你选择),并且生成excel文档,作者:vipyhd
- java将数据库数据写入到Excel中
- Java读取Excel文件并写入数据库
- 将后台数据读取到前台的EXCEL文件中去,用javascript实现,asp.net,javacript(发一个原创)
- Java实现Excel导入数据库,数据库中的数据导入到Excel
- 将EXCEL的数据读取出来写入数据库的实例方法
- Java读取、写入、处理Excel文件中的数据
- JAVA实现数据库数据导入/导出到Excel(POI)
- 将Excel上传到服务器,读取Excel数据写入到数据库
- 使用Apache POI创建Excel,并从数据库中读取数据写入到Excel文件中
- poi 学习之使用 Apche poi 读取数据库中的数据并写入Excel
- ObjectARX中调用ADO封装类实现数据库查询读取写入数据的一个类实例