java操作Excel

来源:互联网 发布:租房网站推荐 知乎 编辑:程序博客网 时间:2024/06/05 05:36


现在想要导出一组数据为Excel文件,那么可以这样:(首先需要jxl.jar包,我的是jxl-2.6.jar)

  1. /** 
  2.      * 导出报修单 
  3.      * @param mapping 
  4.      * @param form 
  5.      * @param request 
  6.      * @param response 
  7.      * @return 
  8.      * @throws IOException  
  9.      * @throws WriteException  
  10.      */  
  11.     public ActionForward print(ActionMapping mapping, ActionForm form,  
  12.             HttpServletRequest request, HttpServletResponse response) throws IOException, WriteException {  
  13.         response.reset();//设置页面不缓存  
  14.         response.setContentType("application/vnd.ms-excel");//设置文件流导出格式  
  15.         List expendInfoList=dao.findByProperty("states"1);//此为查询出数据返回为List  
  16.         ExpendablesfixToExcel ef=new ExpendablesfixToExcel(response.getOutputStream());//此为定义的导出EXCEL类,将输出流传入到构造函数中  
  17.         ef.ebfToExcel(expendInfoList);//调用导出类里的导出方法  
  18.         return null;  
  19.     }  

 以下为导出方法:

  1. import java.io.IOException;  
  2. import java.io.OutputStream;  
  3. import java.util.List;  
  4.   
  5. import jxl.Workbook;  
  6. import jxl.write.Label;  
  7. import jxl.write.WritableCellFormat;  
  8. import jxl.write.WritableFont;  
  9. import jxl.write.WritableSheet;  
  10. import jxl.write.WritableWorkbook;  
  11. import jxl.write.WriteException;  
  12.   
  13. import com.ghtn.techschool.entitys.Expendablesfix;  
  14.   
  15. public class ExpendablesfixToExcel {  
  16.   
  17.     OutputStream os;//输出流  
  18.     WritableWorkbook wb;//建立Excel文件  
  19.     WritableSheet ws;//sheet名称  
  20.       
  21.     /** 
  22.      * 构造函数 
  23.      * @param os 
  24.      * @throws IOException 
  25.      */  
  26.     public ExpendablesfixToExcel(OutputStream os)throws IOException{  
  27.         this.os=os;  
  28.     }  
  29.       
  30.     /** 
  31.      * 导出Excel方法 
  32.      * @param list 
  33.      * @throws WriteException 
  34.      */  
  35.     public void ebfToExcel(List<expendablesfix> list) throws WriteException{  
  36.         //设置样式(这个方法算是一个容器,可以放进去好多属性;  
  37.         //第一个: TIMES是字体大小,这里写的是12;第二个: BOLD是判断是否为斜体,选择true时为斜体;  
  38.         //第三个: ARIAL;第四个: UnderlineStyle.NO_UNDERLINE 下划线;  
  39.         //第五个: jxl.format.Colour.RED 字体颜色是红色的)  
  40.         WritableFont font2 = new WritableFont(WritableFont.TIMES, 12,  
  41.                 WritableFont.BOLD);  
  42.         WritableCellFormat format2 = new WritableCellFormat(font2);  
  43.         format2.setAlignment(jxl.format.Alignment.CENTRE);//设置居中  
  44.         try{  
  45.             wb=Workbook.createWorkbook(os);  
  46.             ws=wb.createSheet("报修单"0);  
  47.               
  48.             //第一个是代表列数,   
  49.             //第二是代表行数,   
  50.             //第三个代表要写入的内容   
  51.             //第四个是可选项,是输入这个label里面的样式   
  52.             //然后通过写sheet的方法addCell()把内容写进sheet里面。   
  53.             Label labelA=new Label(0,0,"报修人",format2);  
  54.             ws.addCell(labelA);  
  55.               
  56.             Label labelB=new Label(1,0,"所在部门",format2);  
  57.             ws.addCell(labelB);  
  58.               
  59.             Label labelC=new Label(2,0,"报修日期",format2);  
  60.             ws.addCell(labelC);  
  61.               
  62.             Label labelD=new Label(3,0,"消耗品名称",format2);  
  63.             ws.addCell(labelD);  
  64.               
  65.             Label labelF=new Label(4,0,"消耗品报修描述",format2);  
  66.             ws.addCell(labelF);  
  67.   
  68.             writeRecruit(list);//获取动态内容的方法  
  69.             wb.write();//写入  
  70.             wb.close();//关闭  
  71.         }catch(Exception e){  
  72.             e.printStackTrace();  
  73.         }  
  74.     }  
  75.       
  76.     private void writeRecruit(List<expendablesfix> stuList){  
  77.         if(stuList.size()==0){  
  78.             return ;  
  79.         }  
  80.         for(int i=0;i<stuList.size();i++){  
  81.             String person="";//报修人  
  82.             if(null!=stuList.get(i).getBxr()){  
  83.                 person=stuList.get(i).getBxr().toString();  
  84.             }  
  85.             Label labelBxr = new Label(0,i+1,person);  
  86.               
  87.             String dept="";//所在部门  
  88.             if(null!=stuList.get(i).getBm()){  
  89.                 dept=stuList.get(i).getBm().toString();  
  90.             }  
  91.             Label labelBm=new Label(1,i+1,dept);  
  92.               
  93.             String date="";//报修日期  
  94.             if(null!=stuList.get(i).getBdate()){  
  95.                 date=stuList.get(i).getBdate().toString();  
  96.             }  
  97.             Label labelBdate=new Label(2,i+1,date);  
  98.               
  99.             String name="";//消耗品名称  
  100.             if(null!=stuList.get(i).getExpendablesname()){  
  101.                 name=stuList.get(i).getExpendablesname().toString();  
  102.             }  
  103.             Label labelName=new Label(3,i+1,name);  
  104.               
  105.             String descrition="";//消耗品报修描述  
  106.             if(null!=stuList.get(i).getBxzk()){  
  107.                 descrition=stuList.get(i).getBxzk().toString();  
  108.             }  
  109.             Label labelDescrition=new Label(4,i+1,descrition);  
  110.               
  111.             /* 
  112.              * 统一添加到列表中 
  113.              * */  
  114.             try{  
  115.                 ws.addCell(labelBxr);  
  116.                 ws.addCell(labelBm);  
  117.                 ws.addCell(labelBdate);  
  118.                 ws.addCell(labelName);  
  119.                 ws.addCell(labelDescrition);  
  120.             }catch(Exception e){  
  121.                 e.printStackTrace();  
  122.             }  
  123.         }  
  124.     }  
  125. }  
  126. </expendablesfix></expendablesfix>  


 

写入数据的时候注意的格式 


(1)添加的字体样式 
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true); 
WritableFont()方法里参数说明: 
这个方法算是一个容器,可以放进去好多属性 
第一个: TIMES是字体大小,他写的是18 
第二个: BOLD是判断是否为斜体,选择true时为斜体 
第三个: ARIAL 
第四个: UnderlineStyle.NO_UNDERLINE 下划线 
第五个: jxl.format.Colour.RED 字体颜色是红色的 

jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf); 

jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell",wcfF); 
ws.addCell(labelC); 
在Label()方法里面有三个参数 
第一个是代表列数, 
第二是代表行数, 
第三个代表要写入的内容 
第四个是可选项,是输入这个label里面的样式 
然后通过写sheet的方法addCell()把内容写进sheet里面。 

(2)添加带有formatting的Number对象 
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); 


(3)添加Number对象 
(3.1)显示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); 
Number()方法参数说明: 
前两上表示输入的位置 
第三个表示输入的内容 


(4)添加Boolean对象 
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false); 
ws.addCell(labelB); 


(5)添加DateTime对象 
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date()); 
ws.addCell(labelDT); 
  DateTime()方法的参数说明 
前两个表示输入的位置 
第三个表示输入的当前时间 


(6)添加带有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); 

(7)添加带有字体颜色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); 

import="jxl.format.* 
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN); 

(8)设置单元格样式 

jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc); 
wcfFC.setBackGround(jxl.format.Colour.RED);//设置单元格的颜色为红色 
wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);

 

下面是一段网友操作的例子:

我写的练习代码如下:(注意里面的图片替换成自己的就可以了)

 

import java.io.*;

import java.util.Random;

import java.util.Date;

import jxl.*;

import jxl.format.UnderlineStyle;

import jxl.write.*;

import jxl.write.Number;

import jxl.write.Boolean;

public class CreateXL

{

    public CreateXL()

    {

 

    }

    public static void main(String[] args)

    {

        //读Excel

        //CreateXL.readExcel("d:/abc.xls");

 

        //创建新的Excel

        CreateXL.writeExcel("d:/new.xls");

 

        //更新Excel

        CreateXL.updateExcel("d:/new.xls");

 

    }

    //jxl暂时不提供修改已经存在的数据表,这里通过一个小办法来达到这个目的,不适合大型数据更新!

    //这里是通过覆盖原文件来更新的.

    public static void updateExcel(String filePath)

    {

        try

        {

            Workbook rwb = Workbook.getWorkbook(new File(filePath));

            WritableWorkbook wwb = Workbook.createWorkbook(new File("d:/new.xls"),rwb);//copy

            WritableSheet ws = wwb.getSheet(0);

            WritableCell wc = ws.getWritableCell(0,0);

            //判断单元格的类型,做出相应的转换

            Label label = (Label)wc;

            label.setString("The value has been modified");

            wwb.write();

            wwb.close();

            rwb.close();

        }

        catch(Exception e)

        {

            e.printStackTrace();

        }

    }

 

    public static void writeExcel(String filePath)

    {

        try

        {

            //创建工作薄

            WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath));

 

            //创建工作表

            WritableSheet ws = wwb.createSheet("Sheet1",0);

            //System.out.println("create ok!");

 

            //添加标签文本

            Random rnd=new Random((new Date()).getTime());

            int forNumber=rnd.nextInt(100);

            for(int i=0;i<forNumber;i++)

            {

                ws.addCell(new Number(rnd.nextInt(50),rnd.nextInt(50),rnd.nextInt(1000)));

            }

 

            //添加图片(注意此处jxl暂时只支持png格式的图片)

      //0,1分别代表x,y    2,5代表宽和高占的单元格数

      ws.addImage(new WritableImage(0,1,2,5,new File("png//cs.png")));

 

            wwb.write();

      wwb.close();

        }

        catch(Exception e)

        {

            System.out.println(e.toString());

        }

    }

    public static void readExcel(String filePath)

    {

        /**

         *后续考虑问题,比如Excel里面的图片以及其他数据类型的读取

         **/

        try

        {

            InputStream is=new FileInputStream(filePath);

            //声名一个工作薄

            Workbook rwb = Workbook.getWorkbook(is);

 

            //获得工作薄的个数

            //rwb.getNumberOfSheets();

 

            //在Excel文档中,第一张工作表的缺省索引是0

            Sheet st = rwb.getSheet("Sheet1");

 

            //通用的获取cell值的方式,getCell(int column, int row) 行和列

            int Rows=st.getRows();

            int Cols=st.getColumns();

            System.out.println("当前工作表的名字:"+st.getName());

            System.out.println("总行数:"+Rows);

            System.out.println("总列数:"+Cols);

 

            Cell c;

            for(int i=0;i<Cols;++i)

            {

                for(int j=0;j<Rows;++j)

                {

                    //getCell(Col,Row)获得单元格的值

                    System.out.print((st.getCell(i,j)).getContents()+"/t");

                }

                System.out.print("/n");

            }

            //操作完成时,关闭对象,释放占用的内存空间

            rwb.close();

        }

        catch(Exception e)

        {

            e.printStackTrace();

        }

    }

原创粉丝点击