一次银行项目中,因为要做到全英文界面,手头的多语言和翻译的英文文档要一一匹配过来,起初我耐着性子2个小时也处理不到200个,是在是太慢了,在自己的百宝箱子里找了下,随即用jxl.jar写了一段代码,处理将2个Excel的多语言文件整合到一起,保证不出错和速度,并且标注那些事程序处理过的多语言。代码不到一个小时写完,本来3个人需要近2天的工作量,不到三分钟就over。偷懒真的是程序员第一美德,如何运用我们已知的知识,来简化我们日常的工作量,提高效率,这是我从这件事情上获得的收获,下面将代码献丑,一起学习jxl,熟练操作Excel,我想有一天我们再次处理Excel中的数据的时候,不头痛

   

   测试需要2个Excel,2个Excel必须保证有2列数据,如,1.xls里有A列B列第一行数据分别是A1,TEST1,那么2.xls必须保证有2列数据,假如C列和D列的任意一行有数据A1,HELLO  , A1是替换的关键字,我截了个图,附件1.jpg是源数据,3.jpg是修改前,2.jpg是修改后的数据。1.jgp是1.xls中数据 ,3.jpg和2.jpg都是2.xls 

1.JPG:             

execjs java 版本_hashmap

                  源数据 1.xls

 

3.JPG:            

execjs java 版本_string_02

                     修改前2.xls

 

2.JPG:           

execjs java 版本_execjs java 版本_03

                       修改后 2.xls

1.公共读取Excel方法类:

/** *  */package com.vteam.mul;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import jxl.Cell;
import jxl.CellType;
import jxl.LabelCell;
import jxl.Sheet;
import jxl.Workbook;

/**
 * @作者 Jarvis
 * @创建日期 Nov 19, 2009
 * @版本 V 1.0
 */

public class ReadExcel {

	/**
	 * @param args
	 */
	private String ExcelPath ;
	private HashMap ExcelMap ;
	private int column1 ;//指定读取列1 从0 开始
	private int column2 ;//指定读取列2 从0 开始
	private int rowStart;//读取起始行下标 从0 开始
	private String sheetno;
	public ReadExcel(){
		
	}
	public ReadExcel(String ExcelPath){
		this.ExcelPath = ExcelPath ;
	}
/**
 * 读取Excel 按照sheet名称顺序读取
 * 需要设置Excel路径ExcelPath,读取起始行rowStart,读取的2列column1和column2
 * @return
 */
	public HashMap Readexcel(){
		 try
	       {	
			   ExcelMap = new HashMap();//存储 中文key-英文value	
			   File file = new File(this.ExcelPath);
	           Workbook rwb = Workbook.getWorkbook(file);
	           String[] sheets = rwb.getSheetNames();//获取所有的sheet名称
//	           Sheet st = rwb.getSheet(this.getSheetNo()) ;//下标获取表名,从0开始
	           for(int i = 0 ; i< sheets.length ; i++){	   
	        	   if("page".equals(sheets[i])){
	        		   continue ;
	        	   }
	        	   Sheet st = rwb.getSheet(sheets[i]);//sheet名称获取方式	    
	        	   int row = st.getRows(); // /得到该sheet的行数
	        	   int starrow = this.rowStart ;
	        	   Cell key = null ;
	        	   Cell value = null ;
	        	   LabelCell labelkey = null ;
	        	   LabelCell labelvalue = null ;
	        	   while(starrow < row ){        
	        		   key = st.getCell(this.getColumn1(),starrow);//第一个参数代表列 第二个参数代表行
	        		   value = st.getCell(this.getColumn2(),starrow);
	        		   //通用的获取cell值的方式,返回字符串
	        		   String keyStr = key.getContents();
	        		   String valueStr = value.getContents();
	        		   //获得cell具体类型值的方式
	        		   if(key.getType() == CellType.LABEL)
	        		   {
	        			   labelkey = (LabelCell)key;
	        			   keyStr = labelkey.getString();
	        		   }
	        		   if(value.getType() == CellType.LABEL)
	        		   {
	        			   labelvalue = (LabelCell)value;
	        			   valueStr = labelvalue.getString();
	        		   }
	        		   ExcelMap.put(keyStr,valueStr );//存储中文-英文
	        		   starrow ++ ;//递增
	        	   }
	        	   System.out.println("从Excel文件:< "+this.ExcelPath+" >的sheet:["+sheets[i]+"]读取多语言共<"+starrow+">行");
	        	   
	        	  }
	           rwb.close();	  //关闭        
	           
	     }catch(Exception e){
	           e.printStackTrace();
	       }

	       return ExcelMap ;
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ReadExcel re = new ReadExcel();
		re.setExcelPath("E:/HK_CMBzl/CSPS_CMBHK_MUL_091119.xls");
		re.setColumn1(3);//读取列1
		re.setColumn2(5);//读取列 2
		re.setRowStart(1);//读取起始行
		HashMap map = re.Readexcel();
		Set set = map.keySet();
		Iterator it = set.iterator();
		while(it.hasNext()){
			String key = (String)it.next();
			System.out.println(">> "+map.get(key));
		}
	}
//	setter && getter-------------------start
	public String getExcelPath() {
		return ExcelPath;
	}	
	public void setExcelPath(String excelPath) {
		ExcelPath = excelPath;
	}
	public HashMap getExcelMap() {
		return ExcelMap;
	}

	public void setExcelMap(HashMap excelMap) {
		ExcelMap = excelMap;
	}

	public int getColumn1() {
		return column1;
	}
	public void setColumn1(int column1) {
		this.column1 = column1;
	}
	public int getColumn2() {
		return column2;
	}
	public void setColumn2(int column2) {
		this.column2 = column2;
	}
	
	public int getRowStart() {
		return rowStart;
	}
	public void setRowStart(int rowStart) {
		this.rowStart = rowStart;
	}	

	//setter && getter-------------------end	
}

2.修改Excel类:

 

/** *  */package com.vteam.mul;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import jxl.Cell;
import jxl.CellType;
import jxl.LabelCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
 * @作者 Jcuckoo
 * @创建日期 Nov 19, 2009
 * @版本 V 1.0
 */

public class WriteExcel {

	/**
	 * @param args
	 */
	private String ExcelPath ;//英文Excel路劲	
	private String MulPath ; //多语言文件路径
	private HashMap MulExcel ;//读取写入Excel文本内容
	
	private int Mcolumn1 ;//指定被修改Excel读取列1 从0 开始
	private int Mcolumn2 ;//指定被修改Excel读取列2 从0 开始
	private int MrowStart;//读取修改起始行下标 从0 开始
	
	private int Rcolumn1 ;//指定数据来源Excel读取列1 从0 开始
	private int Rcolumn2 ;//指定数据来源Excel读取列2 从0 开始
	private int RrowStart;//读取起始行下标 从0 开始
	
    public WriteExcel(){
    	
    }
    public WriteExcel(String ExcelPath){
    	this.ExcelPath = ExcelPath ;
    }
	//setter && getter-------------------start
	public String getExcelPath() {
		return ExcelPath;
	}
	public void setExcelPath(String excelPath) {
		ExcelPath = excelPath;
	}
	public HashMap getMulExcel() {
		return MulExcel;
	}
	public void setMulExcel(HashMap mulExcel) {
		MulExcel = mulExcel;
	}	
	public int getMcolumn1() {
		return Mcolumn1;
	}
	public void setMcolumn1(int mcolumn1) {
		Mcolumn1 = mcolumn1;
	}
	public int getMcolumn2() {
		return Mcolumn2;
	}
	public void setMcolumn2(int mcolumn2) {
		Mcolumn2 = mcolumn2;
	}
	public int getMrowStart() {
		return MrowStart;
	}
	public void setMrowStart(int mrowStart) {
		MrowStart = mrowStart;
	}
	public int getRcolumn1() {
		return Rcolumn1;
	}
	public void setRcolumn1(int rcolumn1) {
		Rcolumn1 = rcolumn1;
	}
	public int getRcolumn2() {
		return Rcolumn2;
	}
	public void setRcolumn2(int rcolumn2) {
		Rcolumn2 = rcolumn2;
	}
	public int getRrowStart() {
		return RrowStart;
	}
	public void setRrowStart(int rrowStart) {
		RrowStart = rrowStart;
	}
	public String getMulPath() {
		return MulPath;
	}
	public void setMulPath(String mulPath) {
		MulPath = mulPath;
	}
	
	//setter && getter-------------------end
	
	public void ModifyExcel(){
		try{
			System.out.println("--------读取英文Excel开始,加载中 ... ...");
			ReadExcel rexceleng = new ReadExcel();
			rexceleng.setExcelPath(this.getExcelPath());	
			rexceleng.setColumn1(this.getRcolumn1());//读取列1
			rexceleng.setColumn2(this.getRcolumn2());//读取列2
			rexceleng.setRowStart(this.getRrowStart());//读取起始行
			HashMap engmap =  rexceleng.Readexcel();//读取英文Excel
			System.out.println("--------读取英文Excel结束... ...");
			
			System.out.println("... ....读取多语言Excel开始,加载中... ...");
			ReadExcel rexcel = new ReadExcel();
			rexcel.setExcelPath(this.getMulPath());	
			rexcel.setColumn1(this.Mcolumn1);//读取列1
			rexcel.setColumn2(this.Mcolumn2);//读取列2
			rexcel.setRowStart(this.MrowStart);//读取起始行
			HashMap mulmap =  rexcel.Readexcel();//读取Excel
			System.out.println("... ....读取多语言Excel结束... ...");
			mulmap =  mapCompare(engmap,mulmap);//英文转换开始
			
			File efile = new File(this.getMulPath());
			 // Excel获得文件   
	        Workbook wb = Workbook.getWorkbook(efile);
	        String[] sheets = wb.getSheetNames() ;
	        
	        System.out.println("修改Excel开始,请等待... ...");
            // 打开一个文件的副本,并且指定数据写回到原文件   
	        WritableWorkbook book = wb.createWorkbook(efile, wb);   
	        for(int j = 0 ; j < sheets.length ; j ++){	        	
	        	WritableSheet sheet = book.getSheet(sheets[j]);
	        	int rows = sheet.getRows();
	        	int rowst = this.getMrowStart() ;
	        	Cell celltemp = null ;
	        	while(rowst < rows ){
	        		celltemp = sheet.getCell(this.Mcolumn1,rowst);
	        		String teStr = null ;
	        		if(celltemp.getType() == CellType.LABEL){//类型匹配
	        			LabelCell labelkey = (LabelCell)celltemp;
	        			teStr = labelkey.getString();
	        		}
	        		if((teStr != null  || teStr != "") && mulmap.get(teStr)!= null ){        			
	        			//替换英文为红色字体
	        			WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,
	        					UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED);
	        			WritableCellFormat  wcfFC = new WritableCellFormat(wfc);
	        			Label label = new Label(this.getMcolumn2() ,rowst , (String)mulmap.get(teStr),wcfFC );
	        			//修改指定第Mcolumn2的数据
	        			sheet.addCell(label);           		 
	        		}
	        		rowst ++ ;
	        	}
	        }
	        book.write();  
	        book.close();  
	        wb.close();
            System.out.println("修改Excel结束... ...");
			
		} catch(Exception e)
	       {
	           e.printStackTrace();
	       }
	}
	/**
	 * 	将英文map的数据复制到多语言map
	 **/
	public HashMap mapCompare(HashMap engMap , HashMap Mulmap){
		HashMap map = new HashMap();
		Set engset = engMap.keySet();//遍历英文源map
		Iterator engit = engset.iterator();
		int i = 0;
		while(engit.hasNext()){
			String engkey = (String)engit.next();
			String mulstr = (String)Mulmap.get(engkey);
			if(mulstr != null || mulstr != "" ){
				map.put(engkey, engMap.get(engkey));
				 i++;
				Mulmap.remove(engkey);//找到匹配的英文后移除操作
			}else{
				Mulmap.remove(engkey);
			}
			
		}
		Mulmap.clear();//匹配结束  多语言Map清空
		  System.out.println("共找到 【 "+i+" 】 个匹配的中文多语言已翻译为英文");
		return map ;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WriteExcel writeexcel = new WriteExcel();
		
		writeexcel.setExcelPath("E:/1.xls");//英文Excel路径
		writeexcel.setMulPath("E:/2.xls");//多语言Excel路径
		writeexcel.setRcolumn1(0);//英文Excel 读取列1 下表 从0开始
		writeexcel.setRcolumn2(1);//英文Excel 读取列2 下表 从0开始
		writeexcel.setRrowStart(0);//英文Excel 起始行 下标 从0开始
		
		writeexcel.setMcolumn1(0);//多语言Excel 读取列1 下表 从0开始
		writeexcel.setMcolumn2(1);//多语言Excel 读取列2 下表 从0开始
		writeexcel.setMrowStart(0);//多语言Excel 起始行 下标 从0开始
		
		writeexcel.ModifyExcel();
	}
	

}

 

完毕,例子需要jxl.jar包支持,1.4以上的 不要超过2.0