您的位置:首页 > 其它

使用jxl.jar操作Excel,效率提高

2009-12-01 17:47 633 查看
一次银行项目中,因为要做到全英文界面,手头的多语言和翻译的英文文档要一一匹配过来,起初我耐着性子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:

源数据 1.xls

3.JPG:

修改前2.xls

2.JPG:

修改后 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

最后推荐一个博客作者关于jxl.jar的一个例子:http://playboy1987228.javaeye.com/blog/434671
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: