首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Jxl 使用

2012-07-19 
Jxl 运用jxl.jar 包简介下载地址:http://www.andykhan.com/jexcelapi/特征: ● 支持Excel 95-2000的所有版

Jxl 运用

jxl.jar 包简介

下载地址:http://www.andykhan.com/jexcelapi/

特征:

● 支持Excel 95-2000的所有版本

● 生成Excel 2000标准格式

● 支持字体、数字、日期操作

● 能够修饰单元格属性

● 支持图像和图表

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

搭建环境

将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。

jxlr的基本运用

创建文件

生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:

代码(CreateXLS.java):

import java.io.*;

import jxl.*;

import jxl.write.*;

public class CreateXLS {

public static void main(String args[]) {

try {

//打开文件

WritableWorkbook book= Workbook.createWorkbook(new File(“测试.xls”));

//生成名为“第一页”的工作表,参数0表示这是第一页

WritableSheet sheet=book.createSheet(“第一页”,0);

//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)

//以及单元格内容为test

Label label=new Label(0,0,”test”);

?//或者WritableCell cell =? new jxl.write.Number(column, row, value, wcf)

//将定义好的单元格添加到工作表中

sheet.addCell(label);

/*生成一个保存数字的单元格 必须使用Number的完整包路径,否则有语法歧义 单元格位置是第二列,第一行,值为789.123*/

`? jxl.write.Number number = new jxl.write.Number(1,0,789.123);

sheet.addCell(number);

//写入数据并关闭文件

book.write();

book.close();

}catch(Exception e){

System.out.println(e);

}

}

}

编译执行后,会在当前位置产生一个Excel文件。

读取文件

以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:

//读取Excel的类

import java.io.*;

import jxl.*;

public class ReadXLS {

public static void main(String args[]){

try {

Workbook book= Workbook.getWorkbook(new File(“测试.xls”));

//获得第一个工作表对象

Sheet sheet=book.getSheet(0);

//得到第一列第一行的单元格

Cell cell1=sheet.getCell(0,0);

String result=cell1.getContents();

System.out.println(result);

book.close();

}catch(Exception e) {

System.out.println(e);

}

}

}

程序执行结果:test

修改文件

利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在已经生成的Excel文件中添加一个工作表:

//修改Excel的类,添加一个工作表

import java.io.*;

import jxl.*;

import jxl.write.*;

public class UpdateXLS {

public static void main(String args[]) {

try {

//Excel获得文件

Workbook wb=Workbook.getWorkbook(new File(“测试.xls”));

//打开一个文件的副本,并且指定数据写回到原文件

WritableWorkbook book=

Workbook.createWorkbook(new File(“测试.xls”),wb);

//添加一个工作表

WritableSheet sheet=book.createSheet(“第二页”,1);

sheet.addCell(new Label(0,0,”第二页的测试数据”));

book.write();

book.close();

}catch(Exception e) {

System.out.println(e);

}

}

}

执行结果如图:

高级操作

数据格式化

在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。

字串格式化

字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:

WritableFont font1 = new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);

或//设置字体格式为excel支持的格式

WritableFont font3 = new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD );

?

① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子,指定了字串被赋予那种格式。在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:

//把水平对齐方式指定为居中

format1.setAlignment(jxl.format.Alignment.CENTRE);

//把垂直对齐方式指定为居中

format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//设置自动换行

format1.setWrap(true);

?单元格操作

Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

合并单元格

WritableSheet.mergeCells(int m,int n,int p,int q);

作用是从(m,n)到(p,q)的单元格全部合并,比如:

WritableSheet sheet=book.createSheet(“第一页”,0);

//合并第一列第一行到第六列第一行的所有单元格

sheet.mergeCells(0,0,5,0);

合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

行高和列宽

WritableSheet.setRowView(int i,int height);

作用是指定第i+1行的高度,比如:

//将第一行的高度设为200

sheet.setRowView(0,200);

WritableSheet.setColumnView(int i,int width);

作用是指定第i+1列的宽度,比如:

//将第一列的宽度设为30

sheet.setColumnView(0,30);

操作图片

public static void write()throws Exception{

WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));

WritableSheet ws=wwb.createSheet("Test Sheet 1",0);

File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");

WritableImage image=new WritableImage(1, 4, 6, 18,file);

ws.addImage(image);

wwb.write();

wwb.close();

}

很简单和插入单元格的方式一样,不过就是参数多了些,WritableImage这个类继承了Draw,上面只是他构造方法的一种,前面四个参数的类型都是double,依次是 x, y, width, height,注意,这里的宽和高可不是图片的宽和高,而是图片所要占的单位格的个数,因为继承的Draw所以它的类型必须是double,) 。

读:

读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格.

InputStream->Workbook->Sheet->Cell,就得到了excel文件中的单元格

代码:

String path="c:\\excel.xls";//Excel文件URL

InputStream is = new FileInputStream(path);//写入到FileInputStream

jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄

jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一个工作表

Cell cell=st.getCell(0,0);//得到工作表的第一个单元格,即A1

String content=cell.getContents();//getContents()将Cell中的字符转为字符串

wb.close();//关闭工作薄

is.close();//关闭输入流

?

我们可以通过Sheet的getCell(x,y)方法得到任意一个单元格,x,y和excel中的坐标对应.

例如A1对应(0,0),A2对应(0,1),D3对应(3,2).Excel中坐标从A,1开始,jxl中全部是从0开始.

还可以通过Sheet的getRows(),getColumns()方法得到行数列数,并用于循环控制,输出一个sheet中的所有内容.

写:

往Excel中写入内容主要是用jxl.write包中的类.

OutputStream<-WritableWorkbook<-WritableSheet<-Label

这里面Label代表的是写入Sheet的Cell位置及内容.

代码:

OutputStream os=new FileOutputStream("c:\\test.xls");//输出的Excel文件URL

WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄

WritableSheet ws = wwb.createSheet("sheet1", 0);//创建可写工作表

Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容

ws.addCell(labelCF);//将Label写入sheet中

Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,aString是写入的内容.

WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//设置写入字体

WritableCellFormat wcfF = new WritableCellFormat(wf);//设置CellFormat

Label labelCF=new Label(0, 0, "hello");//创建写入位置,内容和格式

Label的另一构造函数Label(int c, int r, String cont, CellFormat st)可以对写入内容进行格式化,设置字体及其它的属性.

//现在可以写了

wwb.write();

//写完后关闭

wwb.close();

//输出流也关闭吧

os.close;

?//////////////////////////////////////////////////////////////////////////////////

import java.io.File;??
import java.io.FileOutputStream;??
import java.io.OutputStream;??
import java.util.ArrayList;??
import java.util.Date;??
?
import jxl.Cell;??
import jxl.CellType;??
import jxl.Sheet;??
import jxl.Workbook;??
import jxl.WorkbookSettings;??
import jxl.format.Alignment;??
import jxl.format.Border;??
import jxl.format.BorderLineStyle;??
import jxl.format.Colour;??
import jxl.format.VerticalAlignment;??
import jxl.write.Formula;??
import jxl.write.Label;??
import jxl.write.NumberFormat;??
import jxl.write.WritableCellFeatures;??
import jxl.write.WritableCellFormat;??
import jxl.write.WritableFont;??
import jxl.write.WritableSheet;??
import jxl.write.WritableWorkbook;??
import jxl.write.WriteException;??
?
public class JExcelUtils {??
?
??? /**?
???? * 生成Excel文件?
???? * @param path???????? 文件路径?
???? * @param sheetName??? 工作表名称?
???? * @param dataTitles?? 数据标题?
???? */?
?? public void createExcelFile(String path,String sheetName,String[] dataTitles){??
?????? WritableWorkbook workbook;??
?????? try{??
?????????? OutputStream os=new FileOutputStream(path);???
?????????? workbook=Workbook.createWorkbook(os);???
?
?????????? WritableSheet sheet = workbook.createSheet(sheetName, 0); //添加第一个工作表??
?????????? initialSheetSetting(sheet);??
?????????????
?????????? Label label;??
?????????? for (int i=0; i<dataTitles.length; i++){??
?????????????? //Label(列号,行号,内容,风格)??
?????????????? label = new Label(i, 0, dataTitles[i],getTitleCellFormat());???
?????????????? sheet.addCell(label);???
?????????? }??
?
?????????? //插入一行??
?????????? insertRowData(sheet,1,new String[]{"200201001","张三","100","60","100","260"},getDataCellFormat(CellType.STRING_FORMULA));??
?????????????
?????????? //一个一个插入行??
?????????? label = new Label(0, 2,"200201002",getDataCellFormat(CellType.STRING_FORMULA));???
?????????? sheet.addCell(label);??
?????????????
?????????? label = new Label(1, 2,"李四",getDataCellFormat(CellType.STRING_FORMULA));???
?????????? sheet.addCell(label);??
?????????????
?????????? insertOneCellData(sheet,2,2,70.5,getDataCellFormat(CellType.NUMBER));??
?????????? insertOneCellData(sheet,3,2,90.523,getDataCellFormat(CellType.NUMBER));??
?????????? insertOneCellData(sheet,4,2,60.5,getDataCellFormat(CellType.NUMBER));??
?
?????????? insertFormula(sheet,5,2,"C3+D3+E3",getDataCellFormat(CellType.NUMBER_FORMULA));??
?????????????
?????????? //插入日期??
?????????? mergeCellsAndInsertData(sheet, 0, 3, 5, 3, new Date(), getDataCellFormat(CellType.DATE));??
?????????????
?????????? workbook.write();???
?????????? workbook.close();??
?????? }catch(Exception e){??
?????????? e.printStackTrace();??
?????? }??
?? }??
?????
?? /**?
??? * 初始化表格属性?
??? * @param sheet?
??? */?
?? public void initialSheetSetting(WritableSheet sheet){??
????? try{??
?????????? //sheet.getSettings().setProtected(true); //设置xls的保护,单元格为只读的??
?????????? sheet.getSettings().setDefaultColumnWidth(10); //设置列的默认宽度??
?????????? //sheet.setRowView(2,false);//行高自动扩展???
?????????? //setRowView(int row, int height);--行高???
?????????? //setColumnView(int? col,int width); --列宽??
?????????? sheet.setColumnView(0,20);//设置第一列宽度??
????? }catch(Exception e){??
????????? e.printStackTrace();??
????? }??
?? }??
?????
?? /**?
??? * 插入公式?
??? * @param sheet?
??? * @param col?
??? * @param row?
??? * @param formula?
??? * @param format?
??? */?
?? public void insertFormula(WritableSheet sheet,Integer col,Integer row,String formula,WritableCellFormat format){??
?????? try{??
?????????? Formula f = new Formula(col, row, formula, format);??
?????????? sheet.addCell(f);??
?????? }catch(Exception e){??
?????????? e.printStackTrace();??
?????? }??
?? }??
?????
?? /**?
??? * 插入一行数据?
??? * @param sheet?????? 工作表?
??? * @param row???????? 行号?
??? * @param content???? 内容?
??? * @param format????? 风格?
??? */?
?? public void insertRowData(WritableSheet sheet,Integer row,String[] dataArr,WritableCellFormat format){??
?????? try{??
?????????? Label label;??
?????????? for(int i=0;i<dataArr.length;i++){??
?????????????? label = new Label(i,row,dataArr[i],format);??
?????????????? sheet.addCell(label);??
?????????? }??
?????? }catch(Exception e){??
?????????? e.printStackTrace();??
?????? }??
?? }??
?????
?? /**?
??? * 插入单元格数据?
??? * @param sheet?
??? * @param col?
??? * @param row?
??? * @param data?
??? */?
?? public void insertOneCellData(WritableSheet sheet,Integer col,Integer row,Object data,WritableCellFormat format){??
?????? try{??
?????????? if(data instanceof Double){??
?????????????? jxl.write.Number? labelNF = new jxl.write.Number(col,row,(Double)data,format);???
?????????????? sheet.addCell(labelNF);???
?????????? }else if(data instanceof Boolean){??
?????????????? jxl.write.Boolean labelB = new jxl.write.Boolean(col,row,(Boolean)data,format);???
?????????????? sheet.addCell(labelB);???
?????????? }else if(data instanceof Date){??
?????????????? jxl.write.DateTime labelDT = new jxl.write.DateTime(col,row,(Date)data,format);???
?????????????? sheet.addCell(labelDT);???
?????????????? setCellComments(labelDT, "这是个创建表的日期说明!");??
?????????? }else{??
?????????????? Label label = new Label(col,row,data.toString(),format);??
?????????????? sheet.addCell(label);?????????????????
?????????? }??
?????? }catch(Exception e){??
?????????? e.printStackTrace();??
?????? }??
?
? }??
?????
?? /**?
??? * 合并单元格,并插入数据?
??? * @param sheet?
??? * @param col_start?
??? * @param row_start?
??? * @param col_end?
??? * @param row_end?
??? * @param data?
??? * @param format?
??? */?
?? public void mergeCellsAndInsertData(WritableSheet sheet,Integer col_start,Integer row_start,Integer col_end,Integer row_end,Object data, WritableCellFormat format){??
????? try{??
????????? sheet.mergeCells(col_start,row_start,col_end,row_end);//左上角到右下角??
????????? insertOneCellData(sheet, col_start, row_start, data, format);??
????? }catch(Exception e){??
????????? e.printStackTrace();??
????? }??
?
?? }??
?????
?? /**?
??? * 给单元格加注释?
??? * @param label?
??? * @param comments?
??? */?
?? public void setCellComments(Object label,String comments){??
?????? WritableCellFeatures cellFeatures = new WritableCellFeatures();??
?????? cellFeatures.setComment(comments);??
?????? if(label instanceof jxl.write.Number){??
?????????? jxl.write.Number num = (jxl.write.Number)label;??
?????????? num.setCellFeatures(cellFeatures);??
?????? }else if(label instanceof jxl.write.Boolean){??
?????????? jxl.write.Boolean bool = (jxl.write.Boolean)label;??
?????????? bool.setCellFeatures(cellFeatures);??
?????? }else if(label instanceof jxl.write.DateTime){??
?????????? jxl.write.DateTime dt = (jxl.write.DateTime)label;??
?????????? dt.setCellFeatures(cellFeatures);??
?????? }else{??
?????????? Label _label = (Label)label;??
?????????? _label.setCellFeatures(cellFeatures);??
?????? }??
?? }??
?????
?? /**?
?? * 读取excel?
?? * @param inputFile?
?? * @param inputFileSheetIndex?
?? * @throws Exception?
?? */?
?? public ArrayList<String> readDataFromExcel(File inputFile, int inputFileSheetIndex){??
????? ArrayList<String> list = new ArrayList<String>();??
????? Workbook book = null;??
????? Cell cell = null;??
????? WorkbookSettings setting = new WorkbookSettings();???
????? java.util.Locale locale = new java.util.Locale("zh","CN");???
????? setting.setLocale(locale);??
????? setting.setEncoding("ISO-8859-1");??
????? try{??
????????? book = Workbook.getWorkbook(inputFile, setting);??
????? }catch(Exception e){??
????????? e.printStackTrace();????
????? }??
?
????? Sheet sheet = book.getSheet(inputFileSheetIndex);??
????? for (int rowIndex = 0; rowIndex < sheet.getRows(); rowIndex++) {//行??
?????? for (int colIndex = 0; colIndex < sheet.getColumns(); colIndex++) {//列??
?????????? cell = sheet.getCell(colIndex, rowIndex);??
?????????? //System.out.println(cell.getContents());??
?????????? list.add(cell.getContents());??
?????? }??
????? }??
????? book.close();??
?
????? return list;??
?? }??
?
?? /**?
??? * 得到数据表头格式?
??? * @return?
??? */?
?? public WritableCellFormat getTitleCellFormat(){??
?????? WritableCellFormat wcf = null;??
?????? try {??
?????????? //字体样式??
?????????? WritableFont wf = new WritableFont(WritableFont.TIMES,12, WritableFont.NO_BOLD,false);//最后一个为是否italic??
?????????? wf.setColour(Colour.RED);??
?????????? wcf = new WritableCellFormat(wf);??
?????????? //对齐方式??
?????????? wcf.setAlignment(Alignment.CENTRE);??
?????????? wcf.setVerticalAlignment(VerticalAlignment.CENTRE);??
?????????? //边框??
?????????? wcf.setBorder(Border.ALL,BorderLineStyle.THIN);??
?????????????
?????????? //背景色??
?????????? wcf.setBackground(Colour.GREY_25_PERCENT);??
?????? } catch (WriteException e) {??
??????? e.printStackTrace();??
?????? }??
?????? return wcf;??
?? }??
?????
?? /**?
??? * 得到数据格式?
??? * @return?
??? */?
?? public WritableCellFormat getDataCellFormat(CellType type){??
?????? WritableCellFormat wcf = null;??
?????? try {??
?????????? //字体样式??
?????????? if(type == CellType.NUMBER || type == CellType.NUMBER_FORMULA){//数字??
????????????? NumberFormat nf = new NumberFormat("#.00");??
????????????? wcf = new WritableCellFormat(nf);???
?????????? }else if(type == CellType.DATE || type == CellType.DATE_FORMULA){//日期??
?????????????? jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd hh:mm:ss");???
?????????????? wcf = new jxl.write.WritableCellFormat(df);???
?????????? }else{??
?????????????? WritableFont wf = new WritableFont(WritableFont.TIMES,10, WritableFont.NO_BOLD,false);//最后一个为是否italic??
?????????????? wcf = new WritableCellFormat(wf);??
?????????? }??
?????????? //对齐方式??
?????????? wcf.setAlignment(Alignment.CENTRE);??
?????????? wcf.setVerticalAlignment(VerticalAlignment.CENTRE);??
?????????? //边框??
?????????? wcf.setBorder(Border.LEFT,BorderLineStyle.THIN);??
?????????? wcf.setBorder(Border.BOTTOM,BorderLineStyle.THIN);??
?????????? wcf.setBorder(Border.RIGHT,BorderLineStyle.THIN);??
?????????? //背景色??
?????????? wcf.setBackground(Colour.WHITE);??
?????????????
?????????? wcf.setWrap(true);//自动换行??
?????????????
?????? } catch (WriteException e) {??
??????? e.printStackTrace();??
?????? }??
?????? return wcf;??
?? }??
?????
?? /**?
??? * 打开文件看看?
??? * @param exePath?
??? * @param filePath?
??? */?
?? public void openExcel(String exePath,String filePath){??
?????? Runtime r=Runtime.getRuntime();???
?????? String cmd[]={exePath,filePath};???
?????? try{???
?????????? r.exec(cmd);???
?????? }catch(Exception e){??
?????????? e.printStackTrace();??
?????? }??
?? }??
?????
?? public static void main(String[] args){??
?????? String[] titles = {"学号","姓名","语文","数学","英语","总分"};???
?????? JExcelUtils jxl = new JExcelUtils();??
?????? String filePath = "E:/test.xls";??
?????? jxl.createExcelFile(filePath,"成绩单",titles);??
?????? jxl.readDataFromExcel(new File(filePath),0);??
?????? jxl.openExcel("C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE",filePath);??
?? }??
}?
////////////////////////////////////////////////////////////////////////////////////////

fileName = new String(fileName.getBytes(),"iso-8859-1");
??response.setCharacterEncoding("gb2312");
??response.reset();
??response.setContentType("application/OCTET-STREAM;charset=gb2312");
??response.setHeader("pragma", "no-cache");
??response.addHeader("Content-Disposition", "attachment;filename=""
????+ fileName + ".xls"");// 点击导出excle按钮时候页面显示的默认名称
??workbook = Workbook.createWorkbook(response.getOutputStream());

热点排行