Обнаружение и замена переменных в строке значениями

У меня есть лист 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?

(Или вы увидите разные числа в зависимости от сгенерированных случайных чисел.)

Другие вопросы по тегам