如何使用Drools 6导入Drools决策表存在于同一个excel文件的多个工作表中?

时间:2016-12-29 09:16:04

标签: drools

我没有使用Drools 6获得任何具体方法。 我曾尝试使用以下示例代码执行此操作: `

private static KieBase readBase(String strFilePath) throws IOException, BiffException {
        DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration();
        dtconf.setInputType(DecisionTableInputType.XLS);

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        File xls = new File(strFilePath);

        SpreadsheetCompiler compiler = new SpreadsheetCompiler();
        Workbook w;
        String sheetName = "";
        FileInputStream in = null;

        try {

            w = Workbook.getWorkbook(xls);
            for (Sheet sheet : w.getSheets()) {

                sheetName = sheet.getName();
                in = new FileInputStream(xls);

                System.out.println("The sheet name is : " + sheetName);

                compileSheet(kbuilder, xls, compiler, sheetName, in);


            }


        } catch (DecisionTableParseException e) {
            System.out.println("Failed to parse spreadsheet " + sheetName + "  "
                    + e);
        }

        KieBase k = KnowledgeBaseFactory.newKnowledgeBase();
//        kContainer.
        KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase();
        kb.addKnowledgePackages(kbuilder.getKnowledgePackages()); 

        return kb; 
    }

    private static KnowledgeBuilder compileSheet(KnowledgeBuilder kbuilder, File xls, SpreadsheetCompiler compiler, String sheetName, FileInputStream in) {
        try {
            String compiled = compiler.compile(in, sheetName);

            kbuilder.add(ResourceFactory.newReaderResource(new StringReader(compiled)), ResourceType.DRL);
            System.out.println("***************************************drl**************************************");
            System.out.println(compiled);

        } catch (DecisionTableParseException dtpe) {
            if (dtpe.getMessage().equals("No RuleTable's were found in spreadsheet.")) {
                System.out.println("No rule tables found in sheet {}" + sheetName);
            } else {
                throw dtpe;
            }
        }
        return kbuilder;
    }

`

这里的问题是Drools 6使用KIEBase而不是KnowledgeBase,所以我没有适当的方法在KieBase中加载编译的表。在Drools 6中还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
FileInputStream fis = new FileInputStream( "dir/some.drl" );
kfs.write( "src/main/resources/simple.drl",
           kieServices.getResources().newInputStreamResource( fis ) );

 KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();

Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
    System.out.println( results.getMessages() );
    throw new IllegalStateException( "### errors ###" );
}

KieContainer kieContainer =
    kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();

您也可以将它与dsl,dslr和xls文件一起使用。