2014-12-22 76 views
0

我有一張Excel表格,其第一列包含以下數據「什麼是$ {v2}的$ {v1}?」,此表中還有兩列(v1和v2)包含{「type」:「int」,「minimum」:15,「maximum」:58}和{「type」:「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()); 
    } 
    } 
} 

回答

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%?

(或者,你會看到不同的號碼,根據產生的隨機數。)