我有一张excel表,其第一列包含以下数据"什么是$ {v2}%$ {v2}?",此表中另外两列(v1和v2)包含{& #34;输入":" int","最小":15,"最大":58}和{"类型": " int"," minimum":30," maximum":100},这些是变量v1和v2的范围。我需要用给定范围内的随机值替换表达式中的v1和v2,并使用JAVA将表达式存储在另一个电子表格中。我怎样才能利用JETT来做到这一点?
例如:我应该存储"什么是50%的25%?"
这就是我所做的,我能够读取我的java程序中的列但不能替换值
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
public class ACGS {
public static void main(String[] args) throws Exception {
//test file is located in your project path
FileInputStream fileIn = new FileInputStream("C://users/user/Desktop/Content.xls");
//read file
POIFSFileSystem fs = new POIFSFileSystem(fileIn);
HSSFWorkbook filename = new HSSFWorkbook(fs);
//open sheet 0 which is first sheet of your worksheet
HSSFSheet sheet = filename.getSheetAt(0);
//we will search for column index containing string "Your Column Name" in the row 0 (which is first row of a worksheet
String columnWanted = "${v1}";
Integer columnNo = null;
//output all not null values to the list
List<Cell> cells = new ArrayList<Cell>();
Row firstRow = sheet.getRow(0);
for(Cell cell:firstRow){
if (cell.getStringCellValue().contains(columnWanted)){
columnNo = cell.getColumnIndex();
System.out.println("cell contains "+cell.getStringCellValue());
}
}
if (columnNo != null){
for (Row row : sheet) {
Cell c = row.getCell(columnNo);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// Nothing in the cell in this row, skip it
} else {
cells.add(c);
}
}
} else{
System.out.println("could not find column " + columnWanted + " in first row of " + fileIn.toString());
}
}
}
答案 0 :(得分:1)
首先,看起来你根本就没有使用JETT。您似乎试图自己阅读电子表格并进行一些处理。
以下是您在JETT中的表现方式。 JETT不提供自己的随机数支持,但是除了它的Apache Commons JEXL表达式支持和Java自己的Random
之外,您可以将随机变量的预期范围作为bean发布到JETT,并且您可以计算出带表达式的随机变量。
首先,创建模板电子表格,并使用JETT将评估的表达式(${
和}
之间)填充它。一个单元格可能包含这样的内容。
什么是$ {rnd.nextInt(v1Max-v1Min + 1)+ v1Min}%$ $ {rnd.nextInt(v2Max-v2Min + 1)+ v2Min}?
接下来,创建要提供给JETT的bean。这些bean是电子表格模板中JEXL表达式可用的命名对象。
Map<String, Object> beans = new HashMap<String, Object>();
beans.put("v1Min", 15);
beans.put("v1Max", 58);
beans.put("v2Min", 30);
beans.put("v2Max", 100);
beans.put("rnd", new Random());
接下来,创建调用JETT ExcelTransformer
。
try
{
ExcelTransformer transformer = new ExcelTransformer();
// template file name, destination file name, beans
transformer.transform("Content.xls", "Populated.xls", beans);
}
catch (IOException e)
{
System.err.println("IOException caught: " + e.getMessage());
}
catch (InvalidFormatException e)
{
System.err.println("InvalidFormatException caught: " + e.getMessage());
}
在生成的电子表格中,您将看到评估的表达式。在包含上述表达式的单元格中,您将看到例如:
38%的41%是什么?
(或者你会看到不同的数字,具体取决于生成的随机数。)