浏览 1848 次
锁定老帖子 主题:java实现对Excel文件的存取
精华帖 (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(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |