由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现。支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL。

总体来说,二者的区别是:JXL较为轻量级,如果是对Excel文件的简单操作,建议使用JXL;POI的功能相当强大,但同时处理问题也相当的繁琐。

1.准备工作

  【必需】下载JXL的jar包:jxl.jar

  【非必需】JXL API  (提取密码:zgqj)

2.一些必要的说明

  主要是对Excel结构的说明:

  •   Excel后缀为xls或者xlsx  —— Excel文件对应JXL的WritableWorkbook类。
  •   Excel中可以有多个工作表(也就是左下角的sheet*,见下表) —— 对应JXL的WritableSheet类。

      aaarticlea/png;base64,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" alt="" />

  •   Excel单元格相当于矩阵,有自己的行、列 —— 对应JXL的Cell类。

3.开始编程

  封装了4个方法:

public static void writeExcel(String fileName); —— 写Excel文件
public static String readExcel(File file); —— 读取Excel文件
public static Boolean searchKeyWord(File file, String keyWord); —— 搜索Excel文件中是否包含关键字
public static void insertImage(WritableSheet sheet,int col, int row,int width, int height,File imageFile); —— 向Excel中插入图片(仅限png格式的图片,其余格式如jgp、gif等暂不支持)

 package com.myeclipse;

 import java.io.File;
import java.io.IOException; import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException; /**
* 使用JXL对Excel文件进行操作
* @author MrChen
*
*/
public class JXLOperateExcel {
/**
* 写入Excel
* @param fileName 要生成的Excel文件名字
*/
public static void writeExcel(String fileName) {
//1.使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
WritableWorkbook wwb = null;
try {
wwb = Workbook.createWorkbook(new File(fileName));
} catch (IOException e) {
e.printStackTrace();
} if(wwb == null) {
return;
} //2.创建一个可写入的工作表
//workbook的createSheet方法有两个参数:第一个是工作表的名称,第二个是工作表在工作薄中的位置
WritableSheet sheet = wwb.createSheet("sheet1", 0); //3.添加单元格
for(int i=0; i<10; i++) {
for(int j=0; j<5; j++) {
//Label label = new Label(col, row, title);
//三个参数分别表示col+1列,row+1行,标题内容是title。
Label label = new Label(j, i, "这是第"+(i+1)+"行,第"+(j+1)+"列"); //将生成的单元格添加到工作表中
try {
sheet.addCell(label);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
} }
} try {
//4.从内存写入到文件中
wwb.write();
//5.关闭资源,释放内存
wwb.close();
} catch (WriteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 读取Excel文件
* @param file 要读取的Excel文件
* @return Excel每个单元格的内容(按照一定格式)
*/
public static String readExcel(File file) {
StringBuffer sb = new StringBuffer();
Workbook wb = null;
//1.获取工作薄对象(Workbook)
try {
wb = Workbook.getWorkbook(file);
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(wb==null) {
return null;
} //2.得到工作表对象(Sheet)
Sheet[] sheets = wb.getSheets(); //3.循环操作单元格
if(sheets!=null && sheets.length>0) {
//对每个工作表进行循环
for(int i=0; i<sheets.length; i++) {
//得到当前工作表的行数
int rowNum = sheets[i].getRows();
for(int j=0; j<rowNum; j++) {
//得到当前行的所有单元格
Cell[] cells = sheets[i].getRow(j);
if(cells != null && cells.length > 0) {
//对每个单元格进行循环
for(int k=0; k<cells.length; k++) {
//读取当前单元格的值
String cellValue = cells[k].getContents();
sb.append(cellValue+"\t");
}
}
sb.append("\r\n");
}
sb.append("\r\n");
}
} //4.关闭资源,释放内存
wb.close();
return sb.toString();
} /**
* 搜索Excel文件中是否包含关键字
* @param file 要搜索的Excel文件
* @param keyWord 要搜索的关键字
* @return 是否包含关键字
*/
public static Boolean searchKeyWord(File file, String keyWord) {
//构建一个开关,用来保存搜索成功与否的状态
Boolean res = false;
Workbook wb = null;
//1.获取工作薄对象(Workbook)
try {
wb = Workbook.getWorkbook(file);
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(wb == null) {
return res;
} //2.得到工作表对象(Sheet)
Sheet[] sheets = wb.getSheets();
if(sheets == null || sheets.length == 0) {
return res;
} //3.循环比对单元格
Boolean breakSheet = false; //开关
for(int i=0; i<sheets.length; i++) {
if( breakSheet ) {
break;
} //得到当前工作表的行数
Integer rowNum = sheets[i].getRows();
Boolean breakRow = false;
for(int j=0; j<rowNum; j++) {
if(breakRow) {
break;
}
//得到当前行的所有单元格
Cell[] cells = sheets[i].getRow(j);
if(cells==null || sheets.length==0) {
return res;
}
//对每个单元格进行循环
Boolean breakCell = false;
for(int k=0; k<cells.length; k++) {
if(breakCell){
break;
}
//读取当前单元格的值
String cellValue = cells[k].getContents();
if(cellValue == null) {
continue;
}
if(cellValue.contains(keyWord)) {
breakCell = true;
breakRow = true;
breakSheet = true;
res = true;
}
}
}
}
//4.关闭资源,释放内存
wb.close();
return res;
} /**
* 向Excel中插入图片(仅限png格式的图片,其余格式如jgp、gif等暂不支持)
* @param sheet 待插入的工作表
* @param col 图片从该列开始
* @param row 图片从该行开始
* @param width 图片所占的宽度
* @param height 图片所占的高度
* @param imageFile 要插入的图片文件
*/
public static void insertImage(WritableSheet sheet,
int col, int row,
int width, int height,
File imageFile) {
WritableImage img = new WritableImage(col, row, width, height, imageFile);
sheet.addImage(img);
} /**
* @param args
*/
public static void main(String[] args) {
//4.测试insertImage方法
WritableWorkbook wwb = null;
try{
wwb = Workbook.createWorkbook(new File("E:\\testexcel.xls"));
WritableSheet sheet = wwb.createSheet("image", 0);
File imageFile = new File("E:\\1.png");
JXLOperateExcel.insertImage(sheet, 1, 4, 6, 18, imageFile);
wwb.write();
} catch(Exception e) {
e.printStackTrace();
} finally {
//如果不关闭WorkWritablebook,打开生成的Excel文件会出现”Excel格式与文件扩展名指定格式不一致“的错误。
if(wwb != null) {
try {
wwb.close();
} catch (WriteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} //3.测试searchKeyWord方法
// File file = new File("E:\\testexcel.xls");
// String keyWord = "1";
// System.out.println(JXLOperateExcel.searchKeyWord(file, keyWord)); //2.测试readExcel方法
// File file = new File("E:\\testexcel.xls");
// System.out.println(JXLOperateExcel.readExcel(file)); //1.测试writeExcel方法
// String fileName = "E:\\testexcel.xls";
// JXLOperateExcel.writeExcel(fileName);
} }

JXL操作Excel

4.总结

  (1) 类比我们平时对Excel的操作:①找到Excel文件;②找到要操作的工作表(sheet);③找到要操作的行;④操作当前行的单元格。程序中也是这种操作顺序。

  (2)WorkWritablebook一定要及时关闭。如果不关闭WorkWritablebook,打开生成的Excel文件会出现”Excel格式与文件扩展名指定格式不一致“的错误。

Java文件操作系列[2]——使用JXL操作Excel文件的更多相关文章

  1. Java:JXL解析Excel文件

    项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...

  2. Jxl创建Excel文件和解析Excel文件

    import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; im ...

  3. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  4. Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

    JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传 ...

  5. Java——jxl读取Excel文件

    1.创建文件流,打开EXCEL文件(jxi不支持.xlsx文件,支持.xls) FileInputStream excelFile = new FileInputStream(excelPath); ...

  6. jxl导出Excel文件

    一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; im ...

  7. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  8. JAVA POI 应用系列(1)--生成Excel

    POI简介(官网:http://poi.apache.org/)     Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...

  9. java使用org.apache.poi读取与保存EXCEL文件

    一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...

随机推荐

  1. 蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

    蓝桥杯 枚举 奇怪的分式 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1 ...

  2. 【旧文章搬运】Win7可变对象头结构之InfoMask解析

    原文发表于百度空间,2010-08-11========================================================================== 对Wind ...

  3. Dreamweaver cs6 的安装与破解

    网上找的教程http://jingyan.baidu.com/article/9f7e7ec08383b26f281554f4.html,亲测无误 只需点击试用安装即可 破解只需替换amtlib.dl ...

  4. ElasticSearch基础之映射mapping

    [01]什么是mapping? 首先去看看官方文档,非常重要:https://www.elastic.co/guide/en/elasticsearch/reference/current/mappi ...

  5. 3-C++程序的结构1.3

    类的友元 一个类之外的函数,又与该类有特殊关系! 友元关系提供了不同类或对象的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通俗地说,友元关系就是一个类主动声明那些其他类或函数是它的朋友 ...

  6. 继承映射关系 joinedsubclass的查询

    会出现下面这样的错一般是配置文件中的mapping和映射文件中的package路径或者class中的name路径不一致 org.hibernate.MappingException: Unknown ...

  7. 挨踢职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总

    摘要我在IT职场打滚超过15年了,从小小的程序员做到常务副总.相对于其它行业,IT职场应该算比较光明的了,但也陷阱重重,本文说说我的亲身体会,希望大家能在IT职场上战无不胜! 通用法则 法则1:忍耐是 ...

  8. 使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法

    在Linux的shell中,使用export设置ANT_OPTS变量,值为1G export ANT_OPTS=-Xmx1g ant 同理在windows的cmd中,使用set设置ANT_OPTS变量 ...

  9. console.log是异步么?

    让我们来看一个例子: var a = {}; console.log(a); a.foo = 'foo'; 4 console.log(a); 但是问题来了:在chorme跟firfox一样么? 结果 ...

  10. 已有项目 iPhoneX 适配

    一.Assets 文件图片管理下的 LaunchImage 添加 iOS8.0 and latter 一项,并放一张 1125*2436 的LaunchPage 到对应的位置上. 二.有关 iPhon ...