001package com.unitils.boot.xls; 002 003import org.apache.commons.lang.StringUtils; 004import org.dbunit.database.AmbiguousTableNameException; 005import org.dbunit.dataset.*; 006import org.dbunit.dataset.excel.XlsDataSet; 007import org.unitils.core.UnitilsException; 008import org.unitils.dbunit.util.MultiSchemaDataSet; 009 010import java.io.File; 011import java.io.FileInputStream; 012import java.util.*; 013 014/** 015 * @Author: yangjianzhou 016 * @Description: 017 * @Date:Created in 2018-07-08 018 */ 019public class MultiSchemaXlsDataSetReader { 020 private String pattern = "."; 021 private String defaultSchemaName; 022 023 public MultiSchemaXlsDataSetReader(String defaultSchemaName) { 024 this.defaultSchemaName = defaultSchemaName; 025 } 026 027 public MultiSchemaDataSet readDataSetXls(File... dataSetFiles) { 028 try { 029 Map<String, List<ITable>> tbMap = getTables(dataSetFiles); 030 MultiSchemaDataSet dataSets = new MultiSchemaDataSet(); 031 032 for (Map.Entry<String, List<ITable>> entry : tbMap.entrySet()) { 033 List<ITable> tables = entry.getValue(); 034 try { 035 DefaultDataSet ds = new DefaultDataSet(tables.toArray(new ITable[]{})); 036 dataSets.setDataSetForSchema(entry.getKey(), ds); 037 } catch (AmbiguousTableNameException e) { 038 throw new UnitilsException("构造DataSet失败!", e); 039 } 040 } 041 return dataSets; 042 } catch (Exception e) { 043 throw new UnitilsException("解析Excel文件出错:", e); 044 } 045 } 046 047 private Map<String, List<ITable>> getTables(File... dataSetFiles) { 048 Map<String, List<ITable>> tableMap = new HashMap<String, List<ITable>>(); 049 // 需要根据schema把Table重新组合一下 050 try { 051 String schema, tableName; 052 for (File file : dataSetFiles) { 053 IDataSet dataSet = new XlsDataSet(new FileInputStream(file)); 054 String[] tableNames = dataSet.getTableNames(); 055 for (String tn : tableNames) { 056 String[] temp = tn.split(pattern); 057 if (temp.length == 2) { 058 schema = temp[0]; 059 tableName = temp[1]; 060 } else { 061 schema = this.defaultSchemaName; 062 tableName = tn; 063 } 064 065 ITable table = dataSet.getTable(tn); 066 if (!tableMap.containsKey(schema)) { 067 tableMap.put(schema, new ArrayList<ITable>()); 068 } 069 tableMap.get(schema).add(new XlsTable(tableName, table)); 070 } 071 } 072 } catch (Exception e) { 073 throw new UnitilsException("Unable to create DbUnit dataset for data set files: " + Arrays.toString(dataSetFiles), e); 074 } 075 return tableMap; 076 } 077 078 //构造XslTable表 079 class XlsTable extends AbstractTable { 080 private ITable delegate; 081 private String tableName; 082 083 public XlsTable(String tableName, ITable table) { 084 this.delegate = table; 085 this.tableName = tableName; 086 } 087 088 public int getRowCount() { 089 return delegate.getRowCount(); 090 } 091 092 public ITableMetaData getTableMetaData() { 093 ITableMetaData meta = delegate.getTableMetaData(); 094 try { 095 return new DefaultTableMetaData(tableName, meta.getColumns(), 096 meta.getPrimaryKeys()); 097 } catch (DataSetException e) { 098 throw new UnitilsException("Don't get the meta info from " 099 + meta, e); 100 } 101 } 102 103 public Object getValue(int row, String column) throws DataSetException { 104 Object delta = delegate.getValue(row, column); 105 if (delta instanceof String) { 106 if (StringUtils.isEmpty((String) delta)) { 107 return null; 108 } 109 } 110 return delta; 111 } 112 113 } 114}