由于最近在背日语单词,把一些单词录入EXCEL了。通过日语背中文或者通过中文背日语(以隐藏日语或中文列来实现)。但是当看一个单词想不起来是可以不经意的看到前后单词而想起对应的日语或中文,效果欠佳。所以花了半小时写了个功能,目的是把录入的几百个单词随机生成后写成另一个EXCEL文件。用来达到看见日语就能想到中文 看到中文就能想到日文的目的。

原EXCEL形式是: 

A B C D 

日文 中文 自 注释 


日文 中文 注释 


实体类: 


public class Word { 

 private String japanese; 

 private String chinese; 

 private String detail; 

 private boolean isZi; 

 public boolean getIsZi() { 

 return isZi; 

 } 

 public void setIsZi(boolean isZi) { 

 this.isZi = isZi; 

 } 

 public String getJapanese() { 

 return japanese; 

 } 

 public void setJapanese(String japanese) { 

 this.japanese = japanese; 

 } 

 public String getChinese() { 

 return chinese; 

 } 

 public void setChinese(String chinese) { 

 this.chinese = chinese; 

 } 

 public String getDetail() { 

 return detail; 

 } 

 public void setDetail(String detail) { 

 this.detail = detail; 

 } 

 @Override 

 public String toString() { 

 // TODO Auto-generated method stub 

 return "jap:"+japanese+"\tchi:"+chinese+"\tiszi:"+isZi; 

 } 

} 

测试类: 



import java.io.File; 

import java.util.ArrayList; 

import java.util.HashMap; 

import java.util.List; 

import java.util.Map; 


import jxl.Cell; 

import jxl.Sheet; 

import jxl.Workbook; 

import jxl.write.Label; 

import jxl.write.WritableSheet; 

import jxl.write.WritableWorkbook; 


public class Test { 

 //由于最近在背日语单词,把一些单词录入EXCEL了。通过日语背中文或者通过中文背日语(以隐藏日语或中文列来实现)。但是当看一个单词想不起来是可以不经意的看到前后单词而想起对应的日语或中文,效果欠佳。所以花了半小时写了个功能,目的是把录入的几百个单词随机生成后写成另一个EXCEL文件。用来背单词。 

 //原EXCEL形式是 

 //A B C D 

 //日文 中文 自 注释 

 public static void main(String[] args) { 

 try { 

 /* 测试读取(注意:文件路径中的盘符D:/,注意斜杠不要写成反斜杠"\") */ 

 // 如果不存在该文件,返回空并抛出异常 

 File file = new File("D:/test.xls"); 

 List<Word> words= read(file);//读取EXCEL获得单词 

 List<Word> randomWords= randomList(words);//获得打乱顺序的单词 

 /* 测试写入(注意:如果进程中正在运行被写入的文件,将抛出异常) */ 

 // 如果不存在该文件,程序将新建一个同名文件 

 write("D:/testRandom.xls", "Sheet1", 0,randomWords); 

 } catch (Exception e) { 

 System.out.println(e.getMessage()); 

 } 

 } 

 /** 

 * 从LIST随机取出不重复元素,形成一个随机LIST 

 * @param words 

 * @return 

 */ 

 public static List<Word> randomList(List<Word> words){ 

 List<Word> randomList=new ArrayList<Word>(); 

 Map<Integer,String> map = new HashMap<Integer,String>(); 

 int num = words.size(); 

 for (int i = 0; i < num; i++) { 

 int intnum = (int) (Math.random() * words.size()); 

 if (map.size() != 0) { 

 for (int j = 0; j < map.size(); j++) { 

 if (!map.containsKey(intnum)) { 

 randomList.add(words.get(intnum)); 

 map.put(intnum, ""); 

 } 

 } 

 if (map.size() != words.size()) { 

 num++; 

 } 

 } else { 

 map.put(intnum, ""); 

 randomList.add(words.get(intnum)); 

 } 

 } 

 return randomList; 

 } 

 /** 

 * 方法的返回类型是一个String,我定义了一个StringBuffer对象, 大家知道StringBuffer上的主要操作是 append 和 

 * insert 方法,可以重载这些方法,以接受任意类型的数据。 

 * 每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。 append 

 * 方法始终将这些字符添加到缓冲区的末端,这样的话我们在接受返回值的时候就可以方便的取到被转换成String类型的数据了。 

 * 首先我们通过传入的欲读取文件路径,获取工作簿对象,获取工作簿对象之后,我们就可以轻而易举的取到该工作簿内的所有的工作表了, 

 * 我们声明一个工作表类型的数组:Sheet[] sheets = wb.getSheets()以便遍历得到每个工作表内的行数,之后就是行内的单元格, 

 * 单元格再到单元格内的值,整个步骤都是按从大到小的顺利来的,可以说一气呵成,短短的几个循环,搞定。 

 * 

 */ 

 /** 

 * 读 

 * 

 * @param file 

 * 欲读取的Excel文件的路径 

 * @return 

 * @throws Exception 

 */ 

 public static List<Word> read(File file) throws Exception { 

 List<Word> words=new ArrayList<Word>(); 

 Workbook wb = null; 

 try { 

 // 获取工作簿对象 

 wb = Workbook.getWorkbook(file); 

 if (wb != null) { 

 // 获取工作簿对象就可以获取工作簿内的工作表对象 

 Sheet[] sheets = wb.getSheets(); 

 if (sheets != null && sheets.length != 0) { 

 // 遍历工作簿内所有工作表 

 for (int i = 0; i < sheets.length; i++) { 

 Word word=null; 

 // 获取该工作表内的行数 

 int rows = sheets[i].getRows(); 

 // 遍历行 

 for (int j = 0; j < rows; j++) { 

 word=new Word(); 

 word.setIsZi(false); 

 // 获取当前行的所有单元格 

 Cell[] cells = sheets[i].getRow(j); 

 if (cells != null && cells.length != 0) { 

 // 遍历单元格 

 for (int k = 0; k < cells.length; k++) { 

 // 获取当前单元格的值 

 String cell = cells[k].getContents(); 

 // 缩进 

 if (k==0) { 

 word.setJapanese(cell); 

 }else if (k==1) { 

 word.setChinese(cell); 

 }else if (k==2) { 

 if ("自".equals(cell)) { 

 word.setIsZi(true); 

 } 

 } 

 } 

 } 

 words.add(word); 

 } 


 } 

 } 

 System.out.println("成功读取了:" + file + "\n"); 

 } 

 } catch (Exception e) { 

 System.out.println(e.getMessage()); 

 } finally { 

 wb.close(); 

 } 

 return words; 

 } 


 /** 

 * 我们看到在方法首行定义了一个WritableWorkbook 对象,WritableWorkbook 实际上就是一个写工作簿对象, 

 * 同样我们要先获取一个工作簿,传入的文件路径,将欲读取的文件赋给WritableWorkbook 对象,这样我们就可以获取工作簿内的工作表了, 

 * 得到工作表就好办了,我们通过调用WritableWorkbook 对象的createSheet()方法,传入工作表名和该表的所在位置, 

 * 成功得到工作表后就开始在该工作表内添加表结构,这里我写的是五行五列,可以根据自己的实际要求改一下就OK,那么Label是一个什么东西呢? 

 * Label实际上就是一个填充单元格的对象,通过指定的行和列及需要填充的内容,最后将被写入数据的单元格添加到工作表中就大功告成了。 

 * 最后一步调用WritableWorkbook 的write()方法将写入内存的数据写入到文件即可。Over!!! 

 */ 

 /** 

 * 写 

 * 

 * @param fileName 

 * 被写入的Excel文件的路径 

 * @param sheetName 

 * 被写入的Excel文件的工作表 

 * @param location 

 * 被写入的Excel文件的工作表位于工作簿的位置 

 * @throws Exception 

 */ 

 public static void write(String fileName, String sheetName, int location,List<Word> words) 

 throws Exception { 

 WritableWorkbook wwb = null; 

 Label label = null; 


 try { 

 // 创建可写入的工作簿对象 

 wwb = Workbook.createWorkbook(new File(fileName)); 

 if (wwb != null) { 

 // 在工作簿里创建可写入的工作表,第一个参数为工作表名,第二个参数为该工作表的所在位置 

 WritableSheet ws = wwb.createSheet(sheetName, location); 

 if (ws != null) { 

 /* 添加表结构 */ 

 // 行 

 for (int i = 0; i < words.size(); i++) { 

 // 列 

 for (int j = 0; j < 4; j++) { 

 Word word=words.get(i); 

 // Label构造器中有三个参数,第一个为列,第二个为行,第三个则为单元格填充的内容 

 if (j==0) {//写japanese 

 label = new Label(j, i, word.getJapanese()); 

 }else if (j==1) {//写Chinese 

 label = new Label(j, i, word.getChinese()); 

 }else if (j==2) {//写是否用于动词并只是自动词 

 if (word.getIsZi()) { 

 label = new Label(j, i,"自"); 

 }else { 

 label = new Label(j, i,"");//必须要写,否则打开格式无效 

 } 

 }else if (j==3) {//写detail 

 label = new Label(j, i, word.getDetail()); 

 } 

 // 将被写入数据的单元格添加到工作表 

 ws.addCell(label); 

 } 

 } 

 // 从内存中写入到文件 

 ws.setColumnView(1, 0);//隐藏中文列 

 wwb.write(); 

 } 

 System.out.println("路径为:" + fileName + "的工作簿写入数据成功!"); 

 } 

 } catch (Exception e) { 

 System.out.println(e.getMessage()); 

 } finally { 

 wwb.close(); 

 } 

 } 

}