将查询到的数据存到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(); } }