|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,excel利用Windows操纵体系的伴侣对Excel(电子表格)必定不会生疏,可是要利用Java言语来利用Excel文件并非一件简单的事。在Web使用日趋流行的明天,经由过程Web来操纵Excel文件的需求愈来愈激烈,今朝较为盛行的操纵是在JSP或Servlet中创立一个CSV(commaseparatedvalues)文件,并将这个文件以MIME,text/csv范例前往给扫瞄器,接着扫瞄器挪用Excel而且显现CSV文件。如许只是说能够会见到Excel文件,可是还不克不及真实的利用Excel文件,本文将给人人一个欣喜,向人人先容一个开放源码项目,JavaExcelAPI,利用它人人就能够便利地利用Excel文件了。JavaExcelAPI简介JavaExcel是一开放源码项目,经由过程它Java开辟职员能够读取Excel文件的内容、创立新的Excel文件、更新已存在的Excel文件。利用该API非Windows操纵体系也能够经由过程纯Java使用来处置Excel数据表。由于是利用Java编写的,以是我们在Web使用中能够经由过程JSP、Servlet来挪用API完成对Excel数据表的会见。如今公布的不乱版本是V2.0,供应以下功效: 从Excel95、97、2000等格局的文件中读取数据;
读取Excel公式(能够读取Excel97今后的公式);
天生Excel数据表(格局为Excel97);
撑持字体、数字、日期的格局化;
撑持单位格的暗影操纵,和色彩操纵;
修正已存在的数据表;如今还不撑持以下功效,但不久就会供应了: 不克不及够读取图表信息;
能够读,可是不克不及天生公式,任何范例公式最初的盘算值都能够读出;
使用示例1、从Excel文件读取数据表JavaExcelAPI既能够从当地文件体系的一个文件(.xls),也能够从输出流中读取Excel数据表。读取Excel数据表的第一步是创立Workbook(术语:事情薄),上面的代码片断举例申明了应当怎样操纵:(完全代码见ExcelReading.java)importjava.io.*;
importjxl.*;
…………
try
{
//构建Workbook对象,只读Workbook对象
//间接从当地文件创立Workbook
//从输出流创立Workbook
InputStreamis=newFileInputStream(sourcefile);
jxl.Workbookrwb=Workbook.getWorkbook(is);
}
catch(Exceptione)
{
e.printStackTrace();
}一旦创立了Workbook,我们就能够经由过程它来会见ExcelSheet(术语:事情表)。参考上面的代码片断://猎取第一张Sheet表
Sheetrs=rwb.getSheet(0);我们既大概经由过程Sheet的称号来会见它,也能够经由过程下标来会见它。假如经由过程下标来会见的话,要注重的一点是下标从0入手下手,就像数组一样。一旦失掉了Sheet,我们就能够经由过程它来会见ExcelCell(术语:单位格)。参考上面的代码片断://猎取第一行,第一列的值
Cellc00=rs.getCell(0,0);
Stringstrc00=c00.getContents();//猎取第一行,第二列的值
Cellc10=rs.getCell(1,0);
Stringstrc10=c10.getContents();//猎取第二行,第二列的值
Cellc11=rs.getCell(1,1);
Stringstrc11=c11.getContents();System.out.println("Cell(0,0)"+"value:"+strc00+";type:"+c00.getType());
System.out.println("Cell(1,0)"+"value:"+strc10+";type:"+c10.getType());
System.out.println("Cell(1,1)"+"value:"+strc11+";type:"+c11.getType());假如仅仅是获得Cell的值,我们能够便利地经由过程getContents()办法,它能够将任何范例的Cell值都作为一个字符串前往。示例代码中Cell(0,0)是文本型,Cell(1,0)是数字型,Cell(1,1)是日期型,经由过程getContents(),三品种型的前往值都是字符型。假如有必要晓得Cell内容切实其实切范例,API也供应了一系列的办法。参考上面的代码片断:Stringstrc00=null;
doublestrc10=0.00;
Datestrc11=null;Cellc00=rs.getCell(0,0);
Cellc10=rs.getCell(1,0);
Cellc11=rs.getCell(1,1);if(c00.getType()==CellType.LABEL)
{
LabelCelllabelc00=(LabelCell)c00;
strc00=labelc00.getString();
}
if(c10.getType()==CellType.NUMBER)
{
NmberCellnumc10=(NumberCell)c10;
strc10=numc10.getvalue();
}
if(c11.getType()==CellType.DATE)
{
DateCelldatec11=(DateCell)c11;
strc11=datec11.getDate();
}System.out.println("Cell(0,0)"+"value:"+strc00+";type:"+c00.getType());
System.out.println("Cell(1,0)"+"value:"+strc10+";type:"+c10.getType());
System.out.println("Cell(1,1)"+"value:"+strc11+";type:"+c11.getType());在失掉Cell对象后,经由过程getType()办法能够取得该单位格的范例,然后与API供应的基础范例相婚配,强迫转换成响应的范例,最初挪用响应的取值办法getXXX(),就能够失掉断定范例的值。API供应了以下基础范例,与Excel的数据格局绝对应,以下图所示:每品种型的详细意义,请拜见JavaExcelAPIdocument.当你完成对Excel电子表格数据的处置后,必定要利用close()办法来封闭先前创立的对象,以开释读取数据表的过程当中所占用的内存空间,在读取大批数据时显得尤其主要。参考以下代码片断://操纵完成时,封闭对象,开释占用的内存空间
rwb.close();JavaExcelAPI供应了很多会见Excel数据表的办法,在这里我只扼要地先容几个经常使用的办法,别的的办法请参考附录中的JavaExcelAPIdocument.Workbook类供应的办法1.intgetNumberOfSheets()取得事情薄(Workbook)中事情表(Sheet)的个数,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
intsheets=rwb.getNumberOfSheets();2.Sheet[]getSheets()前往事情薄(Workbook)中事情表(Sheet)对象数组,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
Sheet[]sheets=rwb.getSheets();3.StringgetVersion()前往正在利用的API的版本号,仿佛是没甚么太年夜的感化。jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
StringapiVersion=rwb.getVersion();Sheet接口供应的办法1)StringgetName()猎取Sheet的称号,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
StringsheetName=rs.getName();2)intgetColumns()猎取Sheet表中所包括的总列数,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
intrsColumns=rs.getColumns();3)Cell[]getColumn(intcolumn)猎取某一列的一切单位格,前往的是单位格对象数组,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
Cell[]cell=rs.getColumn(0);4)intgetRows()猎取Sheet表中所包括的总行数,示例:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
intrsRows=rs.getRows();5)Cell[]getRow(introw)猎取某一行的一切单位格,前往的是单位格对象数组,示例子:jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
Cell[]cell=rs.getRow(0);6)CellgetCell(intcolumn,introw)猎取指订单元格的对象援用,必要注重的是它的两个参数,第一个是列数,第二个是行数,这与一般的行、列组合有些分歧。jxl.Workbookrwb=jxl.Workbook.getWorkbook(newFile(sourcefile));
jxl.Sheetrs=rwb.getSheet(0);
Cellcell=rs.getCell(0,0);2、天生新的Excel事情薄上面的代码次要是向人人先容怎样天生复杂的Excel事情表,在这里单位格的内容是不带任何润色的(如:字体,色彩等等),一切的内容都作为字符串写进。(完全代码见ExcelWriting.java)与读取Excel事情表类似,起首要利用Workbook类的工场办法创立一个可写进的事情薄(Workbook)对象,这里要注重的是,只能经由过程API供应的工场办法来创立Workbook,而不克不及利用WritableWorkbook的机关函数,由于类WritableWorkbook的机关函数为protected范例。示例代码片断以下:importjava.io.*;
importjxl.*;
importjxl.write.*;
…………
try
{
//构建Workbook对象,只读Workbook对象
//Method1:创立可写进的Excel事情薄
jxl.write.WritableWorkbookwwb=Workbook.createWorkbook(newFile(targetfile));//Method2:将WritableWorkbook间接写进到输入流
/*
OutputStreamos=newFileOutputStream(targetfile);
jxl.write.WritableWorkbookwwb=Workbook.createWorkbook(os);
*/
}
catch(Exceptione)
{
e.printStackTrace();
}API供应了两种体例来处置可写进的输入流,一种是间接天生当地文件,假如文件名不带全路径的话,缺省的文件会定位在以后目次,假如文件名带有全路径的话,则天生的Excel文件则会定位在响应的目次;别的一种是将Excel对象间接写进到输入流,比方:用户经由过程扫瞄器来会见Web服务器,假如HTTP头设置准确的话,扫瞄器主动挪用客户真个Excel使用程序,来显现静态天生的Excel电子表格。接上去就是要创立事情表,创立事情表的办法与创立事情薄的办法几近一样,一样是经由过程工场形式办法取得响应的对象,该办法必要两个参数,一个是事情表的称号,另外一个是事情表在事情薄中的地位,参考上面的代码片断://创立Excel事情表
jxl.write.WritableSheetws=wwb.createSheet("TestSheet1",0);"这锅也支好了,质料也筹办完全了,能够入手下手下锅了!",如今要做的只是实例化API所供应的Excel基础数据范例,并将它们增加到事情表中就能够了,参考上面的代码片断:
//1.增加Label对象
jxl.write.LabellabelC=newjxl.write.Label(0,0,"ThisisaLabelcell");
ws.addCell(labelC);//增加带有字型Formatting的对象
jxl.write.WritableFontwf=newjxl.write.WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);
jxl.write.WritableCellFormatwcfF=newjxl.write.WritableCellFormat(wf);
jxl.write.LabellabelCF=newjxl.write.Label(1,0,"ThisisaLabelCell",wcfF);
ws.addCell(labelCF);//增加带有字体色彩Formatting的对象
jxl.write.WritableFontwfc=newjxl.write.WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,
Underlinestyle.NO_UNDERLINE,jxl.format.Colour.RED);
jxl.write.WritableCellFormatwcfFC=newjxl.write.WritableCellFormat(wfc);
jxl.write.LabellabelCFC=newjxl.write.Label(1,0,"ThisisaLabelCell",wcfFC);
ws.addCell(labelCF);//2.增加Number对象
jxl.write.NumberlabelN=newjxl.write.Number(0,1,3.1415926);
ws.addCell(labelN);//增加带有formatting的Number对象
jxl.write.NumberFormatnf=newjxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormatwcfN=newjxl.write.WritableCellFormat(nf);
jxl.write.NumberlabelNF=newjxl.write.Number(1,1,3.1415926,wcfN);
ws.addCell(labelNF);//3.增加Boolean对象
jxl.write.BooleanlabelB=newjxl.write.Boolean(0,2,false);
ws.addCell(labelB);//4.增加DateTime对象
jxl.write.DateTimelabelDT=newjxl.write.DateTime(0,3,newjava.util.Date());
ws.addCell(labelDT);//增加带有formatting的DateFormat对象
jxl.write.DateFormatdf=newjxl.write.DateFormat("ddMMyyyyhh:mm:ss");
jxl.write.WritableCellFormatwcfDF=newjxl.write.WritableCellFormat(df);
jxl.write.DateTimelabelDTF=newjxl.write.DateTime(1,3,newjava.util.Date(),wcfDF);
ws.addCell(labelDTF);这里有两点人人要引发人人的注重。第一点,在机关单位格时,单位格在事情表中的地位就已断定了。一旦创立后,单位格的地位是不克不及够变动的,只管单位格的内容是能够改动的。第二点,单位格的定位是依照上面如许的纪律(column,row),并且下标都是从0入手下手,比方,A1被存储在(0,0),B1被存储在(1,0)。最初,不要健忘封闭翻开的Excel事情薄对象,以开释占用的内存,拜见上面的代码片断://写进Exel事情表
wwb.write();//封闭Excel事情薄对象
wwb.close();这大概与读取Excel文件的操纵有极少分歧,在封闭Excel对象之前,你必需要先挪用write()办法,由于先前的操纵都是存储在缓存中的,以是要经由过程该办法将操纵的内容保留在文件中。假如你先封闭了Excel对象,那末只能失掉一张空的事情薄了。3、拷贝、更新Excel事情薄接上去扼要先容一下怎样更新一个已存在的事情薄,次要是上面二步操纵,第一步是机关只读的Excel事情薄,第二步是使用已创立的Excel事情薄创立新的可写进的Excel事情薄,参考上面的代码片断:(完全代码见ExcelModifying.java)//创立只读的Excel事情薄的对象
jxl.Workbookrw=jxl.Workbook.getWorkbook(newFile(sourcefile));//创立可写进的Excel事情薄对象
jxl.write.WritableWorkbookwwb=Workbook.createWorkbook(newFile(targetfile),rw);//读取第一张事情表
jxl.write.WritableSheetws=wwb.getSheet(0);//取得第一个单位格对象
jxl.write.WritableCellwc=ws.getWritableCell(0,0);//判别单位格的范例,做出响应的转化
if(wc.getType()==CellType.LABEL)
{
Labell=(Label)wc;
l.setString("Thevaluehasbeenmodified.");
}//写进Excel对象
wwb.write();//封闭可写进的Excel对象
wwb.close();//封闭只读的Excel对象
rw.close();之以是利用这类体例构建Excel对象,完整是由于效力的缘故原由,由于下面的示例才是API的次要使用。为了进步功能,在读取事情表时,与数据相干的一些输入信息,一切的格局信息,如:字体、色彩等等,是不被处置的,由于我们的目标是取得行数据的值,既使没有了润色,也不会对行数据的值发生甚么影响。独一的倒霉的地方就是,在内存中会同时保留两个一样的事情表,如许当事情表体积对照年夜时,会占用相称年夜的内存,但如今仿佛内存的巨细并非甚么关头要素了。一旦取得了可写进的事情表对象,我们就能够对单位格对象举行更新的操纵了,在这里我们不用挪用API供应的add()办法,由于单位格已于事情表傍边,以是我们只必要挪用响应的setXXX()办法,就能够完成更新的操纵了。尽单位格原本的格局化润色是不克不及往失落的,我们仍是能够将新的单位格润色加上往,以使单位格的内容以分歧的情势体现。重生成的事情表对象是可写进的,我们除更新原本的单位分外,还能够增加新的单位格到事情表中,这与示例2的操纵是完整一样的。最初,不要健忘挪用write()办法,将更新的内容写进到文件中,然后封闭事情薄对象,这里有两个事情薄对象要封闭,一个是只读的,别的一个是可写进的。
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的), |
|