2016-07-03 3 views
0

Ich arbeite am Exportieren der Ergebnisse eines Java Programms zu einem excel Blatt. Ich benutze dafür Jxls. Es funktioniert, wenn ich XLSTransforme r verwende, aber die Berechnung der Excel-Vorlage wird nicht durchgeführt. Um diese Berechnungen durchzuführen, versuche ich dann Transformer class zu verwenden, aber ich habe eine Debug-Nachricht erhalten: DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer, während meine Importe die gleichen sind wie in den Beispielen auf der Seite Jxls sourceforge.Jxls - Transformer-Klasse ist org.jxls.transform.poi.PoiTransformer

private void exportData(File file) throws ParseException, IOException { 

    AreaBuilder areaBuilder = new XlsCommentAreaBuilder(); 

    int o = 0; 
    List<ListData2> rs2 = new ArrayList<ListData2>(); 
    ListData2 s2 = new ListData2(item[o], rep[o], justefaux[o], tempsrep[o]); 
    for(int i=0; i<tableau.getRowCount(); i++){ 
     item[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 2).toString(); 
     rep[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 3).toString(); 
     justefaux[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 4).toString(); 
     tempsrep[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 5).toString(); 
     ListData2 temp = new ListData2(item[i], rep[i], justefaux[i], tempsrep[i]); 
     s2.add(temp); 
     rs2.add(s2); 
    } 



    InputStream in = IdGenre.class.getResourceAsStream("/xlsTemplates/IdGenre/IdGenreTemplate.xlsx"); 
try 
    {OutputStream out = new FileOutputStream("d:/IdGenre.xlsx"); 

    Context context = new Context(); 
    context.putVar("rs2", rs2); 

    Transformer transformer = TransformerFactory.createTransformer(in, out); 
    JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator(); 
    Map<String, Object> functionMap = new HashMap<>(); 
    functionMap.put("joiner", new ListUtil()); 
    evaluator.getJexlEngine().setFunctions(functionMap); 

    areaBuilder.setTransformer(transformer); 
    List xlsAreaList = areaBuilder.build(); 
    Iterator iterator = xlsAreaList.iterator(); 

    while (iterator.hasNext()) { 
     Area xlsArea = (Area) iterator.next(); 
     xlsArea.applyAt(new CellRef(xlsArea.getStartCellRef().getCellName()), context); 
    } 
    transformer.write(); 

    } 
    finally 
    { 
     in.close(); 
    } 
} 


public static class ListUtil { 

    public String join(List list) { 
     StringBuilder builder = new StringBuilder(); 
     for (Object o : list) { 
      if (builder.length() != 0) { 
       builder.append("/"); 
      } 
      builder.append(o); 
     } 
     return builder.toString(); 
    } 
} 

Stapelüberwachung:

15:44:44.975 [AWT-EventQueue-0] DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at sun.font.FontDesignMetrics$MetricsKey.init(Unknown Source) 
at sun.font.FontDesignMetrics.getMetrics(Unknown Source) 
... 

bekam ich den gleichen Stack-Trace, wenn ich mit der JxlsHelper Klasse versuchen:

private void exportData(File file) throws ParseException, IOException { 

    int o = 0; 
    List<ListData2> rs2 = new ArrayList<ListData2>(); 
    ListData2 s2 = new ListData2(item[o], rep[o], justefaux[o], tempsrep[o]); 
    for(int i=0; i<tableau.getRowCount(); i++){ 
     item[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 2).toString(); 
     rep[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 3).toString(); 
     justefaux[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 4).toString(); 
     tempsrep[i]=((DataIdGenre) tableau.getModel()).getValueAt(i, 5).toString(); 
     ListData2 temp = new ListData2(item[i], rep[i], justefaux[i], tempsrep[i]); 
     s2.add(temp); 
     rs2.add(s2); 
    } 



    InputStream in = IdGenre.class.getResourceAsStream("/xlsTemplates/IdGenre/IdGenreTemplate.xlsx"); 
try 
    {OutputStream out = new FileOutputStream("d:/IdGenreYOLO.xlsx"); 

    Context context = new Context(); 
    context.putVar("rs2", rs2); 
    JxlsHelper.getInstance().processTemplate(in, out, context); 

    } 
    finally 
    { 
     in.close(); 
    } 
} 

Jede Hilfe wird viel zu schätzen wissen.

Antwort

0

Die Debug-Nachricht erhalten Sie

15:44:44.975 [AWT-EventQueue-0] DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer 

ist nur eine Meldung angibt, dass Jxls PoiTransformer verwendet wird, eine Excel-Ausgabe zu erzeugen.

Der eigentliche Fehler hat nichts mit Jxls zu tun, sondern mit dem Nullpointer verbunden zum nächsten

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at sun.font.FontDesignMetrics$MetricsKey.init(Unknown Source) 
at sun.font.FontDesignMetrics.getMetrics(Unknown Source) 
... 

So sollte man sich weiter in die Stacktrace und sehen haben, warum haben Sie Nullpointer bei sun.font bekommen. (FontDesignMetrics.getMetrics)

Update:

Wenn Sie ein Problem mit Excel nicht Berechnungsformeln haben, können Sie verwenden Techniken erklärt bei POI Formula Evaluation. Beispielsweise können Sie Excel zwingen, Formeln neu zu berechnen, indem Sie workbook.setForceFormulaRecalculation(true) verwenden, nachdem die Jxls-Verarbeitung abgeschlossen ist. Sie können eine Arbeitsmappeinstanz abrufen, indem Sie die Methode PoiTransformergetWorkbook() aufrufen.

+0

Großartig, danke. Die 'NullPointerException' stammt von einem' JFileChooser'. Die Situation bleibt jedoch bestehen, da mein Excel-Blatt mit den oben genannten Codes nicht gefüllt ist. Es funktioniert wie ein Charme mit XLSTransformer, aber die Excel-Zellen müssen revalidiert werden, um die Formeln zu aktivieren. Gibt es eine Möglichkeit, sie mit XLSTransformer zu verarbeiten? –

+0

Ich habe die Antwort mit einer Information zur Formel Auswertung aktualisiert –

+0

Nizza. Haben Sie eine Idee für meine andere Frage, verschiedene Karten für verschiedene Blätter mit 'XLSTransformer' zu haben? –

Verwandte Themen