ReadExcelSampler

/**
 * 
 */
/**
 * @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;
	}



}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章