本程序全部是用Java EE编程的,由于是数据测试,所以没有使用jsp来操作,因为jsp的将数据库导入到Excel是同样的道理。
原理分析:首先要进行数据查询,数据查询少不了对数据库的连接配置,就不详细叙述了。大家都会,不管是mysql还是oracle或者其他数据库操作,都是要建立连接。
第二,将查询到的数据写入到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,所以信息都写入文件,关闭文件并且关闭数据库连接。
下面的两个类一个是用来连接数据库的,一个是用来将数据库中的东西查询并导入execl的。测试用的是mysql数据库/dataconsole数据库下的 gcghandover表。要修改自己动手。
文件一,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;
/**
* @version 1.0
* @author zhwenq
* 主要是用来创建excel工作薄
*/
public class MysqlToExcelUp {
/**
* 按照数据库中查询到的结果集创建一个新的工作薄,建议传入参数为Resultset结果集
*
* @param fileName 包含文件的路径以及文件名
* @param rs
* @throws Exception
*/
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里
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();
}
}
}