将查询到的数据存到excel并下载

将查询到的数据存到excel并下载

jxl.jar

本程序全部是用Java EE编程的,由于是数据测试,所以没有使用jsp来操作,因为jsp的将数据库导入到Excel是同样的道理。

原理分析:首先要进行数据查询,数据查询少不了对数据库的连接配置,就不详细叙述了。

第二,将查询到的数据写入到excel,这里包括两个部分,首先是要创建一个excel的工作薄,并且创建工作表;然后就是利用循环将查询到的数据压入excel中。看似简单,实则有很多步骤要走。

a,要利用java操作excel。要添加jxl.jar的库文件到 web-inf下的lib包下面,这样关于excel的编程操作都能够进行,(如何下载?)自己解决。

b,因为是对文件的操作,所以要注意 java.io流文件操作的知识,创建的文件路径,文件名等问题需要注意。

c,将查询到的数据文件要循环写入excel中,不管你查询到的是list集合类还是resultset结果集,都需要循环传入,list的有点是能够快速传入,不需要坐特别的处理,但是由于没有字段属性,所以要自己在excel的样式设置上进行控制。ResultSet结果集的好处是能够直接利用数据库的rs.getMetaData()方法进行属性,行列等的操作,当然因为是直接与数据库打交道,就在效率以及安全性上是差的。

d,所以信息都写入文件,关闭文件并且关闭数据库连接。

 

一种是通过JDBC(转载)

下面的两个类一个是用来连接数据库的,一个是用来将数据库中的东西查询并导入execl的。

文件一,jdbc 连接。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCConn {
 /**
  * @param args
  * @throws ClassNotFoundException
  * @throws SQLException
  */
 public Connection getConnection() {
  String driver = "com.mysql.jdbc.Driver";
  String url = "jdbc:mysql://127.0.0.1:3306/dataconsole";
  String user = "root";
  String password = "1qazxsw2";
  Connection conn = null;
  try {
   Class.forName(driver);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   conn = DriverManager.getConnection(url, user, password);
   if (!conn.isClosed())
    System.out.println("Succeeded connecting to the Database!");
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return conn;
 }
}

文件二,生成excel文件

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
 * 主要是用来创建excel工作薄
 */
public class MysqlToExcelUp {
 public void WriteExcel(File fileName,ResultSet rs) throws Exception{
  
  //创建一个新的工作薄,fileName 包含了文件名以及路径。
  WritableWorkbook wwb = null;
  WritableSheet ws = null;
  try {
   wwb = Workbook.createWorkbook(fileName);
    ws = wwb.createSheet("sheettest", 0);//给工作薄添加一个工作表,命名为 sheettest.
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  int i = 0;
  int j = 0;
 
  //下面for循环里面的rs.getMetaData().GetColumnCount() 获取数据库中某个表的列总数
  for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) 
  {
   //rs.getMetaData().getColumnName()获取表的列名。并添加到 excel表Label里,Label(i,j,s)表示i列j行添加s,s必须是String
   ws.addCell(new Label(k, 0, rs.getMetaData().getColumnName(k + 1)));
  }
  while (rs.next()) {
   //算法,依次添加数据库中所有符合的数据到excel中
   for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
    ws.addCell(new Label(k, j + i + 1, rs.getString(k + 1)));
   }
   i++;
  }
  wwb.write();//写入工作薄
  wwb.close();//关闭工作薄
  rs.close();//关闭结果集
 }
 
 public static void main(String[]args){
  MysqlToExcelUp mexel = new MysqlToExcelUp();
  JDBCConn myjdbc = new JDBCConn();
  myjdbc.getConnection();
  String sql = "select * from gcghandover";
  Statement stm = null;
  ResultSet rs = null;
  File newFile = new File("c:\\gcghandover.xls");
  try {
   stm = myjdbc.getConnection().createStatement();
   rs = stm.executeQuery(sql);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   mexel.WriteExcel(newFile , rs);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   myjdbc.getConnection().close();
   //关闭数据库连接
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}

一种是通过mybatis

//pojo 文件

package pojo;

import java.io.Serializable;
public class Province  extends AbstractPojo implements Serializable {
private int id;
private String name;
public Province() {
super();
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

//mapper文件

<select id="sel_for_excel"   resultType="pojo.Province">
 select *  from table
 </select>

//configuration文件

<configuration>
<properties>
                                    //连接数据库配置
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://127.0.0.1:5432/Database"/>
<property name="username" value="postgres" />
<property name="password" value="****" />
</properties>

<environments default="postgres">
<environment id="postgres">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver"   value="${driver}" />
<property name="url"      value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mappers/test.xml"/>
</mappers>
</configuration>

//java测试

首先连接数据库,建立session

package database;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class databaseOperator {

public databaseOperator() {
// TODO Auto-generated constructor stub
}

/**
* @param args
*/
private static SqlSessionFactory ssf=null;
static Logger logger=Logger.getLogger("DatabaseOperator");
@SuppressWarnings("unused")
private static void initalFactory() throws IOException{
String resource="mybatis/configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
ssf=new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSession getSession(){
if(ssf==null){
try{
initalFactory();
}catch (IOException e) {
// TODO: handle exception
e.getStackTrace();
}
}
return ssf.openSession();
}
}

然后操作数据库

package database;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.ibatis.session.SqlSession;

import pojo.Province;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class sqlToExcel {

public void WriteExcel(File fileName,ArrayList rs) throws Exception{
 
 WritableWorkbook wwb = null;
 WritableSheet ws = null;
 String[] title = { "id", "provice"}; 
 String[] sh = { "date", "power"}; 
 try {
  wwb = Workbook.createWorkbook(fileName);
   ws = wwb.createSheet("sheettest", 0);//给工作薄添加一个工作表,命名为 sheettest.
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }  
 int i = 0;
 int j = 0;
 

 for (i = 0; i < title.length; i++) {   
       //添加表头
       ws.addCell(new Label(i, 0, title[i]));   
  }
 for(j=0;j<rs.size();j++){
  //依次添加数据库中查询到的数据到excel中
  Province re=(Province) rs.get(j);
  String date=((Integer)re.getId()).toString();//int没法转换为string
  ws.addCell(new Label(0, j+1 ,date));
  ws.addCell(new Label(1, j+1,re.getName()));

 }
 wwb.write();//写入工作薄
 wwb.close();//关闭工作薄
 rs.clear();//关闭结果集
}
 
public static void main(String[]args){
 sqlToExcel mexel = new sqlToExcel();
 databaseOperator db=new databaseOperator();
 SqlSession session=null;
 String sql = "test.sel_pro";
 ArrayList rs = null;
 File newFile = new File("c:\\test.xls");
 try {
  session=db.getSession();
  rs=(ArrayList) session.selectList(sql);
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 try {
  mexel.WriteExcel(newFile , rs);
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 try {
  session.close();
  //关闭数据库连接
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 
}

 

 

posted @ 2014-04-14 13:21  java狂人  阅读(522)  评论(0编辑  收藏  举报