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);
             
             
             
     }
 }