JAVA读取Excel中内容(HSSF和Workbook两种方法)
内容添加,以前是用的HSSF,前几天帮同学写一个统计表用了Workbook,现在码一下。
---新内容(Workbook)---
同学要统计一个xls表格,让表1里面的某一列内容对表2里面的每列进行匹配,匹配到第1列,在表1的另一列对应行设置1,就是一个简单的读取。要导入一个jxl操作包,这个包是专门对execel进行操作的。下面是代码。
1 import java.io.File; 2 import jxl.Sheet; 3 import jxl.Workbook; 4 import jxl.write.Label; 5 import jxl.write.WritableSheet; 6 import jxl.write.WritableWorkbook; 7 8 public class New { 9 public static void main(String args[]) { 10 try { 11 long stime=System.currentTimeMillis(); 12 boolean flag=false;//设置检查标记 13 long count=0;//设置计数 14 15 Workbook bookResource = Workbook.getWorkbook(new File("resource.xls"));//打开表1 16 Workbook bookKeyWordLib = Workbook.getWorkbook(new File("keyWordLibNew.xls"));//打开表2 17 18 Workbook wb = Workbook.getWorkbook(new File("resourceWrite.xls"));//打开表3 19 // // 打开一个文件的副本,并且指定数据写回到原文件 20 WritableWorkbook book = Workbook.createWorkbook(new File("resourceWrite.xls"), 21 wb); 22 // // 添加一个工作表 23 WritableSheet sheet3 = book.getSheet(0); 24 25 26 // 获得第一个工作表对象 27 Sheet sheet1 = bookResource.getSheet(0); 28 Sheet sheet2 = bookKeyWordLib.getSheet(0); 29 30 // 得到第一列第一行的单元格 31 //行数 sheet1.getRows(); 32 //列数 sheet1.getColumns(); 33 34 for(int i=1;i<sheet1.getRows();i++)//对表1的每行进行循环 35 { 36 37 flag=false;//标记为false表示该行没有被检查或者检查过但是没有填值 38 for(int columns=0;columns<sheet2.getColumns();columns++)//取表2的列数作为限制 39 { 40 if(flag) 41 { 42 break; 43 }//该行检查过并且已经有值 检查下一行 44 45 for(int rows=1;rows<sheet2.getColumn(columns).length-1;rows++)//取表2每列的行数作为限制条件 46 { 47 if(sheet1.getCell(11, i).getContents().contains( 48 sheet2.getCell(columns, rows).getContents()))//匹配对应单元格的内容 49 { 50 51 52 sheet3.addCell( 53 new Label(9, i, new String(((Integer)(columns+1)).toString())));//设置对应单元格内容 54 System.out.println(columns+" "+rows); 55 count++; 56 flag=true;//标记为true 57 break; 58 } 59 60 } 61 } 62 } 63 book.write(); 64 65 System.out.println(count); 66 67 bookResource.close(); 68 bookKeyWordLib.close(); 69 book.close(); 70 wb.close();//关闭所有表 否侧表格会损坏 71 long etime=System.currentTimeMillis(); 72 System.out.println(etime-stime); 73 } catch (Exception e) { 74 System.out.println(e.toString()); 75 76 } 77 } 78 }
这里用的时候要注意,目前我用的时候只能对xls进行操作,csv和xlsx等都暂时不行。
---旧内容(HSSF)---
台科JAVA的第一次作业是用Arrays.sort来排序一个Excel表格。老师已经给过Arrays.sort排序的一个例子了,看懂就行,只要能把Excel的导入JAVA就行。网上给出的方法是用POI(Apache POI),是一个JAVA的API for Microsoft Documents,也就是office都可以用这个POI来操作。
在完成这次作业的过程中也把以前不知道的Project,Packet,Class等几个名字分清楚了,会往Project里面添加jar包了。library是类库,是jar包的集合,而jar是class的集合。比如需要import.java.uitl.*;时就是把一个jar包引用进来,也就是jar包里面的class文件。
引用了一个Apache POI的jar,用的是3.0版本的。
package poi; import java.util.Arrays; import java.util.Comparator; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFCell; import java.io.FileInputStream; class Member { String CityName; int NumTravel; public Member(String f, int h) { CityName = f; NumTravel = h; } public String toString() { return CityName + ":"+ " " + NumTravel; } } //人數比較 class NumTravelComparator implements Comparator<Member> { @Override public int compare(Member a, Member b) { return b.NumTravel - a.NumTravel; } } public class CompDemo { public static String fileToBeRead = "D:\\travel.xls";//要打開的Excel的位置 public static void main(String[] args) { //對Excel的讀取 try { // 創建對Excel工作簿文件的引用 HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead)); // 創建對工作表的引用 HSSFSheet sheet = workbook.getSheet("Sheet1");//讀取第一張工作表 Sheet1 Member members[] = new Member[36];//共36行數據 int j,i; for(j=1; j<13; j++){ for(i=0; i<36; i++){ HSSFRow row = sheet.getRow(i+1);//Row HSSFCell cell = row.getCell((short)0);//Cell @SuppressWarnings("deprecation") String s=cell.getStringCellValue();//读取单元格String内容 row = sheet.getRow(i+1);//Row cell = row.getCell((short)j);//Cell int n=(int)cell.getNumericCellValue();//读取单元格Number内容 members[i]= new Member(s, n);//讀取的CityName和NumTravel放入members數組中 } if(i==0||j==1){ for (Member member : members) { System.out.println(member); } System.out.println("\n-------------");//顯示所有原始數據 } System.out.println(""); NumTravelComparator c1 = new NumTravelComparator(); Arrays.sort(members, c1);//Arrays.sort排序 System.out.println(2001+j);//年份输出 int m=0; for (Member member : members) { if(m==5)break; m++; System.out.println(member); } System.out.println("\n*************");//輸出人數最多的五個 }//第一個排序 for(i=0; i<36; i++){ HSSFRow row = sheet.getRow(i+1);//Row HSSFCell cell = row.getCell((short)0);//Cell @SuppressWarnings("deprecation") String s=cell.getStringCellValue();//读取单元格String内容 int n=0; for(j=8;j<13;j++){ row = sheet.getRow(i+1);//Row cell = row.getCell((short)j);//Cell n+=(int)cell.getNumericCellValue();//读取单元格Number内容并累加 } members[i]= new Member(s, n); } System.out.println(""); NumTravelComparator c1 = new NumTravelComparator(); Arrays.sort(members, c1);//排序 System.out.println("total"); int m=0; for (Member member : members) { if(m==5)break; m++; System.out.println(member); } System.out.println("\n*************");//輸出人數總和最多前五 }//第二个排序 catch (Exception e) { System.out.println("已运行xlRead() : " + e); } } }