dbUnitを使ってOracleデータベースからExcelにデータをexportしようとしたところ、DATE型のカラムの内容が単なる数字になってしまう。
どうやら、UNIXのEpoch Time的なものとして出力されているようだ。
ところが、逆にExcelからOracleにデータをimportしようとすると、DATE型のカラムは
'yyyy-MM-dd HH:MI:SS'
のような形式でなくてはならない。つまり、Oracle⇔Excel間でダイレクトにデータのやりとりができないということになる。
検索してみると、Excel側のマクロで変換するという方法はヒットしたが、あまり汎用的とはいえない。
何か方法はないものかとdbUnitのソースコードを追っかけてみる。
どうやら、DataTypeFactoryを与えてやればうまくいきそうな気がする。そこで
MyOracleDataFactoy.java:
import java.sql.Types;
import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.ext.oracle.OracleDataTypeFactory;
public class MyOracleDataTypeFactory extends OracleDataTypeFactory {
@Override
public DataType createDataType(int sqlType, String sqlTypeName)
throws DataTypeException {
if (sqlType == Types.DATE) {
return DataType.VARCHAR;
} else if (sqlType == Types.TIMESTAMP) {
return DataType.VARCHAR;
} else {
return super.createDataType(sqlType, sqlTypeName);
}
}
}
呼び出し元:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("*****", "*****", "*****");
IDatabaseConnection iconn = new DatabaseConnection(conn, "******");
DatabaseConfig config = iconn.getConfig();
config.setProperty(
DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new MyOracleDataTypeFactory());
IDataSet dataset = con.createDataSet(new String[] { テーブル名... });
XlsDataSet.write(dataset, new FileOutputStream(Excelファイル名));
みたいにしてやると、ちゃんと日付の文字列として出力されるようになった。ちなみに、OracleのDATE型はdbUnit上ではTypes.TIMESTAMPと判断されている。