概述

​ Java Excel API是成熟的开源Java API,使开发人员可以动态读取,写入和修改Excel电子表格。

一些功能

  • 从Excel 95、97、2000,XP和2003工作簿中读取数据

  • 读取和写入公式(仅限Excel 97和更高版本)

  • 生成Excel 2000格式的电子表格

  • 支持字体,数字和日期格式

  • 支持单元格的阴影,边框和着色

  • 修改现有工作表

  • 支持复制图表

  • 支持将图像插入和复制到电子表格中

    应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

jxl开发指南

官网: http://jexcelapi.sourceforge.net/

API帮助文档: http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html

介绍

​ jxl操作excel包括对象Workbook,Sheet ,Cell
​ 一个excel就对应一个Workbook对象
​ 一个Workbook可以有多个Sheet对象
​ 一个Sheet对象可以有多个Cell对象

Maven依赖

<dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version>
</dependency>

读取Excel操作

​ 通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。我们先想想一下读取步骤,不 管是什么样的Excel操作框架必定都要经历
​ 1、 选取Excel文件得到工作薄
​ 2、 选择工作表
​ 3、 选择Cell
​ 4、 读取信息

读取工作薄

选取Excel文件得到工作薄Workbook

Workbook workbook = Workbook.getWorkbook(new File("myexcel.xls"));
读取工作表

通过Workbook的getSheet方法选择第一个工作表(从0开始)

Sheet sheet = workbook.getSheet(0);
读取单元格

通过Sheet的getCell方法选择位置为C1的单元格(两个参数都从0开始)

Cell c2 = sheet.getCell(1,0);  //注意: 参数1为列索引,参数2为行索引   索引从零开始
读取单元格的值

通过Cell的getContents方法,把单元格中的信息以字符的形式读取出来

String stringc1 = c2.getContents();

Cell提供了一个getType方法

能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些 Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数 值、日期类型的单元格

if(cell.getType()== CellType.LABEL){LabelCell labelCell = (LabelCell) cell;String labelCellString = labelCell.getString();}if (cell.getType()==CellType.BOOLEAN){BooleanCell booleanCell = (BooleanCell) cell;boolean value = booleanCell.getValue();}if(cell.getType()== CellType.NUMBER){NumberCell numberCell = (NumberCell) cell;double value = numberCell.getValue();}if(cell.getType()== CellType.DATE){DateCell dateCell = (DateCell) cell;Date date = dateCell.getDate();}
释放资源

当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要.

workbook.close();
示例代码
 @Testpublic void readExcel() throws IOException, BiffException {File file = new File("src/myexcel.xls");Workbook workbook = Workbook.getWorkbook(file);Sheet sheet = workbook.getSheet(0);//获得总列数int columns = sheet.getColumns();//获得总行数int rows = sheet.getRows();System.out.println(rows + " 行  " + columns + "列");for (int row = 0; row < rows; row++) {for (int column = 0; column < columns; column++) {Cell cell = sheet.getCell(column, row); String contents = cell.getContents();   //获取单元格的值System.out.print(contents+"    ");}System.out.println();}//释放资源workbook.close();}

写Excel操作

​ 通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。我们先想 想一下插入,不管是什么样的Excel操作框架必定都要经历
​ 1、 创建Exce工作薄
​ 2、 创建工作表
​ 3、 创建单元格

创建工作薄

​ API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。

创建可写入的Excel工作薄
WritableWorkbook workbook = Workbook.createWorkbook(new File(targetfile));

或者

将WritableWorkbook直接写入到输出流
OutputStream os = new FileOutputStream(targetfile);
WritableWorkbook workbook = Workbook.createWorkbook(os);
创建工作表
WritableSheet ws = workbook.createSheet("mysheet", 0);
创建单元格
添加文本类单元格对象
Label label = new Label(0, 0, "This is a Label cell");
ws.addCell(label);
添加带有字型Formatting的对象
//(WritableFont.FontName fn, int ps, WritableFont.BoldStyle bs, boolean italic)
//参数1:字体名  参数2:字体大小  参数3:加粗或不加粗  参数4: 是否斜体
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 labelCF = new Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
添加Number对象
Number labelN = new jxl.write.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);
添加Boolean对象
Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
添加DateTime对象
DateTime labelDT = new DateTime(0, 3, new Date());
ws.addCell(labelDT);
添加带有formatting的DateFormat对象
DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF);
ws.addCell(labelDTF);
添加公式单元格
Formula formula = new Formula(3,1,"SUM(A2:B2)");
ws.addCell(formula);
添加图像
WritableImage image=new WritableImage(1,5,10,10,new File("k8s.png"));
ws.addImage(image);

注意,API中注明只支持png文件。

合并单元格

通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的。
表示将从第x+1列,y+1行到m+1列,n+1行合并 (四个点定义了两个坐标,左上角和右下角)结果是合并了m-x+1行,n-y+1列,两者乘积就是合并的单元格数量。

ws.mergeCells(5, 0, 8, 3);
label = new Label(5, 0, "合并了16个单元格");
ws.addCell(label);
添加单元格样式

主要是改变单元格背景、字体、颜色等等。

WritableCellFormat wcf = new WritableCellFormat();
wcf.setAlignment(Alignment.CENTRE); // 设置居中
wcf.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
wcf.setBackground(jxl.format.Colour.RED); // 设置单元格的背景颜色
label = new Label(1, 5, "字体", wcf);
ws.addCell(label);
设置单元格字体
WritableFont writableFont = new WritableFont(WritableFont.createFont("楷书"), 20);
WritableCellFormat font = new WritableCellFormat(writableFont);
label = new Label(3, 2, "楷书", font);
ws.addCell(label);
写入到文件
workbook.write();
释放资源
workbook.close();
示例代码
    @Testpublic void writeExcel() throws IOException, WriteException {WritableWorkbook workbook = Workbook.createWorkbook(new File("writeExcel.xls"));WritableSheet ws = workbook.createSheet("mysheet", 0);Label label = new Label(0, 0, "This is a Label cell");ws.addCell(label);WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD,             false);WritableCellFormat wcfF = new WritableCellFormat(wf);label = new Label(1, 0, "This is a Label Cell", wcfF);ws.addCell(label);WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD,         false,UnderlineStyle.DOUBLE, Colour.RED);WritableCellFormat wcfFC = new WritableCellFormat(wfc);Label labelCF = new Label(1, 0, "This is a Label Cell", wcfFC);ws.addCell(labelCF);Number labelN = new Number(0, 1, 3.1415926);ws.addCell(labelN);NumberFormat nf = new NumberFormat("#.##");WritableCellFormat wcfN = new WritableCellFormat(nf);Number labelNF = new Number(1, 1, 3.1415926, wcfN);ws.addCell(labelNF);Boolean labelB = new jxl.write.Boolean(0, 2, false);ws.addCell(labelB);DateTime labelDT = new DateTime(0, 3, new Date());ws.addCell(labelDT);DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");WritableCellFormat wcfDF = new WritableCellFormat(df);DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF);ws.addCell(labelDTF);Formula formula = new Formula(3, 1, "SUM(A2:B2)");ws.addCell(formula);WritableImage image = new WritableImage(1, 5, 10, 10, new File("k8s.png"));ws.addImage(image);ws.mergeCells(5, 0, 8, 3);label = new Label(5, 0, "合并了16个单元格");ws.addCell(label);WritableCellFormat wcf = new WritableCellFormat();wcf.setAlignment(Alignment.CENTRE); // 设置居中wcf.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线wcf.setBackground(jxl.format.Colour.RED); // 设置单元格的背景颜色label = new Label(1, 5, "字体", wcf);ws.addCell(label);WritableFont writableFont = new WritableFont(WritableFont.createFont("楷书"), 20);WritableCellFormat font = new WritableCellFormat(writableFont);label = new Label(3, 2, "楷书", font);ws.addCell(label);//写入到文件workbook.write();//释放资源workbook.close();}

拷贝、更新Excel工作薄

    @Testpublic void updateExcel() throws IOException, BiffException, WriteException {//创建只读的Excel工作薄的对象Workbook rw = Workbook.getWorkbook(new File("myexcel.xls"));//创建可写入的Excel工作薄对象WritableWorkbook wwb = Workbook.createWorkbook(new File("updateExcel.xls"), rw);//读取第一张工作表WritableSheet ws = wwb.getSheet(0);//获得第一个单元格对象WritableCell wc = ws.getWritableCell(0, 1);//判断单元格的类型, 做出相应的转化if (wc.getType() == CellType.LABEL) {Label l = (Label) wc;//修改单元格的值l.setString("The value has been modified.");}//写入Excel对象wwb.write();//关闭可写入的Excel对象wwb.close();//关闭只读的Excel对象rw.close();}

Java Excel(jxl)学习笔记相关推荐

  1. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  2. java.util.List学习笔记

    概述 在Java中,List是一种特殊的集合结构,即:List是一种有序的集合.在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等: List一般允许重复 ...

  3. Java快速入门学习笔记9 | Java语言中的方法

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  4. Java快速入门学习笔记8 | Java语言中的数组

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  5. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  6. Java快速入门学习笔记6 | Java语言中的for循环语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  7. Java快速入门学习笔记5 | Java语言中的while循环语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  8. Java快速入门学习笔记4 | Java语言中的if条件语句

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  9. Java快速入门学习笔记3 | Java语言中的表达式与操作符

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. 我的pygraphviz安装之路
  2. AbstractQueuedSynchronizer 源码分析
  3. LeetCode:输出整体轮廓线和最长子数组长度
  4. 作者:鲍玉斌(1968-),男,博士,东北大学计算机科学系教授
  5. c语言合法常量e8,c语言合法常量定义
  6. 一些算法竞赛参考书及豆瓣评分
  7. string的compare operator
  8. 求方程式ax2 bx c=0的根c语言,关于求方程ax2+bx+c=0根的问题
  9. angular.js学习笔记
  10. Atitit 常见软件设计图纸总结 目录 1.1. ui原型图与html 2 1.2. 业务逻辑 伪代码 各种uml图 2 1.3. 总体设计图纸 结构图 层次图 架构图 2 1.4. 业务逻辑
  11. 使用 JavaScript 下载文件
  12. 微信小程序的点击、双击、长按事件
  13. C# Application.DoEvents()事件
  14. 2019年7月4日西藏17日之旅
  15. 短信下发的成功失败概率是多少?如何提高到达率?
  16. 低功耗设计实现中secondary power pin的连接方法汇总
  17. 解决MATLAB新版本中modem.qammod作废的问题
  18. 搜索-Query理解(全)
  19. win7计算机总是卡住,win7系统电脑画面定格死机的解决方法
  20. Android ViewPager Fragment 切换刷新数据,解决生命周期只走一次的问题

热门文章

  1. python字符串转浮点数_python – 无法将字符串列表转换为浮点数
  2. java 文曲星猜数字,「3D跨度表」文曲星中的猜数字游戏,要猜一个四位数,有什么通用公式?...
  3. 《代码大全2》高质量子程序的5个关键点
  4. vue 保存时清空iuput_Vue 一键清空表单的实现方法
  5. Hands-on Lab (14) - 部署StatefulSets应用
  6. OpenShift 4 - 用自定义的TLS证书对访问OpenShift的用户认证身份
  7. python天气查询_Python学习笔记——天气查询代码
  8. python 表白程序代码_python抖音表白程序源代码
  9. hexo html代码高亮,使用 prismjs 自定义 Hexo 代码高亮
  10. 卡在linuxctrld进系统_电脑系统出现问题怎么办?学会这七招,电脑系统问题不求人!...