Java文件操作系列[2]——使用JXL操作Excel文件
由于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文件的更多相关文章
- Java:JXL解析Excel文件
项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...
- Jxl创建Excel文件和解析Excel文件
import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; im ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)
JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03 xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传 ...
- Java——jxl读取Excel文件
1.创建文件流,打开EXCEL文件(jxi不支持.xlsx文件,支持.xls) FileInputStream excelFile = new FileInputStream(excelPath); ...
- jxl导出Excel文件
一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; im ...
- 【Java】使用Apache POI生成和解析Excel文件
概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...
- JAVA POI 应用系列(1)--生成Excel
POI简介(官网:http://poi.apache.org/) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...
- java使用org.apache.poi读取与保存EXCEL文件
一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...
随机推荐
- 初学:利用mybatis-generator自动生成代码
所需的资源: mybatis-generator-core-1.3.2.jar,MySQL-connector-Java-5.1.22-bin.jar.mybatis-generator-core-1 ...
- html实现点击图片放大功能
话不多说,直接上代码 <html> <head> <style> .over {position: fixed; left:0; top:0; width:100% ...
- Android教程
转载,但请务必在明确位置注明出处! http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/ Android Killer ...
- CodeForces722C Destroying Array【瞎搞】
题意: 先给你一个序列,然后给你n个1-n的一个数,让你求前i个元素销毁的时候,区间字段和区间最大: 思路: 离线处理,维护新区间首尾位置的起点和终点,倒着处理: #include <bits/ ...
- cf786C(xjb)
题目链接:http://codeforces.com/problemset/problem/768/C 题意:给出一个数组,经过k次操作后最大元素和最小元素分别是什么.. 操作:给当前数组排序,再将第 ...
- bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf) ...
- Elasticsearch学习记录(入门篇)
Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...
- time库的使用
首先只需要 import time (典型的,标准的python库的使用方法) 主要包括三类函数 ——时间获取:time() , ctime() , gmtime() ——时间格式化: strftim ...
- 基于http的软件仓库
这是企业中常用的方法 比如一台服务器准备好了,公司必然要安装一些应用 这时可以用这种方法批量安装应用 运行一条命令,服务器就会自己去连接软件仓库,去下载来安装. [root@webmaster htm ...
- MySQL之select简单使用
Select * from table_name Select column_name_1,column_name_2 from table_name Select * from student wh ...