天天看點

java操作Excel(從我的CSDN搬過來的)

項目中使用了Struts,現在想要導出一組資料為Excel檔案,那麼可以這樣:(首先需要jxl.jar包,我的是jxl-2.6.jar)

/** 

     * 導出報修單 

     * @param mapping 

     * @param form 

     * @param request 

     * @param response 

     * @return 

     * @throws IOException  

     * @throws WriteException  

     */ 

    public ActionForward print(ActionMapping mapping, ActionForm form, 

            HttpServletRequest request, HttpServletResponse response) throws IOException, WriteException { 

        response.reset();//設定頁面不緩存 

        response.setContentType("application/vnd.ms-excel");//設定檔案流導出格式 

        List expendInfoList=dao.findByProperty("states", 1);//此為查詢出資料傳回為List 

        ExpendablesfixToExcel ef=new ExpendablesfixToExcel(response.getOutputStream());//此為定義的導出EXCEL類,将輸出流傳入到構造函數中 

        ef.ebfToExcel(expendInfoList);//調用導出類裡的導出方法 

        return null; 

    } 

 以下為導出方法:

import java.io.IOException; 

import java.io.OutputStream; 

import java.util.List; 

import jxl.Workbook; 

import jxl.write.Label; 

import jxl.write.WritableCellFormat; 

import jxl.write.WritableFont; 

import jxl.write.WritableSheet; 

import jxl.write.WritableWorkbook; 

import jxl.write.WriteException; 

import com.ghtn.techschool.entitys.Expendablesfix; 

public class ExpendablesfixToExcel { 

    OutputStream os;//輸出流 

    WritableWorkbook wb;//建立Excel檔案 

    WritableSheet ws;//sheet名稱 

    /** 

     * 構造函數 

     * @param os 

     * @throws IOException 

    public ExpendablesfixToExcel(OutputStream os)throws IOException{ 

        this.os=os; 

     * 導出Excel方法 

     * @param list 

     * @throws WriteException 

    public void ebfToExcel(List<expendablesfix> list) throws WriteException{ 

        //設定樣式(這個方法算是一個容器,可以放進去好多屬性; 

        //第一個: TIMES是字型大小,這裡寫的是12;第二個: BOLD是判斷是否為斜體,選擇true時為斜體; 

        //第三個: ARIAL;第四個: UnderlineStyle.NO_UNDERLINE 下劃線; 

        //第五個: jxl.format.Colour.RED 字型顔色是紅色的) 

        WritableFont font2 = new WritableFont(WritableFont.TIMES, 12, 

                WritableFont.BOLD); 

        WritableCellFormat format2 = new WritableCellFormat(font2); 

        format2.setAlignment(jxl.format.Alignment.CENTRE);//設定居中 

        try{ 

            wb=Workbook.createWorkbook(os); 

            ws=wb.createSheet("報修單", 0); 

            //第一個是代表列數,  

            //第二是代表行數,  

            //第三個代表要寫入的内容  

            //第四個是可選項,是輸入這個label裡面的樣式  

            //然後通過寫sheet的方法addCell()把内容寫進sheet裡面。  

            Label labelA=new Label(0,0,"報修人",format2); 

            ws.addCell(labelA); 

            Label labelB=new Label(1,0,"所在部門",format2); 

            ws.addCell(labelB); 

            Label labelC=new Label(2,0,"報修日期",format2); 

            ws.addCell(labelC); 

            Label labelD=new Label(3,0,"消耗品名稱",format2); 

            ws.addCell(labelD); 

            Label labelF=new Label(4,0,"消耗品報修描述",format2); 

            ws.addCell(labelF); 

            writeRecruit(list);//擷取動态内容的方法 

            wb.write();//寫入 

            wb.close();//關閉 

        }catch(Exception e){ 

            e.printStackTrace(); 

        } 

    private void writeRecruit(List<expendablesfix> stuList){ 

        if(stuList.size()==0){ 

            return ; 

        for(int i=0;i<stuList.size();i++){ 

            String person="";//報修人 

            if(null!=stuList.get(i).getBxr()){ 

                person=stuList.get(i).getBxr().toString(); 

            } 

            Label labelBxr = new Label(0,i+1,person); 

            String dept="";//所在部門 

            if(null!=stuList.get(i).getBm()){ 

                dept=stuList.get(i).getBm().toString(); 

            Label labelBm=new Label(1,i+1,dept); 

            String date="";//報修日期 

            if(null!=stuList.get(i).getBdate()){ 

                date=stuList.get(i).getBdate().toString(); 

            Label labelBdate=new Label(2,i+1,date); 

            String name="";//消耗品名稱 

            if(null!=stuList.get(i).getExpendablesname()){ 

                name=stuList.get(i).getExpendablesname().toString(); 

            Label labelName=new Label(3,i+1,name); 

            String descrition="";//消耗品報修描述 

            if(null!=stuList.get(i).getBxzk()){ 

                descrition=stuList.get(i).getBxzk().toString(); 

            Label labelDescrition=new Label(4,i+1,descrition); 

            /* 

             * 統一添加到清單中 

             * */ 

            try{ 

                ws.addCell(labelBxr); 

                ws.addCell(labelBm); 

                ws.addCell(labelBdate); 

                ws.addCell(labelName); 

                ws.addCell(labelDescrition); 

            }catch(Exception e){ 

                e.printStackTrace(); 

</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.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)設定單元格樣式 

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) 

    public static void writeExcel(String filePath) 

            //建立工作薄 

            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.close(); 

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

    public static void readExcel(String filePath) 

        /** 

         *後續考慮問題,比如Excel裡面的圖檔以及其他資料類型的讀取 

         **/ 

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

            //操作完成時,關閉對象,釋放占用的記憶體空間 

}  

 本文轉自shyy8712872 51CTO部落格,原文連結:http://blog.51cto.com/shuyangyang/1028421,如需轉載請自行聯系原作者