excel入库的转换文件,实际上就是拼TransMeta对象,直接上这几天的成果,我这个还是比较简单的excel转换,还有一些复杂的参数没有添加,后期会在使用的过程中完善。
生成转换文件:
public void excelToDatabase(ExcelToDBDto dto){
try {
TransMeta generateTrans = this.generateKtr(dto);
String xml = generateTrans.getXML();
String transName = dto.getTransName();
File file = new File(transName);
FileUtils.writeStringToFile(file, xml, "UTF-8");
} catch (Exception e) {
logger.error(e.getMessage());
}
}
拼TransMeta对象:
/**
* 1.excel输入
* 2.表输出
* @throws Exception
*/
public TransMeta generateKtr(ExcelToDBDto dto) throws Exception {
TransMeta transMeta = new TransMeta();
//生成databaseXML——表输出信息
String[] dbXml = generateDBxml(dto.getOutputDB());
//设置转换名称
transMeta.setName(dto.getTransName());
//添加转换的数据库连接
for(int i=0; i<dbXml.length; i++){
DatabaseMeta dbMeta = new DatabaseMeta(dbXml[i]);
transMeta.addDatabase(dbMeta);
}
// registry是给每个步骤生成一个标识ID
PluginRegistry registryID = PluginRegistry.getInstance();
//1.设置表输出参数
InsertUpdateMeta insertMeta = new InsertUpdateMeta();
String iuPluginId = registryID.getPluginId(StepPluginType.class, insertMeta);
//添加数据库连接
DatabaseMeta db_chenyh = transMeta.findDatabase(dto.getOutputDB().getConnName());
insertMeta.setDatabaseMeta(db_chenyh);
//设置操作的表
insertMeta.setTableName(dto.getOutputTableName());
//设置用来查询的关键字
insertMeta.setKeyLookup(new String[]{dto.getSheets().getPrimaryKey()});
insertMeta.setKeyStream(new String[]{dto.getSheets().getPrimaryKey()});
insertMeta.setKeyStream2(new String[]{""});
insertMeta.setKeyCondition(new String[]{"="});
// 生成要更新的字段
String[] update = generateField(dto.getFields());
//设置要更新的字段
Boolean[] updateOrNot = {false, true, true, true, true, true, true};
insertMeta.setUpdateLookup(update);
insertMeta.setUpdateStream(update);
insertMeta.setUpdate(updateOrNot);
insertMeta.getUpdateLookup();
//添加到转换中
StepMeta insertStep = new StepMeta(iuPluginId, "表输出", insertMeta);
insertStep.setDraw(true);
insertStep.setLocation(250, 100);
transMeta.addStep(insertStep);
//2.设置excel输入参数
ExcelInputMeta eiMeta = new ExcelInputMeta();
List<ExcelInputDto> sheets = dto.getSheets().getDtos();
int size = sheets.size();
ExcelInputField[] fields = new ExcelInputField[size];
int i = 0;
for (ExcelInputDto sheet : sheets) {
fields[i] = new ExcelInputField();
fields[i].setName(sheet.getName());
i++;
}
eiMeta.setField(fields);
String[] fileName = new String[]{dto.getFilePath()};
String[] fileMask = {};
String[] fileRequired = {"N"};
eiMeta.setFileName(fileName);
eiMeta.setFileRequired(fileRequired);
eiMeta.setIncludeSubFolders(fileRequired);
eiMeta.setAddResultFile(true);
eiMeta.setStartsWithHeader(true);
eiMeta.setIgnoreEmptyRows(true);
eiMeta.setStopOnEmpty(false);
eiMeta.setAcceptingFilenames(false);
String name = dto.getSheets().getSheetName();
String[] sheetName = {name};
eiMeta.setSheetName(sheetName);
int[] row = {0};
int[] col = {0};
eiMeta.setStartColumn(col);
eiMeta.setStartRow(row);
eiMeta.setStrictTypes(false);
eiMeta.setErrorIgnored(false);
eiMeta.setErrorLineSkipped(false);
eiMeta.setBadLineFilesExtension("waring");
eiMeta.setErrorFilesExtension("error");
eiMeta.setLineNumberFilesExtension("line");
String eiPluginId = registryID.getPluginId(StepPluginType.class, eiMeta);
StepMeta stepMeta = new StepMeta(eiPluginId,"excel输入",eiMeta);
transMeta.addStep(stepMeta);
//添加hop将两个步骤关联起来
transMeta.addTransHop(new TransHopMeta(stepMeta, insertStep));
return transMeta;
}
实体类:
public class ExcelToDBDto {
private String transName; //转换名称
private String outputTableName; //输出源表名
private DatabaseDto outputDB; // 作为输出源的数据库
private String filePath; // excel文件路径
private String fields; //表字段
private SheetDto sheets; // excel文件的列名
省略getter-setter方法
}
请求实例:
这样就可以生成excel入库的转换文件了