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类。

      

  •   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等暂不支持)

  1 package com.myeclipse;
  2
  3 import java.io.File;
  4 import java.io.IOException;
  5
  6 import jxl.Cell;
  7 import jxl.Sheet;
  8 import jxl.Workbook;
  9 import jxl.read.biff.BiffException;
 10 import jxl.write.Label;
 11 import jxl.write.WritableImage;
 12 import jxl.write.WritableSheet;
 13 import jxl.write.WritableWorkbook;
 14 import jxl.write.WriteException;
 15 import jxl.write.biff.RowsExceededException;
 16
 17 /**
 18  * 使用JXL对Excel文件进行操作
 19  * @author MrChen
 20  *
 21  */
 22 public class JXLOperateExcel {
 23     /**
 24      * 写入Excel
 25      * @param fileName  要生成的Excel文件名字
 26      */
 27     public static void writeExcel(String fileName) {
 28         //1.使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
 29         WritableWorkbook wwb = null;
 30         try {
 31             wwb = Workbook.createWorkbook(new File(fileName));
 32         } catch (IOException e) {
 33             e.printStackTrace();
 34         }
 35
 36         if(wwb == null) {
 37             return;
 38         }
 39
 40         //2.创建一个可写入的工作表
 41         //workbook的createSheet方法有两个参数:第一个是工作表的名称,第二个是工作表在工作薄中的位置
 42         WritableSheet sheet = wwb.createSheet("sheet1", 0);
 43
 44         //3.添加单元格
 45         for(int i=0; i<10; i++) {
 46             for(int j=0; j<5; j++) {
 47                 //Label label = new Label(col, row, title);
 48                 //三个参数分别表示col+1列,row+1行,标题内容是title。
 49                 Label label = new Label(j, i, "这是第"+(i+1)+"行,第"+(j+1)+"列");
 50
 51                 //将生成的单元格添加到工作表中
 52                 try {
 53                     sheet.addCell(label);
 54                 } catch (RowsExceededException e) {
 55                     e.printStackTrace();
 56                 } catch (WriteException e) {
 57                     e.printStackTrace();
 58                 }
 59
 60             }
 61         }
 62
 63         try {
 64             //4.从内存写入到文件中
 65             wwb.write();
 66             //5.关闭资源,释放内存
 67             wwb.close();
 68         } catch (WriteException e) {
 69             e.printStackTrace();
 70         } catch (IOException e) {
 71             e.printStackTrace();
 72         }
 73
 74     }
 75
 76     /**
 77      * 读取Excel文件
 78      * @param file    要读取的Excel文件
 79      * @return     Excel每个单元格的内容(按照一定格式)
 80      */
 81     public static String readExcel(File file) {
 82         StringBuffer sb = new StringBuffer();
 83         Workbook wb = null;
 84         //1.获取工作薄对象(Workbook)
 85         try {
 86             wb = Workbook.getWorkbook(file);
 87         } catch (BiffException e) {
 88             e.printStackTrace();
 89         } catch (IOException e) {
 90             e.printStackTrace();
 91         }
 92         if(wb==null) {
 93             return null;
 94         }
 95
 96         //2.得到工作表对象(Sheet)
 97         Sheet[] sheets = wb.getSheets();
 98
 99         //3.循环操作单元格
100         if(sheets!=null && sheets.length>0) {
101             //对每个工作表进行循环
102             for(int i=0; i<sheets.length; i++) {
103                 //得到当前工作表的行数
104                 int rowNum = sheets[i].getRows();
105                 for(int j=0; j<rowNum; j++) {
106                     //得到当前行的所有单元格
107                     Cell[] cells = sheets[i].getRow(j);
108                     if(cells != null && cells.length > 0) {
109                         //对每个单元格进行循环
110                         for(int k=0; k<cells.length; k++) {
111                             //读取当前单元格的值
112                             String cellValue = cells[k].getContents();
113                             sb.append(cellValue+"\t");
114                         }
115                     }
116                     sb.append("\r\n");
117                 }
118                 sb.append("\r\n");
119             }
120         }
121
122         //4.关闭资源,释放内存
123         wb.close();
124         return sb.toString();
125     }
126
127     /**
128      * 搜索Excel文件中是否包含关键字
129      * @param file 要搜索的Excel文件
130      * @param keyWord    要搜索的关键字
131      * @return    是否包含关键字
132      */
133     public static Boolean searchKeyWord(File file, String keyWord) {
134         //构建一个开关,用来保存搜索成功与否的状态
135         Boolean res = false;
136         Workbook wb = null;
137         //1.获取工作薄对象(Workbook)
138         try {
139             wb = Workbook.getWorkbook(file);
140         } catch (BiffException e) {
141             e.printStackTrace();
142         } catch (IOException e) {
143             e.printStackTrace();
144         }
145         if(wb == null) {
146             return res;
147         }
148
149         //2.得到工作表对象(Sheet)
150         Sheet[] sheets = wb.getSheets();
151         if(sheets == null || sheets.length == 0) {
152             return res;
153         }
154
155         //3.循环比对单元格
156         Boolean breakSheet = false;  //开关
157         for(int i=0; i<sheets.length; i++) {
158             if( breakSheet ) {
159                 break;
160             }
161
162             //得到当前工作表的行数
163             Integer rowNum = sheets[i].getRows();
164             Boolean breakRow = false;
165             for(int j=0; j<rowNum; j++) {
166                 if(breakRow) {
167                     break;
168                 }
169                 //得到当前行的所有单元格
170                 Cell[] cells = sheets[i].getRow(j);
171                 if(cells==null || sheets.length==0) {
172                     return res;
173                 }
174                 //对每个单元格进行循环
175                 Boolean breakCell = false;
176                 for(int k=0; k<cells.length; k++) {
177                     if(breakCell){
178                         break;
179                     }
180                     //读取当前单元格的值
181                     String cellValue = cells[k].getContents();
182                     if(cellValue == null) {
183                         continue;
184                     }
185                     if(cellValue.contains(keyWord)) {
186                         breakCell = true;
187                         breakRow = true;
188                         breakSheet = true;
189                         res = true;
190                     }
191                 }
192             }
193         }
194         //4.关闭资源,释放内存
195         wb.close();
196         return res;
197     }
198
199     /**
200      * 向Excel中插入图片(仅限png格式的图片,其余格式如jgp、gif等暂不支持)
201      * @param sheet      待插入的工作表
202      * @param col       图片从该列开始
203      * @param row        图片从该行开始
204      * @param width        图片所占的宽度
205      * @param height    图片所占的高度
206      * @param imageFile    要插入的图片文件
207      */
208     public static void insertImage(WritableSheet sheet,
209             int col, int row,
210             int width, int height,
211             File imageFile) {
212         WritableImage img = new WritableImage(col, row, width, height, imageFile);
213         sheet.addImage(img);
214     }
215
216
217     /**
218      * @param args
219      */
220     public static void main(String[] args) {
221         //4.测试insertImage方法
222         WritableWorkbook wwb = null;
223         try{
224             wwb = Workbook.createWorkbook(new File("E:\\testexcel.xls"));
225             WritableSheet sheet = wwb.createSheet("image", 0);
226             File imageFile = new File("E:\\1.png");
227             JXLOperateExcel.insertImage(sheet, 1, 4, 6, 18, imageFile);
228             wwb.write();
229         } catch(Exception e) {
230             e.printStackTrace();
231         } finally {
232             //如果不关闭WorkWritablebook,打开生成的Excel文件会出现”Excel格式与文件扩展名指定格式不一致“的错误。
233             if(wwb != null) {
234                 try {
235                     wwb.close();
236                 } catch (WriteException e) {
237                     e.printStackTrace();
238                 } catch (IOException e) {
239                     e.printStackTrace();
240                 }
241             }
242         }
243
244         //3.测试searchKeyWord方法
245 //        File file = new File("E:\\testexcel.xls");
246 //        String keyWord = "1";
247 //        System.out.println(JXLOperateExcel.searchKeyWord(file, keyWord));
248
249         //2.测试readExcel方法
250 //        File file = new File("E:\\testexcel.xls");
251 //        System.out.println(JXLOperateExcel.readExcel(file));
252
253         //1.测试writeExcel方法
254 //        String fileName = "E:\\testexcel.xls";
255 //        JXLOperateExcel.writeExcel(fileName);
256     }
257
258 }

JXL操作Excel

4.总结

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

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

时间: 2024-10-25 02:01:08

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

jxl创建Excel文件java代码示例

记得要下载 并 导入 jxl.jar 包,免积分下载地址:http://download.csdn.net/detail/u010011052/7561041 package Test; import java.io.*; import jxl.*; import jxl.format.Colour; import jxl.write.*; public class JXLTest { private static WritableWorkbook book; private static Wr

如何让文件夹内所有文件名显示在一个Excel文件

如何让文件夹内所有文件名显示在一个Excel文件 我们如何才能做到,让某个文件夹内的所有文件的名称,自动生成一个Excel文件或TXT记事本文件: 意思就是说,文件夹内的所有的文件的名称,自动显示在Excel单元格中或记事本里面. 要想实现这样的功能,非常简单,仅仅使用一个非常简单的DOS命令,就实现了! 方法/步骤 一.所需DOS命令 dir [drive:][path] /b > [drive:][path]filename 二.应用实例 如下图,在D盘中,有一个名称为“TQIPC”的文件夹

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

JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传的xls文件(文件格式见下user.xls),解析不为空的行与列,写入数据库. 文件user.xls格式为: 下面来看代码实例演示: 一.前端jsp页面(本来内容很多,这里精简了) <%@ page language="java" contentType="text/htm

Java使用jxl对excel文件进行简单的读写

jxl的Jar包下载地址:百度网盘 import java.io.File; import java.io.IOException; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.Label; import jxl.write.WritableCellFeatures; import jxl.write.WritableSheet; import jxl.wr

Java——jxl读取Excel文件

1.创建文件流,打开EXCEL文件(jxi不支持.xlsx文件,支持.xls) FileInputStream excelFile = new FileInputStream(excelPath); Workbook workbook = Workbook.getWorkbook(excelFile); 2.切换到对应文件名 Sheet excelSheet = workbook.getSheet(sheetName); 3.获取实际行数和列数 int rows = excelSheet.get

jxl导出Excel文件

一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat;

jxl读取excel文件异常:Unable to recognize OLE stream 的解决方法

问题成因 使用jxl方式读取,可能只能支持xls格式的文件,对于xlsx格式就不再支持 如果是从网站导出的excel文件,有的网站比较坑,导出的并不是标准格式的excel,而是将html改扩展名为xls的“伪”excel文件.当用excel打开这类文件时,会弹窗提示其“扩展名和文件类型不匹配”是否还要打开. 而且,使用文本编辑器打开,会发现这个所谓xls文件其实是xml标签的文件. 解决方法 在excel中打开,另存成xls就可以. 但当文件比较多时,可以使用excel vba批量另存. 第一种

java通过apache poi框架读取2007版Excel文件

java系读写excel文件既可以用jxl库,也可以用POI库,但是,jxl库只支持低版本的excel2003,不支持更高版本,无法直接输出*.xlsx文件,只能输出*.xls文件,另外,更新也不频繁.所以,目前大多采用POI库. jxl库官网:http://jxl.sourceforge.net/ POI介绍要想使用POI对Excel进行操作,我们需要先了解一下Excel的两种版本:一种是97-2003版本扩展名是“.xls”:一种是2007版本扩展名是“.xlsx”.POI分别针对这两种版本

jxl切割excel文件

近期在实施一个项目.当中一项工作是处理历史数据. 客户提供过来的数据是excel表格,超过20万条记录,因为目标系统导入限制,每次仅仅能导入大小不超过8M的文件.所以须要对这些数据进行切割处理.在手工处理一遍后,认为能够通过写一个程序来自己主动实现切割.于是用JAVA写了一个程序,用于针对特定文件实现给定记录数的切割功能. 详见代码: package cn.sean.main; import java.io.File; import java.io.IOException; import jxl