在使用dbunit导出数据到Excel中时遇到的问题
因为工作需要去学习了dbunit的使用,当然看到网上很多例子都是使用FlatXmlDataSet这种类型区读写xml文件,而在同时都提到了XlsDataSet这种类型也是常用的数据格式,但却没有一个例子,于是自己就按照导出xml的方法去写一个导出xls文件的小Test,其实就是换了一种方法,用XlsDataSet.write(dataSet,out)的方法去将数据写入到Excel中的xls文件。
这里先给出我参照的例子,只是用普通的java工程,单纯的只是用dbunit中的方法,读取数据库。
import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.QueryDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; public class TestApp { public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/sample", "root", "root"); IDatabaseConnection connection = new DatabaseConnection(conn); QueryDataSet dataSet = new QueryDataSet(connection); //将整个person表里的数据导出到 xml文件里 dataSet.addTable("testa"); //将users表里符合条件的数据导出到xml文件里 dataSet.addTable("users","select * from users where id < 4"); //导出到dbunit.xml文件里 FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml")); } }
我用到的包有commons-logging-1.1.1.jar,dbunit-2.4.9.jar,mysql-connector-java-5.1.12-bin.jar,slf4j-api-1.7.2.jar,slf4j-log4j12-1.7.2.jar,junit-3.8.1.jar,可以成功在项目的根目录下生成dbunit.xml文件,文件内容包括testa表和users表两个表的内容。
然后我就直接把FlatXmlDataSet.write(dataSet,out)方法给换成了XlsDataSet.write(dataSet,out);代码如下
import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.QueryDataSet; import org.dbunit.dataset.excel.XlsDataSet; public class TestExcel { private final static String FILENAME ="d://xxm//excel.xls"; /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //Connection conn = DBUtil.getConnection(); Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/sample", "root", "root"); IDatabaseConnection connection = new DatabaseConnection(conn); QueryDataSet dataSet = new QueryDataSet(connection); //将整个person表里的数据导出到 xml文件里 dataSet.addTable("testa"); //将users表里符合条件的数据导出到xml文件里 dataSet.addTable("users","select * from users where id < 4"); //导出到Excel文件里 /*注意这里导入了poi-3.2-FINAL.jar,在这里我用的dbunit-2.4.9.jar * 是最新的版本,而poi目前最新的版本是poi-3.10-beta2-20130904.jar, * 与dbunit的最新版本一起使用会报错 会出现: * java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setCellValue(Lorg/apache/poi/hssf/usermodel/HSSFRichTextString;)V * 而换成poi-3.2-FINAL.jar时则成功导出,生成了两个Sheet,Sheet名为表名 * 即只能导出一个表中的数据,并且只能导出Excel97-2003*.xls版本的文件 * 而使用FlatXmlDataSet能够导出多个表中的数据 */ XlsDataSet.write(dataSet, new FileOutputStream(FILENAME)); } }
问题出现了,开始报错 java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook,上网查询后知道少了一个jar包
poi.jar于是我去官网上去下载了一个最新的版本poi-3.10-beta2-20130904.jar,于是问题又出现了还是报错错误信息变成了java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setCellValue(Lorg/apache/poi/hssf/usermodel/HSSFRichTextString;)V
查了很多资料都显示可能是poi.jar的版本问题,心想我都是最高版本了,应该是版本高了,但究竟用哪个版本能解决问题呢,最终查到一个用日文记录的日志,说是将版本poi.jar的版本换到poi-3.2-FINAL.jar,照做后问题解决。最终生成了excel.xls文件这里只能是Excel97-2003版本的,文件中包含两个Sheet,Sheet名为表名,每个Sheet中第一行为字段名,第二行开始是相对应的数据。同理在读取Excel文件时应该只支持Excel97-2003这个版本的吧。
最后总结一下用到的包
commons-logging-1.1.1.jar
dbunit-2.4.9.jar
junit-3.8.1.jar
log4j-1.2.17.jar
mysql-connector-java-5.1.12-bin.jar
poi-3.2-FINAL.jar
slf4j-api-1.7.2.jar
slf4j-log4j12-1.7.2.jar