java 生成Excel工作薄与读取Excel工作表相似,首先要使用Workbook类的工厂方法创建一个可写入的工作薄 (Workbook)对象,这里要注意的是,只能通过API提供的工厂方法来创建Workbook,而不能使用WritableWorkbook的构造函数,因为类WritableWorkbook的构造函数为protected类型。示例代码片段如下:
import java.io.*;
import jxl.*;
import jxl.write.*;
… … … …
try
{
//构建Workbook对象, 只读Workbook对象
//Method 1:创建可写入的Excel工作薄
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
//Method 2:将WritableWorkbook直接写入到输出流
/*
OutputStream os = new FileOutputStream(targetfile);
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
*/
}
catch (Exception e)
{
e.printStackTrace();
}
API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问Web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel 电子表格。
接下来就是要创建工作表,创建工作表的方法与创建工作薄的方法几乎一样,同样是通过工厂模式方法获得相应的对象,该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,参考下面的代码片段:
创建Excel工作表
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
现在要做的只是实例化API所提供的Excel基本数据类型,并将它们添加到工作表中就可以了,参考下面的代码片段:
//1.添加Label对象
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
ws.addCell(labelC);
//添加带有字型Formatting的对象
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);
//添加带有字体颜色Formatting的对象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
//2.添加Number对象
jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);
//添加带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
//3.添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
//4.添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
//添加带有formatting的DateFormat对象
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.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.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
//创建可写入的Excel工作薄对象
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile), rw);
//读取第一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);
//获得第一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
//判断单元格的类型, 做出相应的转化
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();
举例:
//以下开始输出到EXCEL
try {
/************创建工作簿*************/
WritableWorkbook workbook = Workbook.createWorkbook(new File(sCurrPath));
/************创建工作表*************/
WritableSheet sheet = workbook.createSheet("定单", 0);
/************设置页眉、页脚******************/
sheet.setHeader("页眉","","第 &P 页,共 &N 页"); //设置页眉
sheet.setFooter("","","&D &T"); //设置页脚
/******注:以上这些&P、&D等参数可以从EXCEL的宏录制取得********/
/***********设置列宽*****************/
sheet.setColumnView(0,13); //第1列
sheet.setColumnView(1,26); //第2列
sheet.setColumnView(2,13);
sheet.setColumnView(3,26);
/**************设置单元格字体***************/
WritableFont NormalFont = new WritableFont(WritableFont.ARIAL,10);
WritableFont BoldFont = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD);
/**************以下设置几种格式的单元格*************/
//用于标题
WritableCellFormat wcf_title = new WritableCellFormat(BoldFont);
wcf_title.setBorder(Border.NONE, BorderLineStyle.THIN); //线条
wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_title.setAlignment(Alignment.CENTRE); //水平对齐
wcf_title.setWrap(false); //是否换行
//用于正文左
WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
wcf_left.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_left.setAlignment(Alignment.LEFT);
wcf_left.setWrap(true); //是否换行
//用于正文右
WritableCellFormat wcf_right = new WritableCellFormat(NormalFont);
wcf_right.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_right.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_right.setAlignment(Alignment.RIGHT);
wcf_right.setWrap(false); //是否换行
//用于跨行
WritableCellFormat wcf_merge = new WritableCellFormat(NormalFont);
wcf_merge.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_merge.setVerticalAlignment(VerticalAlignment.TOP); //垂直对齐
wcf_merge.setAlignment(Alignment.LEFT);
wcf_merge.setWrap(true); //是否换行
/**************单元格格式设置完成*******************/
/*****************以下是标题***************************/
sheet.mergeCells(0, 0, 3, 0); //合并单元格
sheet.addCell(new Label(0,0,"标题",wcf_title));
/*****************以下是定单内容**********************/
sheet.addCell(new Label(0,2,"正文左",wcf_right));
sheet.addCell(new Label(0,3,"正文左1",wcf_right));
sheet.addCell(new Label(2,2,"正文左2",wcf_right));
sheet.addCell(new Label(2,3,"正文左3",wcf_right));
sheet.addCell(new Label(1,2,"正文右",wcf_left));
sheet.addCell(new Label(1,3,"正文右1",wcf_left));
sheet.addCell(new Label(3,2,"正文右2",wcf_left));
sheet.addCell(new Label(3,3,"正文右3",wcf_left));
/*************详细内容***************/
sheet.mergeCells(0, 4, 3, 4);
sheet.setRowView(4,50); //设置行高
sheet.addCell(new Label(0,4,"跨行内容",wcf_merge));
/****************联系/回复方式等*******************/
int iRow = 4;
sheet.addCell(new Label(0,iRow+1,"正文左",wcf_right));
sheet.addCell(new Label(0,iRow+2,"正文左1",wcf_right));
sheet.addCell(new Label(0,iRow+3,"正文左2",wcf_right));
sheet.addCell(new Label(2,iRow+1,"正文左3",wcf_right));
sheet.addCell(new Label(2,iRow+2,"正文左4",wcf_right));
sheet.addCell(new Label(2,iRow+3,"正文左5",wcf_right));
sheet.addCell(new Label(1,iRow+1,"正文右",wcf_left));
sheet.addCell(new Label(1,iRow+2,"正文右1",wcf_left));
sheet.addCell(new Label(1,iRow+3,"正文右2",wcf_left));
sheet.addCell(new Label(3,iRow+1,"正文右3",wcf_left));
sheet.addCell(new Label(3,iRow+2,"正文右4",wcf_left));
sheet.addCell(new Label(3,iRow+3,"正文右5",wcf_left));
sheet.mergeCells(0,iRow+4,3,iRow+4);
sheet.setRowView(iRow+4,50);
sheet.addCell(new Label(0,iRow+4,"跨行内容1",wcf_merge));
/************以上所写的内容都是写在缓存中的,下一句将缓存的内容写到文件中*********/
workbook.write();
/***********关闭文件**************/
workbook.close();
bExportSucc = true;
} catch(Exception e){
sErrorStr = e.toString();
System.out.println("在输出到EXCEL的过程中出现错误,错误原因:"+e.toString());
}
提供连接用户下载XLS文件的
String sHead="/ucss/files/";
String sFileName="Test.xls";
String sCurrPath=application.getRealPath(sHead);
if(!sCurrPath.substring(sCurrPath.length()-1).equals("/"))sCurrPath=sCurrPath+"/";
sCurrPath=sCurrPath+sFileName;
//获取文件的URL地址
String sAttachServer="127.0.0.1";
if(sAttachServer.length()==0)
sAttachServer=request.getServerName()+":"+request.getServerPort();
String sUrlPath="http://"+sAttachServer+sHead+sFileName; <A HREF="<%=sUrlPath%>">将EXCEL文件下载到本地</A>
--------------------------------------------
package data.outExcel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class OutExcel {
String fileurl=null;
public OutExcel(){}
public OutExcel(String fileurl){
this.fileurl=fileurl;
}
public static WritableWorkbook getWorkbook(File fos){
//获取创建XLS对象
WritableWorkbook ww=null;
try {
ww = Workbook.createWorkbook(fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return ww;
}
public static void closeWorkbook(WritableWorkbook ww){
try {
ww.close();
}catch (WriteException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
public void writerXls(int row,String [] column){
File fos;
try {
fos=new File(this.fileurl);
WritableWorkbook ww=getWorkbook(fos);
//创建XLS文件表该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置
WritableSheet ws=ww.createSheet("mySheet",0);
//写入单元格值方法:第一个是列数,第二个是行数,第三个参数是值内容
ws.addCell(new Label(0,0,"时间"));
ws.addCell(new Label(1,0,"pv数"));//第一行做标题行
for(int j=1;j<row;j++){
Label lab=null;
for (int i = 0; i < column.length; i++) {
String strData=(String) column[i];
lab=new Label(i,j,strData);
ws.addCell(lab);
}
}
//以上所写的内容都是写在缓存中的,下一句将缓存的内容写到文件中
ww.write();
//关闭
closeWorkbook(ww);
} catch (IOException e) {
e.printStackTrace();
}catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
public static void main(String str[]){
int i=5;
String buf[]={"009","abc"};
OutExcel oe=new OutExcel("D:/outXls.xls");
oe.writerXls(5, buf);
}
}