本篇主要讲的是接口writableSheet,writableSheet中的方法是对工作表进行写和读方面的操作,其中包括添加单元格、设置行高、设置列宽、添加超链接、添加图片、插入一行或一列数据和删除行或列等操作。令人感到不好的消息是该接口所提供的有些方法在我使用时还是遇到了问题,同样希望小伙伴们自己测试测试。话不多说,直接上代码。
import java.io.File;
import java.io.IOException;
import java.net.URL;
import jxl.CellView;
import jxl.Range;
import jxl.Workbook;
import jxl.format.PageOrientation;
import jxl.format.PaperSize;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableHyperlink;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class TWritableSheet {
public static void main(String [] args) throws IOException, BiffException, IndexOutOfBoundsException, WriteException {
Workbook book;
WritableWorkbook wb;
File file = new File(“D://JEtest/测试.xls”);
book = Workbook.getWorkbook(file);
wb = Workbook.createWorkbook(file, book);
try {
WritableSheet wSheet = wb.getSheet(3);
//添加单元格到工作表中
Label label = new Label(3, 5, "yrs");
wSheet.addCell(label);
//设置工作表名称
wSheet.setName("yrs");
//设置隐藏。弃用,使用SheetSettings里的。
//void setHidden(boolean hidden)
//设置是否保护,弃用,使用SheetSettings里的。
//void setProtected(boolean prot)
//设置工作表指定列的宽度。这导致Excel调整整个列。如果已经指定的列视图相关联的信息,然后取而代之的是新的数据
//第一个参数是列,第二个参数是宽度
wSheet.setColumnView(0, 15);
//void setColumnView(int col,int width,CellFormat format)
//弃用,取而代之的是 CellView
//void setColumnView(int col,CellView view)
//设置这个列的视图
CellView view = new CellView();
//设置单元格自动调整宽度
view.setAutosize(true);
wSheet.setColumnView(1, view);
//设置指定行的高度
//void setRowView(int row,int height)throws jxl.write.biff.RowsExceededException
wSheet.setRowView(0, 500);
//void setRowView(int row,boolean collapsed)throws jxl.write.biff.RowsExceededException
//collapsed - indicates whether the row is collapsed
//设定指定行是否崩溃,true 是显示,false不显示该行
wSheet.setRowView(10,false);
//void setRowView(int row,int height,boolean collapsed)throws jxl.write.biff.RowsExceededException
//设置指定行的高度和崩溃属性。false显示该行,true不显示该行
wSheet.setRowView(5, 400, false);
//void setRowView(int row,CellView view)
//设置行视图
CellView view2 = new CellView();
wSheet.setRowView(19, view2);
System.out.println(view2.isAutosize() + " " + view2.isHidden());
//?????????奇怪,运行之后该行不显示了。??????????
//WritableCell getWritableCell(int column, int row)
//返回可写单元格
WritableCell wCell = wSheet.getWritableCell(2, 0);
System.out.println("单元格的内容: " + wCell.getContents());
//WritableCell getWritableCell(java.lang.String loc)
//根据 loc 返回单元格。 例如"A4",考虑到性能问题,尽量少用
WritableCell wCell2 = wSheet.getWritableCell("A2");
System.out.println("单元格的内容: " + wCell2.getContents());
//WritableHyperlink[] getWritableHyperlinks()
//得到这个表中可写的超链接。返回的超链接可能由用户应用程序修改
WritableHyperlink [] wHlArr = wSheet.getWritableHyperlinks();
System.out.println("超链接个数: " + wHlArr.length);
//void insertRow(int row)
//插入一个空白行,如果row超出工作表的范围,则不做任何动作
//row是行索引。
//wSheet.insertRow(1);
//void insertColumn(int col)
//插入一列。col是列索引.如果col超出工作表的范围,则不做任何动作
//wSheet.insertColumn(1);
//void removeColumn(int col)
//移除一列,如果col超出工作表的范围,则不做任何动作
//wSheet.removeColumn(1);
//void removeRow(int row)
//移除一行,如果row超出工作表的范围,则不做任何动作
//wSheet.removeRow(1);
//Range mergeCells(int col1,int row1,int col2,int row2) throws WriteException,jxl.write.biff.RowsExceededException
//合并单元格,(col1,row1)是合并单元格左上角的单元格,(col2,row2)是右下角单元格
Range range = wSheet.mergeCells(0, 0, 2, 2);
//void setRowGroup(int row1,int row2, boolean collapsed)throws WriteException,jxl.write.biff.RowsExceededException
//设置一个行组
//wSheet.setRowGroup(5, 7, true);
//void unsetRowGroup(int row1,int row2)throws WriteException,jxl.write.biff.RowsExceededException
//????????????????????????????????
//wSheet.unsetRowGroup(5, 7);
//void setColumnGroup(int row1,int row2, boolean collapsed)throws WriteException,jxl.write.biff.RowsExceededException
//wSheet.setColumnGroup(4, 5, true);
//void unsetColumnGroup(int row1,int row2)throws WriteException,jxl.write.biff.RowsExceededException
//wSheet.unsetColumnGroup(4,5);
//拆分合并的单元格
wSheet.unmergeCells(range);
//添加超链接
URL url = new URL("http://www.baidu.com");
WritableHyperlink wHyperlink = new WritableHyperlink(8,0,url);
wSheet.addHyperlink(wHyperlink);
WritableHyperlink wHyperlink2 = new WritableHyperlink(8,1,url);
wSheet.addHyperlink(wHyperlink2);
WritableHyperlink wHyperlink3 = new WritableHyperlink(8,2,url);
wSheet.addHyperlink(wHyperlink3);
//移除超链接
wSheet.removeHyperlink(wHyperlink2);
//移除超链接,true 是保留内容,false是不保留
wSheet.removeHyperlink(wHyperlink3, true);
//设置页面设置的细节, 参数是页面方向。
//PageOrientation.LANDSCAPE 横向 , PageOrientation.PORTRAIT 纵向
//void setPageSetup(PageOrientation p)
//wSheet.setPageSetup(PageOrientation.PORTRAIT);
wSheet.setPageSetup(PageOrientation.LANDSCAPE);
//void setPageSetup(PageOrientation p,double hm,double fm)
//p - the page orientation
//hm - the header margin, in inches
//fm - the footer margin, in inches
wSheet.setPageSetup(PageOrientation.PORTRAIT, 10, 10);
//void setPageSetup(PageOrientation p,PaperSize ps,double hm,double fm)
//p - the page orientation
//ps - the paper size
//hm - the header margin, in inches
//fm - the footer margin, in inches
wSheet.setPageSetup(PageOrientation.PORTRAIT, PaperSize.A4 , 20, 20);
//##########好像没变化??????
//void addRowPageBreak(int row)
//Forces a page break at the specified row
wSheet.addRowPageBreak(3);
//void addColumnPageBreak(int col)
//Forces a page break at the specified column
wSheet.addColumnPageBreak(3);
//void addImage(WritableImage image)
//添加图片,只支持png类型。
File image = new File("D://JEtest/abc.png");
WritableImage wImage = new WritableImage(8,4,5,5,image);
wSheet.addImage(wImage);
WritableImage wImage2 = new WritableImage(8,8,5,5,image);
wSheet.addImage(wImage2);
//int getNumberOfImages()
//得到图片的数量
int imageNumbers = wSheet.getNumberOfImages();
System.out.println("工作表中图片的数量: " + imageNumbers);
//WritableImage getImage(int i)
//返回指定的图片,索引从0开始
WritableImage wImage3 = wSheet.getImage(1);
//移除图片
wSheet.removeImage(wImage3);
//void applySharedDataValidation(WritableCell cell,int col,int row) throws WriteException
//Extend the data validation contained in the specified cell across and downwards.
//NOTE: The source cell (top left) must have been added to the sheet prior to this method being called
wSheet.applySharedDataValidation(wCell2, 5, 5);
wSheet.removeSharedDataValidation(wCell2);
wb.write();
wb.close();
book.close();
}catch (IOException | IndexOutOfBoundsException | WriteException e) {
System.out.println("Exception: " + e);
throw e;
writableSheet接口所提供的方法对于创建Excel表并添加数据是非常重要的,希望大家能够灵活掌握,下次writableCell再见!
本篇主要讲的是接口writableSheet,writableSheet中的方法是对工作表进行写和读方面的操作,其中包括添加单元格、设置行高、设置列宽、添加超链接、添加图片、插入一行或一列数据和删除行或列等操作。令人感到不好的消息是该接口所提供的有些方法在我使用时还是遇到了问题,同样希望小伙伴们自己测试测试。话不多说,直接上代码。import java.io.File;import java.io.IOException;import java.net.URL;import jxl.CellView
// 创建Excel工作表 指定名称和位置
String fileName = File.separator +"POS全场折扣-批次:"+batchid; //文件名
// createExcel文件
String filePath = FileUtil.POS_root + File.separator +"全
public class testJxl {
public static void main(String[] args) throws Exception {
OutputStream out = new FileOutputStream("./aaaa.xls"); // 写入到FileInputStream
WritableWorkbook wwb= Workbook.createWorkbook(out);
WritableSheet ws1=wwb.createSheet("test1", 0) ; // 得到工作薄中的第一个工作表
File fileImg = new File("./kkkk.bmp");
byte imageData[] = new byte[(int)fileImg.length()];
FileInputStream fis = new FileInputStream(fileImg);
fis.read(imageData);
能够修饰单元格属性
支持图像和图表
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
将下载后的文件解包,得到JXL.JAR,放入classpath,安装就完成了。如果包不能正常的加载,可以把你下载好的JXL.JAR包放入D:\JAVA\jre\lib\ext中(我的是JDK1.6)就OK了。我相信在配置TOMCAT时也需要把相关的三个包放到这里面。
基本操作
一、创建文件
拟生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:
代码(CreateXLS.java):
//生成Excel的类
import java.io.*;
import jxl.*;
import jxl.write.*;
public class CreateXLS
public static void main(String args[])
//打开文件
WritableWorkbook book=
Workbook.createWorkbook(new File(“测试.xls”));
//生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet=book.createSheet(“第一页”,0);
//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
//以及单元格内容为test
Label label=new Label(0,0,”test”);
//将定义好的单元格添加到工作表中
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[])
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[])
//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中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。
1、字串格式化
字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由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。
1、 合并单元格
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);
合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。
2、 行高和列宽
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;
OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的。
下面是程序一例:
程序代码:sql = "select * from tablename";
rs = stmt.executeQuery(sql);
//新建Excel文件
String filePath=request.getRealPath("aaa.xls");
File myFilePath=new File(filePath);
if(!myFilePath.exists())
myFilePath.createNewFile();
FileWriter resultFile=new FileWriter(myFilePath);
PrintWriter myFile=new PrintWriter(resultFile);
resultFile.close();
//用JXL向新建的文件中添加内容
OutputStream outf = new FileOutputStream(filePath);
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(outf);
jxl.write.WritableSheet ws = wwb.createSheet("sheettest", 0);
int i=0;
int j=0;
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
ws.addCell(new Label(k,0,rs.getMetaData().getColumnName(k+1)));
while(rs.next()){
out.println(rs.getMetaData().getColumnCount());
for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
ws.addCell(new Label(k,j+i+1,rs.getString(k+1)));
wwb.write();
wwb.close();
}catch(Exception e){e.printStackTrace();}
finally{
rs.close();
conn.close();
response.sendRedirect("aaa.xls");
今天工作中再次用的WritableSheet,这个东西两年前用过一次,当时没怎么仔细研究,现在几乎全忘了。因为今天要做的是创建一个excel并向文件中写入内容,而且还可修改该文件的内容。
下载了个jxl的api,看到WritableSheet中根本没有类似getWritableSheet的方法来获取WritableSheet,Workbook中的createWorkb...
//-------------------------------------完單項目剩餘物料申報表--------------------------------------------------------------
@RequestMapping(value = "c
通过Java向Excel的一个单元格中写入大量的文字,即使在文字中使用 \n 符号进行换行操作,当打开Excel表格的时候,发现文字不能按照我们预先设定的方法换行,而是显示在一行里面,导致整个Excel表格显示都乱掉了。必须得通过鼠标单击一下这个单元格文字才能按照单元格的宽度和程序中的换行命令实现换行的显示效果。
本文提供了一种可行的解决方案。
Java代码
java.lang.NullPointerException
at jxl.write.biff.WritableSheetCopier.shallowCopyCells(WritableSheetCopier.java:499) [jxl.ja
r:na]
at jxl.write.biff.WritableSheetCopier.copySheet(WritableSheetCopier.java:239) [jxl.jar:na]
at jxl.write.biff.WritableSheetImpl.copy(WritableSheetImpl.java:1622) [jxl.jar:na]
at jxl.write.biff.WritableWorkbookImpl.copySheet(WritableWorkbookImpl.java:987) [jxl.jar:na]
今天调试了一下,发现在jxl.write.biff.WritableSheetCopier.shallowCopyCells方法中有如下代码
Java代码
if (c.getCellFeatures() != null & c.getCellFeatures().hasDataValidation())
validatedCells.add(c);
细心的人都不难发现,代码中少写了一个&符,虽然也可以用来表示“且”的逻辑,但一个&符是没有用到短路算法的,这样就会导致不 管&前面表达式的结果是true还是flase,&符后面的表达式都会执行。在这段代码中,在c.getCellFeatures()是 null 的情况下,c.getCellFeatures().hasDataValidation()必然会报 java.lang.NullPointerException异常。
想不到有么有名的jxl也会犯这么低级的错误。
在分析中,我设计了三种数据,第一种是a[i] = n - i;也就是最坏的情况。第二种的a[i] = i;这是最好的情况。第三中是a[i] = 一个随机数,也就是平均情况。
这里用了jxl这个包,将得出的数据导入进excel表中,并绘制出图像。
import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.Writ...
WritableSheet.mergeCells(int m,int n,int p,int q);
作用是从(m,n)到(p,q)的单元格全部合并,比如:
WritableSheet sheet=book.createSheet(“第一页”,0);
//合并第一列第一行到第六列第一行的所有单元格
1.WriterableWorkbook: 通过Workbook.createdWorkbook()静态方法创建出来。 其作用是相当于excel软件界面。
2.WriterableSheet: 通过WritableWorkbook.createSheet()方法创建出来。 其作用相当于excel表格的页
3.Label: 控制数据插入在表格的哪一行 new Label(0, 0, "学校")。 第一个参数为表格的列,第二个参数为表格的行数(表格是以 0,0 坐标为起始点) 第三个参
1、Java编程中Excel常用格式汇总
第一行标题的格式定义
WritableWorkbook workbook = Workbook.createWorkbook(file);
WritableSheet sheet = workbook.createSheet("报表统计", 0); //单元格
Writable
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
是的,Java中可以使用jxl库来处理Excel文件。jxl是一种开源的Java API,它提供了许多类和方法来读取、写入和修改Excel文件。以下是一个简单的例子,演示如何使用jxl库读取Excel文件中的数据:
import jxl.*;
import java.io.*;
public class ReadExcel {
public static void main(String[] args) {
try {
// 打开文件
Workbook workbook = Workbook.getWorkbook(new File("data.xls"));
// 获取第一个工作表
Sheet sheet = workbook.getSheet(0);
// 获取行数和列数
int rows = sheet.getRows();
int cols = sheet.getColumns();
// 遍历行和列,读取数据
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
Cell cell = sheet.getCell(col, row);
System.out.print(cell.getContents() + "\t");
System.out.println();
// 关闭文件
workbook.close();
} catch (Exception e) {
e.printStackTrace();
该程序打开名为data.xls的Excel文件,并读取第一个工作表的所有数据,然后将其打印到控制台上。你可以根据需要修改该程序,以实现其他Excel文件处理任务。