地图和 Jxls - 使用 XLSTransformer 分别处理不同的 excel 工作表
Maps and Jxls - process different excel sheets separately with XLSTransformer
我有一个 excel 模板,其中包含两个 sheet,我想通过 XLSTransformer
填充它们。两个 sheet 的数据不同(不同长度的列表,其中一个获取 table 的结果 - 请参见下面的代码),这意味着我无法通过一张地图传递它们。
我试过两张地图:
//for the first excel sheet
Map<String, List<ListData>> beanParams = new HashMap<String, List<ListData>>();
beanParams.put("rs", rs);
//for the second one
Map<String, List<DetailResult>> beanParams2 = new HashMap<String, List<DetailResult>>();
beanParams2.put("detRes", detRes);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, beanParams, destFilePath);
former.transformXLS(srcFilePath, beanParams2, destFilePath);
列表如下所示:
List<Results> rs = new ArrayList<Results>();
Results s1 = new Results(compteurFemme, compteurHomme, compteurTot, averageTempsFemme, averageTempsHomme, averageTempsTot);
rs.add(s1);
List<ResultsDetails> detRes = new ArrayList<ResultsDetails>();
for(int i=0; i<tableau.getRowCount(); i++){
ResultsDetails newRes = new ResultsDetails(item[i], rep[i], justefaux[i], tempsrep[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();
detRes.add(newRes);
}
两个导出分别在各自的 sheet 上工作,但一起,第二个会擦除第一个。
然后我尝试使用某种 multimap,用一个键(我放在 excel 中的那个)用于两个值
Map<String, List<Object>> hm = new HashMap<String, List<Object>>();
List<Object> values = new ArrayList<Object>();
values.add(rs);
values.add(detRes);
hm.put("det", values);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, hm, destFilePath);
但是我收到一条错误消息,告诉我无法访问数据。
所以我的问题是,有没有办法在使用XLSTransformer
时直接处理不同的sheet?
好的,我想出了一些办法,通过一个临时文件:
private void exportDataDet(File file) throws ParseException, IOException, ParsePropertyException, InvalidFormatException {
List<ResultsDetails> detRes = generateResultsDetails();
try(InputStream is = IdGenre.class.getResourceAsStream("/xlsTemplates/IdGenre/IdGenre_20-29_+12.xlsx")) {
try (OutputStream os = new FileOutputStream("d:/IdGenreYOLO.xlsx")) {
Context context = new Context();
context.putVar("detRes", detRes);
JxlsHelper.getInstance().processTemplate(is, os, context);
}
}
}
private void exportData(File file) throws ParseException, IOException, ParsePropertyException, InvalidFormatException {
List<Results> rs = generateResults();
try{
String srcFilePath = "d:/IdGenreYOLO.xlsx";
String destFilePath = "d:/IdGenreRes.xlsx";
Map<String, List<Results>> beanParams = new HashMap<String, List<Results>>();
beanParams.put("rs", rs);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, beanParams, destFilePath);
}
finally{
Path path = Paths.get("d:/IdGenreYOLO.xlsx");
try{
Files.delete(path);
}
finally{}
}
}
这可能不是最好的解决方案,更重要的是因为我必须添加其他无法放入两个现有列表的数据,并且 - 至少现在 - 它将通过第二个临时文件完成。
我没有使用过两次相同的方法,因为 XLSTransformer
是我唯一能够在给定的 excel 模板(我无法修改)中使用的方法.
我愿意接受任何建议。
我有一个 excel 模板,其中包含两个 sheet,我想通过 XLSTransformer
填充它们。两个 sheet 的数据不同(不同长度的列表,其中一个获取 table 的结果 - 请参见下面的代码),这意味着我无法通过一张地图传递它们。
我试过两张地图:
//for the first excel sheet
Map<String, List<ListData>> beanParams = new HashMap<String, List<ListData>>();
beanParams.put("rs", rs);
//for the second one
Map<String, List<DetailResult>> beanParams2 = new HashMap<String, List<DetailResult>>();
beanParams2.put("detRes", detRes);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, beanParams, destFilePath);
former.transformXLS(srcFilePath, beanParams2, destFilePath);
列表如下所示:
List<Results> rs = new ArrayList<Results>();
Results s1 = new Results(compteurFemme, compteurHomme, compteurTot, averageTempsFemme, averageTempsHomme, averageTempsTot);
rs.add(s1);
List<ResultsDetails> detRes = new ArrayList<ResultsDetails>();
for(int i=0; i<tableau.getRowCount(); i++){
ResultsDetails newRes = new ResultsDetails(item[i], rep[i], justefaux[i], tempsrep[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();
detRes.add(newRes);
}
两个导出分别在各自的 sheet 上工作,但一起,第二个会擦除第一个。
然后我尝试使用某种 multimap,用一个键(我放在 excel 中的那个)用于两个值
Map<String, List<Object>> hm = new HashMap<String, List<Object>>();
List<Object> values = new ArrayList<Object>();
values.add(rs);
values.add(detRes);
hm.put("det", values);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, hm, destFilePath);
但是我收到一条错误消息,告诉我无法访问数据。
所以我的问题是,有没有办法在使用XLSTransformer
时直接处理不同的sheet?
好的,我想出了一些办法,通过一个临时文件:
private void exportDataDet(File file) throws ParseException, IOException, ParsePropertyException, InvalidFormatException {
List<ResultsDetails> detRes = generateResultsDetails();
try(InputStream is = IdGenre.class.getResourceAsStream("/xlsTemplates/IdGenre/IdGenre_20-29_+12.xlsx")) {
try (OutputStream os = new FileOutputStream("d:/IdGenreYOLO.xlsx")) {
Context context = new Context();
context.putVar("detRes", detRes);
JxlsHelper.getInstance().processTemplate(is, os, context);
}
}
}
private void exportData(File file) throws ParseException, IOException, ParsePropertyException, InvalidFormatException {
List<Results> rs = generateResults();
try{
String srcFilePath = "d:/IdGenreYOLO.xlsx";
String destFilePath = "d:/IdGenreRes.xlsx";
Map<String, List<Results>> beanParams = new HashMap<String, List<Results>>();
beanParams.put("rs", rs);
XLSTransformer former = new XLSTransformer();
former.transformXLS(srcFilePath, beanParams, destFilePath);
}
finally{
Path path = Paths.get("d:/IdGenreYOLO.xlsx");
try{
Files.delete(path);
}
finally{}
}
}
这可能不是最好的解决方案,更重要的是因为我必须添加其他无法放入两个现有列表的数据,并且 - 至少现在 - 它将通过第二个临时文件完成。
我没有使用过两次相同的方法,因为 XLSTransformer
是我唯一能够在给定的 excel 模板(我无法修改)中使用的方法.
我愿意接受任何建议。