2016-07-03 98 views
0

Javaプログラムの結果をexcelシートにエクスポートしています。私はこれにJxlsを使用しています。 XLSTransforme rを使用しても機能しますが、Excelテンプレートの計算は実行されません。これらの計算を実行するには、Transformer classを使用しようとしますが、デバッグメッセージはDEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformerですが、インポートはJxls sourceforgeページの例と同じです。Jxls - トランスフォーマクラスは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(); 
    } 
} 

スタックトレース:

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) 
... 

私はJxlsHelperクラスにしようとすると私は同じスタックトレースを得た:

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(); 
    } 
} 

すべてのヘルプははるかに高く評価されます。

答えて

0

あなたは

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

を取得するデバッグメッセージがJxls PoiTransformerがExcel出力を生成するために使用されることを示すだけの情報メッセージです。

本当のエラーがJxlsとは何の関係もありませんが、あなたはあなたがさらにスタックトレースに見て、あなたがsun.fontでNullPointerExceptionが取得なぜ見るべき次の

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

を持っているとNullPointerExceptionが接続されています。 FontDesignMetrics.getMetrics()

更新:

技術はで説明し、あなたが使用できる数式をエクセルに問題があることを計算していない場合。たとえば、Jxlsの処理が完了した後でExcelにworkbook.setForceFormulaRecalculation(true)を使用して数式を再計算させることができます。 PoiTransformergetWorkbook()メソッドを呼び出すと、ワークブックインスタンスを取得できます。

+0

よろしくお願い致します。 'NullPointerException'は' JFileChooser'から発生します。しかし、私のExcelシートに上記の異なるコードが入力されていないので、状況は変わりません。 'XLSTransformer'の魅力のように機能しますが、エクセルセルは式を有効にするために再検証されなければなりません。 'XLSTransformer'でそれらを処理する方法はありますか? –

+0

私は数式評価の情報で答えを更新しました –

+0

ニース。 'XLSTransformer'を使って別々のシートに異なるマップをつけることについての私の他の質問のアイデアはありますか? –

関連する問題