Обнаружение и замена переменных в строке значениями
У меня есть лист Excel, первый столбец которого содержит следующие данные "Что такое ${v1} % от ${v2}?", Еще два столбца (v1 и v2) на этом листе содержат {"type":"int", "минимум ":15, " максимум ":58} и {" тип ":" int "," минимум ":30, " максимум ":100}, это диапазоны переменных v1 и v2. Мне нужно заменить v1 и v2 в выражении случайным значением из заданного диапазона и сохранить выражение в другой электронной таблице, используя JAVA. Как я могу сделать это, используя JETT?
Например: я должен хранить "Что такое 25% из 50?"
Это то, что я сделал, я могу читать столбец в моей 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());
}
}
}
1 ответ
Во-первых, похоже, что вы вообще не используете JETT. Вы, кажется, пытаетесь прочитать электронную таблицу самостоятельно и выполнить некоторую обработку.
Вот как бы вы сделали это в JETT. JETT не обеспечивает собственную поддержку случайных чисел, но вместе с поддержкой выражений Apache Commons JEXL и собственной Java Random
Вы можете опубликовать ожидаемые диапазоны ваших случайных переменных в виде bean-компонентов в JETT, и вы можете вычислить случайную переменную с помощью выражения.
Во-первых, создайте электронную таблицу шаблонов, заполнив ее выражениями (между ${
а также }
) что JETT оценит. Одна клетка может содержать что-то вроде этого.
Что такое ${rnd.nextInt(v1Max - v1Min + 1) + v1Min}% от ${rnd.nextInt(v2Max - v2Min + 1) + v2Min}?
Затем создайте bean-компоненты для JETT. Эти компоненты являются именованными объектами, которые доступны для выражений 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());
}
В итоговой электронной таблице вы увидите оцененные выражения. Например, в ячейке, содержащей выражения выше, вы увидите:
Что такое 41% из 38?
(Или вы увидите разные числа в зависимости от сгенерированных случайных чисел.)