/**
*
*/
/**
* @author WBY
*
*/
package com;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.threads.JMeterContext;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.visualizers.Sample;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
public class ReadExcelSampler extends AbstractSampler {
private static final long serialVersionUID = 1L;
public final static String FUNCTION = "function";
public final static String sampName = "ReadExcelSampler∏";
private static final String String = null;
private int count =1;
JMeterVariables varp = null;
JMeterContext context = null;
@Override
public SampleResult sample(Entry entry) {
SampleResult result = new SampleResult();
//請求數據
//String requestData ="湖南";
result.setSampleLabel(sampName);
//result.setSamplerData(requestData);
result.setDataEncoding("UTF-8");
result.setDataType("text");
result.sampleStart();
varp = new JMeterVariables();
context = JMeterContextService.getContext();
//System.out.println(this.getProperty(FUNCTION));//輸出GUI界面所輸入的函數方法返回結果
varp = context.getVariables();
//context.setVariables(varp);
//varp.put("myname", requestData);
try {
String path = readPath().trim();
readExcel(path);
} catch (IOException e1) {
e1.printStackTrace();
}
result.sampleEnd();
result.setSuccessful(true);
return result;
}
/*-----------------讀取Excel-------------------------------------*/
public void readExcel(String path) {
ReadExcelSamplerGUI readExcel = new ReadExcelSamplerGUI();
System.out.println("*** this.readExcel Path:"+path+" ***");
Workbook rwb = null;
try {
InputStream is = new FileInputStream(path);
rwb = Workbook.getWorkbook(is);
is.close();
// 這裏有兩種方法獲取sheet表:名字和下標(從0開始)
// Sheet st = rwb.getSheet("original");
// 獲取第一張Sheet表
int sheetNum = readExcel.getFunctionTextField().getSelectedIndex();
System.out.println("*** this.sheetNum:"+sheetNum+" ***");
Sheet rst = rwb.getSheet(sheetNum);
// 獲取Sheet表中所包含的總列數
int rsColumns = rst.getColumns();
// 獲取Sheet表中所包含的總行數
int rsRows = rst.getRows();
// 獲取指定單元格的對象引用
Cell cell = null;
List list = new ArrayList();
//TreeMap map=new TreeMap();
rsRows = this.count += 1;//${__counter(false,test)}
System.out.println("*** this.count :"+this.count+" ***");
String str = "";
for (int i = 0; i < rsRows; i++)// rsRows
{
for (int j = 0; j < rsColumns; j++) {
// 引用方法:第一個變量爲${Excel中的第一行的第一個字段}以此類推。
// 讀取的數據行,第一行爲變量名,第二行及以後爲變量值。
cell = rst.getCell(j, i);
if (i == 0) {
list.add(cell.getContents());
System.out.println(cell.getContents());
continue;
}
varp.putObject(list.get(j).toString(), cell.getContents());
System.out.println(list.get(j) + " , " + cell.getContents());
}
}
} catch (Exception e) {
rwb.close();
System.out.println(e);
}
}
private static String readPath() throws IOException {
StringBuilder result = new StringBuilder();
FileReader fr = new FileReader("./tmp");
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line = bufr.readLine()) != null){
bufr.read();
//System.out.println("line: "+line);
result.append(System.lineSeparator()+line);
}
bufr.close();
return result.toString();
}
}
package com;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.BeanShellInterpreter;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/*
* @author WANGBENYAN 微信: wby-wx 郵箱: [email protected]
*/
public class ReadExcelSamplerGUI extends AbstractSamplerGui {
private static final long serialVersionUID = 1L;
private JComboBox functionTextField = null;
private JTextField UploadText = null;
private JTable table = null;
private JTextArea copyNameText = null;
private JTextField startColTest = null;
private JTextField startRowText = null;
private Object[][] data = {};
private String[] columnNames = {};
private DefaultTableModel model = null;
private boolean DEBUG = true;
public ReadExcelSamplerGUI() {
init();
}
@Override
public void configure(TestElement element) {
//配置組裝元素信息,BeanSheel 中調用print( props.get("FUNCTION"));
super.configure(element);
functionTextField.addItem(element.getPropertyAsString(ReadExcelSampler.FUNCTION));
}
private void init() {
// GridBagLayout 網格佈局;容器的空間劃分成M×N列的網格區域, 每個區域只能放置一個組件。
// 邊界佈局 ;容器劃分爲東、西、南、北、中五個區域,每個區域只能放置一個組件。
// BorderLayout 邊界佈局管理器,
// setBackground(Color.lightGray);
setLayout(new BorderLayout(15, 15));// 組件間橫向、縱向間距均爲15像素
JLabel title = new JLabel(" Excel讀取測試用例");
title.setFont(new Font("微軟雅黑", 1, 14));
// add("North", new JButton("North"));
add("North", title);
setLayout(null);
title.setBounds(10, 30, 200, 20);
setLayout(new BorderLayout(15, 15));
// title.setBackground(Color.green);
JLabel content = new JLabel("※ 注:讀取所有用例,並設置爲全局變量,調用變量直接使用 : {用例字段} ");
content.setForeground(Color.RED);
content.setFont(new Font("微軟雅黑", 1, 12));
content.setBounds(10, 60, 600, 20);// x,y,width,height
add(content);
JLabel path = new JLabel("文件路徑:");
path.setBounds(10, 95, 75, 22);
path.setFont(new Font("微軟雅黑", 1, 12));
add(path);
// JTextField UploadText = new JTextField();
UploadText = new JTextField();
UploadText.setBounds(72, 95, 500, 22);
add(UploadText);
JButton UploadButton = new JButton(" 瀏覽 ");
UploadButton.setFont(new Font("微軟雅黑", 1, 12));
UploadButton.setBounds(575, 95, 70, 20);
add(UploadButton);
// ---------------------------------- 文件上傳功能
UploadButton.addMouseListener(new MouseAdapter() { // 添加鼠標點擊事件
public void mouseClicked(MouseEvent event) {
excelImport();
}
});
JLabel sheet = new JLabel("Sheet 索引序號:");
sheet.setBounds(10, 135, 180, 22);
sheet.setFont(new Font("微軟雅黑", 1, 12));
add(sheet);
// JTextField sheetcount = new JTextField();
functionTextField = new JComboBox();
functionTextField.setBounds(120, 135, 100, 22);
functionTextField.addItem(0);
add(functionTextField);
JLabel startRow = new JLabel("開始行:");
startRow.setBounds(230, 135, 80, 22);
startRow.setFont(new Font("微軟雅黑", 1, 12));
add(startRow);
startRowText = new JTextField();
startRowText.setBounds(282, 135, 100, 22);
startRowText.setText("1");
add(startRowText);
JLabel startCol = new JLabel("結束行:");
startCol.setBounds(390, 135, 100, 22);
startCol.setFont(new Font("微軟雅黑", 1, 12));
add(startCol);
startColTest = new JTextField();
startColTest.setBounds(442, 135, 100, 22);
startColTest.setText("1000");//默認讀取1000條
add(startColTest);
/* JButton saveconfig = new JButton("保存配置");
saveconfig.setBounds(555, 135, 90, 20);
saveconfig.setFont(new Font("微軟雅黑", 1, 12));
add(saveconfig);*/
/*---------------輸出變量名--------------------*/
JLabel copyName = new JLabel("輸出變量名(copy):");
copyName.setBounds(10, 170, 200, 22);
copyName.setFont(new Font("微軟雅黑", 1, 12));
add(copyName);
copyNameText = new JTextArea(3, 20);
copyNameText.setLineWrap(true);// 激活自動換行功能
copyNameText.setWrapStyleWord(true);// 激活斷行不斷字功能
copyNameText.setBackground(Color.white);
copyNameText.setBounds(10, 200, 650, 100);
copyNameText.setFont(new Font("微軟雅黑", 4, 15));
copyNameText.setForeground(Color.blue);
add(copyNameText);
JPanel copyNamePanel = new JPanel();
copyNamePanel.setLayout(null);
copyNamePanel.setBounds(10, 200, 1000, 100);
// copyNamePanel.setBackground(Color.red);
copyNamePanel.add(copyNameText);
JScrollPane jscrollPane = new JScrollPane(copyNameText);
jscrollPane.setBounds(10, 200, 650, 100);
copyNamePanel.add(jscrollPane);
jscrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(jscrollPane, BorderLayout.CENTER);
/*-----------------TestCase---------------*/
JLabel casedata = new JLabel("數據詳情:");
casedata.setBounds(10, 350, 200, 22);
casedata.setFont(new Font("微軟雅黑", 1, 12));
add(casedata);
JButton lookData = new JButton("查看測試結果");
lookData.setBounds(550, 350, 110, 20);
lookData.setFont(new Font("微軟雅黑", 1, 12));
add(lookData);
// ---------------------------------- 打開Excel文件
lookData.addMouseListener(new MouseAdapter() { // 添加鼠標點擊事件
public void mouseClicked(MouseEvent event) {
if(UploadText.getText().equals("")){
JOptionPane.showMessageDialog(null,"文件路徑不能爲空!", "系統提示!", JOptionPane.ERROR_MESSAGE);
}else{
openExcelFile(UploadText.getText());
}
}
});
columnNames = new String[] {};
// 創建顯示數據
data = new Object[][] {};
model = new DefaultTableModel(data, columnNames);
/*
* JTable還提供了一個重載的構造方法,傳入兩個Vector JTable(Vector rowData, Vector columnNames)
*/
table = new JTable(model);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
table.setDefaultRenderer(Object.class, r);
table.getTableHeader().setFont(new Font("微軟雅黑", 1, 13));
// table.setFont(new Font("微軟雅黑", 1, 12));
table.setPreferredScrollableViewportSize(new Dimension(1000, 800));
table.setBackground(Color.yellow);
if (DEBUG) {
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
printDebugData(table);
}
});
}
// 這也是官方建議使用的方式,否則表頭不會顯示,需要單獨獲取到TableHeader自己手動地添加顯示
JPanel centerPanel = new JPanel();
centerPanel.setLayout(null);
centerPanel.setBounds(10, 380, 1100, 810);
// Container contTable = frame.getContentPane();
centerPanel.add(table);
setLayout(new BorderLayout());
// 創建包含表格的滾動窗格
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(10, 380, 1100, 200);
centerPanel.add(scrollPane);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// 定義 topPanel 的佈局爲 BoxLayout,BoxLayout 爲垂直排列
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
// 先加入一個不可見的 Strut,從而使 topPanel 對頂部留出一定的空間
centerPanel.add(Box.createVerticalStrut(190));
// 加入包含表格的滾動窗格
add(centerPanel);
JPanel mainPanel = new JPanel(new GridBagLayout());
mainPanel.setPreferredSize(new Dimension(100, 100));// 使用佈局管理器 設置寬度
// mainPanel.setBackground(Color.pink);
// mainPanel.setBorder(BorderFactory.createTitledBorder("title"));
add(mainPanel);
}
/*-----------------讀取Excel-------------------------------------*/
public void readExcel(String filePath) {
Workbook rwb = null;
try {
InputStream is = new FileInputStream(filePath);
rwb = Workbook.getWorkbook(is);
is.close();
// 這裏有兩種方法獲取sheet表:名字和下標(從0開始)
// Sheet st = rwb.getSheet("original");
// 獲取第一張Sheet表
int sheetNum = functionTextField.getSelectedIndex();
List li = new ArrayList();
functionTextField.removeAllItems();
for(int i =0;i<rwb.getNumberOfSheets();i++){
li.add(i);//獲取sheet數據
functionTextField.addItem(li.get(i));
}
Sheet rst = rwb.getSheet(sheetNum);
functionTextField.setSelectedItem(sheetNum);
// 獲取Sheet表中所包含的總列數
int rsColumns = rst.getColumns();
// 獲取Sheet表中所包含的總行數
int rsRows = rst.getRows();
// 獲取指定單元格的對象引用
Cell cell = null;
List list = new ArrayList();
columnNames = new String[rsColumns];// 表頭
data = new Object[rsRows][rsColumns];// 列表數據
model.setColumnCount(0);// 清空列
model.setRowCount(0);// 清空行
//BeanShellInterpreter interpreter = new BeanShellInterpreter(); // 構造一個解釋器
//interpreter.set("path",UploadText.getText());
//interpreter.source("E:/autoTest/Jmeter/demo/ReadExcel.bsh"); // 導入並執行一個腳本文件
String str = "";
int startcount = (Integer.parseInt(startRowText.getText()));
int endcount = (Integer.parseInt(startColTest.getText()));
for (int i = 0; i < rsRows; i++)// rsRows
{
Vector columnVector = new Vector();
for (int j = 0; j < rsColumns; j++) {
// 引用方法:第一個變量爲${Excel中的第一行的第一個字段}以此類推。
// 讀取的數據行,第一行爲變量名,第二行及以後爲變量值。
cell = rst.getCell(j, i);
if (i == 0) {
list.add(cell.getContents());
System.out.println(cell.getContents());
model.addColumn(cell.getContents());
str += (" ${"+list.get(j)+"}");
continue;
}
//傳值給BeanSheel 調用
//Interpreter.set(list.get(j).toString(),cell.getContents());
//String value=JMeterUtils.getPropDefault("name","");
//傳值給JMeter調用
//JMeterUtils.setProperty(list.get(j).toString(),cell.getContents());
//System.out.println("\nPrint Jmeter: "+JMeterUtils.getProperty(list.get(j).toString()));
columnVector.addElement(cell.getContents());
}
model.addRow(columnVector);// 行
}
copyNameText.setText(str);
for(int i=0;i < rsRows;i++){
if(i < startcount ){
model.getDataVector().removeElementAt(0);
}
if(i > endcount){
model.getDataVector().removeElementAt(1);
}
}
System.out.println(model.getDataVector().toString());
rwb.close();
} catch (Exception e) {
System.out.println(e);
}
}
private void printDebugData(JTable table) {// 打印table 數據
int numRows = table.getRowCount();
int numCols = table.getColumnCount();
javax.swing.table.TableModel model = table.getModel();
System.out.println("TestCase data: ");
for (int i = 0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j = 0; j < numCols; j++) {
System.out.print(" " + model.getValueAt(i, j));
}
System.out.println();
}
System.out.println("----------------------------------------------");
}
/**
* 文件上傳功能
*
* @param developer
* 按鈕控件名稱
*/
public void excelImport() {
JFileChooser chooser = new JFileChooser(new File("D:\\"));//選擇器的初始目錄定爲d盤
chooser.setMultiSelectionEnabled(true);
/** 過濾文件類型 * *//** "Execl files(*.xls|*.xlsx)", "xls", "xlsx" **/
FileNameExtensionFilter filter = new FileNameExtensionFilter("Execl files(*.xls)", "xls");
chooser.setFileFilter(filter);
chooser.showOpenDialog(null);
try {
UploadText.setText(chooser.getSelectedFile().toString());
System.out.println("選擇的文件路徑爲:" + chooser.getSelectedFile().toString());
readExcel(UploadText.getText());
writePath();
} catch (Exception e) {
System.out.println("上傳文件出錯啦...");
}
}
private void writePath() throws IOException {
File fl = new File("./tmp");
FileWriter fileWritter = new FileWriter(fl.getName(),false);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
//System.out.println("*** write Path :"+UploadText.getText());
bufferWritter.write(UploadText.getText());
bufferWritter.flush();
bufferWritter.close();
}
public void openExcelFile(String filePath) {
try {
System.out.println("\nstart Open Excel file ._. ");
Runtime.getRuntime().exec("cmd /c start "+filePath);
} catch (IOException e) {
System.out.println("打開文件異常: "+e);
}
}
@Override
public TestElement createTestElement() {// 創建所對應的Sampler
//創建新的元素
TestElement sampler = new ReadExcelSampler();
modifyTestElement(sampler);
return sampler;
}
@Override
public String getLabelResource() {
// label信息,也就是創建HTTP請求、JAVA請求
return this.getClass().getSimpleName();
}
@Override
public void modifyTestElement(TestElement sampler) {
// 清除舊的組件,從新創建
super.configureTestElement(sampler);
if (sampler instanceof ReadExcelSampler) {
ReadExcelSampler testSmpler = (ReadExcelSampler) sampler;
testSmpler.setProperty(ReadExcelSampler.FUNCTION, functionTextField.getSelectedIndex());
}
}
@Override
public String getStaticLabel() {// 設置顯示名稱
return "ReadExcelSampler∏";
}
private void initFields() {
//functionTextField.addItem("0");
}
@Override
public void clearGui() {
//清除頁面數據信息
super.clearGui();
initFields();
}
public JComboBox getFunctionTextField() {
return functionTextField;
}
public void setFunctionTextField(JComboBox functionTextField) {
this.functionTextField = functionTextField;
}
public JTextField getUploadText() {
return UploadText;
}
public void setUploadText(JTextField uploadText) {
UploadText = uploadText;
}
public JTextField getStartColTest() {
return startColTest;
}
public void setStartColTest(JTextField startColTest) {
this.startColTest = startColTest;
}
public JTextField getStartRowText() {
return startRowText;
}
public void setStartRowText(JTextField startRowText) {
this.startRowText = startRowText;
}
}