Jxls - 变压器 class 是 org.jxls.transform.poi.PoiTransformer
Jxls - Transformer class is org.jxls.transform.poi.PoiTransformer
我正在努力将 Java
程序的结果导出到 excel
sheet。我为此使用 Jxls
。
当我使用 XLSTransforme
r 时它有效,但不执行 excel 模板的计算。为了执行这些计算,我随后尝试使用 Transformer class
,但我收到了一条调试消息:DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer
,而我的导入与 Jxls
sourceforge 页面上的示例相同。
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 时得到了相同的堆栈跟踪 class :
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();
}
}
如有任何帮助,我们将不胜感激。
您收到的调试消息
15:44:44.975 [AWT-EventQueue-0] DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer
只是一条信息消息,表明 Jxls PoiTransformer 将用于生成 Excel 输出。
真正的错误与 Jxls 无关,但与您接下来遇到的 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)
...
所以您应该进一步查看堆栈跟踪,看看为什么在 sun.font.FontDesignMetrics.getMetrics()
处会出现 NullPointerException
更新:
如果您对 Excel 无法计算公式有疑问,可以使用 POI Formula Evaluation 中介绍的技术。例如,您可以强制 Excel 在 Jxls 处理完成后使用 workbook.setForceFormulaRecalculation(true)
重新计算公式。
您可以通过调用 PoiTransformergetWorkbook()
方法来获取工作簿实例。
我正在努力将 Java
程序的结果导出到 excel
sheet。我为此使用 Jxls
。
当我使用 XLSTransforme
r 时它有效,但不执行 excel 模板的计算。为了执行这些计算,我随后尝试使用 Transformer class
,但我收到了一条调试消息:DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer
,而我的导入与 Jxls
sourceforge 页面上的示例相同。
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 时得到了相同的堆栈跟踪 class :
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();
}
}
如有任何帮助,我们将不胜感激。
您收到的调试消息
15:44:44.975 [AWT-EventQueue-0] DEBUG org.jxls.util.TransformerFactory - Transformer class is org.jxls.transform.poi.PoiTransformer
只是一条信息消息,表明 Jxls PoiTransformer 将用于生成 Excel 输出。
真正的错误与 Jxls 无关,但与您接下来遇到的 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)
...
所以您应该进一步查看堆栈跟踪,看看为什么在 sun.font.FontDesignMetrics.getMetrics()
处会出现 NullPointerException更新:
如果您对 Excel 无法计算公式有疑问,可以使用 POI Formula Evaluation 中介绍的技术。例如,您可以强制 Excel 在 Jxls 处理完成后使用 workbook.setForceFormulaRecalculation(true)
重新计算公式。
您可以通过调用 PoiTransformergetWorkbook()
方法来获取工作簿实例。