java 生成Excel工作薄

来源:互联网 发布:极限矩阵是什么牌子 编辑:程序博客网 时间:2024/03/29 05:45

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

 

 

 

 

 

 

 

 

原创粉丝点击