论坛首页 Java企业应用论坛

java实现对Excel文件的存取

浏览 1848 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-14   最后修改:2010-03-27
javaeye 写道
      经过了一个下午的研究终于把java实现对Excel文件的存取有了一定的了解,现在发表出来,给大家参看参考,共同学习下,还请高手们指点指点。O(∩_∩)O。
注:试验用的Excel文件大家可以下下载。


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Boolean;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
 * 我想大家作为微软的忠实使用者,不用excel是那是不太可能的,但是要用java操作
 * 
 * excel表格,使用jdk自己的东西可能是不太可能的,因为我们水平可能还不够高吧。
 * 
 * 本类是用来操作excel表的,包含读取excel表,创建excel表 和 更新 excel表。
 * 
 * 要操作excel表,开源社区里好像有很多包,这里是用的是jxl包,这个是第三方的包,
 * 
 * 在开源社区里面有下,大家也可以到他们的官网上下载最新版的jxl.jar包,地址是:
 * 
 * http://sourceforge.net/project/showfiles.php?group_id=79926
 * 
 * @author LoongHua
 *
 */

public class JxlDemo {

	private final static String filePath="d:/test.xls";
	
	/**
	 * 
	 * 下面是要读取excel文件。
	 * 
	 */
	public static void readExcel() {
		
		File file=null;//声明一个文件对象。
		InputStream is=null;//声明一个输入流。
		Workbook rwb=null;//声明一个工作簿。
		Sheet sht=null;//声明一个工作表。
		
		try {
			file=new File(filePath);
		
			
//			读取文件时,应该先判断文件是否存在,要养成好习惯。
			if(!file.exists()){
				System.out.println("需要读入的excel文件不存在!");
				return ;//之间推出函数。
			}
			
//			两种得到workbook对象的方法:一是通过流的方式,二是通过得到文件的方式。
//			在得到工作簿的时候,要调用他们的工厂方法,不能之间用构造函数,要注意哦。
//			rwb = Workbook.getWorkbook(is);
//			is = new FileInputStream(file);

			rwb = Workbook.getWorkbook(file);
			
			//得到一个工作簿,有两种方式:一是通过工作表的索引,二是通过工作表的表明。
			sht = rwb.getSheet("人员工资");
//			sht=rwb.getSheet(0);
			
			Cell cell=null;//声明一个单元格。
			
			String str = null;//字符串类型。
			double num = 0.00;//双精度型。
			Date date = null;//日期型。
			
			//得到列数。
			int cols=sht.getColumns();
			//得到行数。
			int rows=sht.getRows();

			for (int i = 0; i < cols; i++) {
				
				for (int j = 0; j < rows; j++) {
					
//					根据列行坐标得到单元格对象。
//					在getCell函数中,第一个参数是列号:从0开始;第二个是行号:从0开始。
//					也可以通过单元格的名字得到单元格对象:Cell c11=sht.getCell("cellname");
					cell=sht.getCell(i,j);
					
					//判断单元格内容的类型是否为标签型:对应java的String型。
					if (cell.getType() == CellType.LABEL) {
						//把单元格强转成标签型单元格。
						LabelCell label = (LabelCell) cell;
						//得到单元格的内容。
						str = label.getString();
						
						System.out.println("Cell("+i+", "+j+")" + " value : " + str+ "; type : " + cell.getType());
					}
					//判断单元格内容的类型是否为数字型:对应java的int等类型。
					if (cell.getType() == CellType.NUMBER) {
						//把单元格强转成标数字型单元格。
						NumberCell numc = (NumberCell) cell;
						//得到单元格的数值。
						num = numc.getValue();
						
						System.out.println("Cell("+i+", "+j+")" + " value : " + num+ "; type : " + cell.getType());

					}
					//判断单元格内容的类型是否为日期型:对应java的Date等类型。
					if (cell.getType() == CellType.DATE) {
						//把单元格强转成标日期型单元格。
						DateCell datec = (DateCell) cell;
						//得到单元格的日期。
						date = datec.getDate();
						
						System.out.println("Cell("+i+", "+j+")" + " value : " + date+ "; type : " + cell.getType());

					}
					
				}
			}
					
			//得到一列中所有的单元格。
			Cell[] colcells=sht.getColumn(1);
			
			for (int i = 0; i < colcells.length; i++) {
				//之间用单元对象得到其内容。
				System.out.println(colcells[i].getContents());
			}
			
			//得到一行中所有的单元格。			
			Cell[] rowcells=sht.getRow(1);
			
			for (int i = 0; i < rowcells.length; i++) {
				//之间用单元对象得到其内容。
				System.out.println(rowcells[i].getContents());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			try {
				//关闭工作簿,这个是非常重要的,如果不进行这部,很容易把excel文件破坏。
				
				//如果是很重要的文件,你的麻烦就大了。关闭语句最好是写在finnally语句块中。
				rwb.close();
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}

	/**
	 * 
	 * 下面是要创建excel文件。
	 * 
	 */
	public static void createExcel(){
		
		WritableWorkbook ww=null;
		WritableSheet ws=null;
		
		try {			
			String filepath="d:test1.xls";
			File file=new File(filepath);
			
			if(file.exists()){
				System.out.println("该文件不存在,将由WritableWorkbook对象来创建。");
			}
			
			//创建excel文件时,只能用WritableWorkbook类,不能用Workbook,它只能读excel文件。
			//创建WritableWorkbook对象要使用Workbook的工厂方法,不能用构造方法,这方法是受保护的。
			ww=Workbook.createWorkbook(file);
			
			//创建可写的工作表对象。以下是创建“公司部门”表。方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,
			ws=ww.createSheet("公司部门", 0);
			
			
			//1.添加Label对象
			Label labelC = new Label(0, 0, "This is a Label cell");
			ws.addCell(labelC);
			
			//添加带有字型Formatting的对象
			WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
			WritableCellFormat wcfF = new WritableCellFormat(wf);
			Label labelCF = new Label(1, 0, "This is a Label Cell", wcfF);
			ws.addCell(labelCF);
			
			//添加带有字体颜色Formatting的对象
			WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
			UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
			WritableCellFormat wcfFC = new WritableCellFormat(wfc);
			Label labelCFC = new Label(1, 0, "This is a Label Cell", wcfFC);
			ws.addCell(labelCFC);
			
			//2.添加Number对象
			Number labelN = new Number(0, 1, 3.1415926);
			ws.addCell(labelN);
			
			//添加带有formatting的Number对象
			NumberFormat nf = new NumberFormat("#.##");
			WritableCellFormat wcfN = new WritableCellFormat(nf);
			Number labelNF = new Number(1, 1, 3.1415926, wcfN);
			ws.addCell(labelNF);
			
			//3.添加Boolean对象
			Boolean labelB = new Boolean(0, 2, false);
			ws.addCell(labelB);
			
			//4.添加DateTime对象
			DateTime labelDT = new DateTime(0, 3, new java.util.Date());
			ws.addCell(labelDT);
			
			//添加带有formatting的DateFormat对象
			DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
			WritableCellFormat wcfDF = new WritableCellFormat(df);
			DateTime labelDTF = new DateTime(1, 3, new java.util.Date(), wcfDF);
			ws.addCell(labelDTF);
		
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		finally{
			try {
				if(ww!=null){
					ww.write();
					ww.close();
				}
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}
		
	}
	
	/**
	 * 
	 * 下面是要更新一个数字型单元格,更新一个标签的单元格。
	 * 
	 */
	public static void updateExcle(){
		
		File file=null;
		OutputStream os=null;
		Workbook rwb=null;
		WritableWorkbook ww=null;
		WritableSheet ws=null;
		
		try {
			
			file=new File(filePath);
			
			if (!file.exists()){
				System.out.println("需要被更新的文件不存在,程序终止运行!");
				return ;
			}
		
			//下面三行放在一起是有原因的,我们使用jlx包来操作excel文件,就必须要这样做。
			//先把该文件读到内存,然后再覆盖的方式,这样就更新了该excel文件。必须记住哦。
			
			rwb=Workbook.getWorkbook(file);			
			os=new FileOutputStream(file);
			ww=Workbook.createWorkbook(os, rwb);
			
			ws=ww.getSheet("人员工资");//得到要更新的工作簿的工作表。

			
			//这里是更新数字型的单元格。
			//得到需要更新的单元格,这里都必须是可写的。
			WritableCell wc=ws.getWritableCell(1, 2);
			
			//注意以下if..else..里面写法不同,实现的功能也不同哦。
			//第一个是向空单元格中加入内容,字体等样式是jlx包默认的。
			//第二个是向有内容的单元格中更新内容,字体样式和之前的一样。
			if(wc.getType()==CellType.EMPTY){
				Number num=new Number(1,2,5000);
				ws.addCell(num);
			}
			else{
				if(wc.getType()==CellType.NUMBER){
					Number num=(Number)wc;
					num.setValue(5000);
					System.out.println("修改数字型的单元格成功!");
				}
			}
			
			
			//这里是更新标签型的单元格。
			WritableCell wc1=ws.getWritableCell(0, 3);
			
			//注意以下if..else..里面写法不同,实现的功能也不同哦。
			//第一个是向空单元格中加入内容,字体等样式是jlx包默认的。
			//第二个是向有内容的单元格中更新内容,字体样式和之前的一样。
			if(wc1.getType()==CellType.EMPTY){
				Label lab=new Label(0,3,"合计");
				ws.addCell(lab);
				System.out.println("添加标签型的单元格成功!");
			}
			else{
				if(wc1.getType()==CellType.LABEL){
					Label lab=(Label)wc1;
					lab.setString("合计");
					System.out.println("修改标签型的单元格成功!");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			try {
				if(ww!=null){
					ww.write();
					ww.close();
				}
				if(rwb!=null){
					rwb.close();
				}
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}
	}
		
	public static void main(String[] args) {
//		以下三个方法一个一个执行,观察下效果更好些。
		readExcel();
//		createExcel();
//		updateExcle();
	}
}

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics