java操作Excel

項目中使用了Struts,現在想要導出一組數據爲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. </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);

 

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

我寫的練習代碼如下:(注意裏面的圖片替換成自己的就可以了)

 

  1. import java.io.*; 
  2. import java.util.Random; 
  3. import java.util.Date; 
  4. import jxl.*; 
  5. import jxl.format.UnderlineStyle; 
  6. import jxl.write.*; 
  7. import jxl.write.Number; 
  8. import jxl.write.Boolean; 
  9. public class CreateXL 
  10.     public CreateXL() 
  11.     { 
  12.   
  13.     } 
  14.     public static void main(String[] args) 
  15.     { 
  16.         //讀Excel 
  17.         //CreateXL.readExcel("d:/abc.xls"); 
  18.   
  19.         //創建新的Excel 
  20.         CreateXL.writeExcel("d:/new.xls"); 
  21.   
  22.         //更新Excel 
  23.         CreateXL.updateExcel("d:/new.xls"); 
  24.   
  25.     } 
  26.     //jxl暫時不提供修改已經存在的數據表,這裏通過一個小辦法來達到這個目的,不適合大型數據更新! 
  27.     //這裏是通過覆蓋原文件來更新的. 
  28.     public static void updateExcel(String filePath) 
  29.     { 
  30.         try 
  31.         { 
  32.             Workbook rwb = Workbook.getWorkbook(new File(filePath)); 
  33.             WritableWorkbook wwb = Workbook.createWorkbook(new File("d:/new.xls"),rwb);//copy 
  34.             WritableSheet ws = wwb.getSheet(0); 
  35.             WritableCell wc = ws.getWritableCell(0,0); 
  36.             //判斷單元格的類型,做出相應的轉換 
  37.             Label label = (Label)wc; 
  38.             label.setString("The value has been modified"); 
  39.             wwb.write(); 
  40.             wwb.close(); 
  41.             rwb.close(); 
  42.         } 
  43.         catch(Exception e) 
  44.         { 
  45.             e.printStackTrace(); 
  46.         } 
  47.     } 
  48.   
  49.     public static void writeExcel(String filePath) 
  50.     { 
  51.         try 
  52.         { 
  53.             //創建工作薄 
  54.             WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath)); 
  55.   
  56.             //創建工作表 
  57.             WritableSheet ws = wwb.createSheet("Sheet1",0); 
  58.             //System.out.println("create ok!"); 
  59.   
  60.             //添加標籤文本 
  61.             Random rnd=new Random((new Date()).getTime()); 
  62.             int forNumber=rnd.nextInt(100); 
  63.             for(int i=0;i<forNumber;i++) 
  64.             { 
  65.                 ws.addCell(new Number(rnd.nextInt(50),rnd.nextInt(50),rnd.nextInt(1000))); 
  66.             } 
  67.   
  68.             //添加圖片(注意此處jxl暫時只支持png格式的圖片) 
  69.       //0,1分別代表x,y    2,5代表寬和高佔的單元格數 
  70.       ws.addImage(new WritableImage(0,1,2,5,new File("png//cs.png"))); 
  71.   
  72.             wwb.write(); 
  73.       wwb.close(); 
  74.         } 
  75.         catch(Exception e) 
  76.         { 
  77.             System.out.println(e.toString()); 
  78.         } 
  79.     } 
  80.     public static void readExcel(String filePath) 
  81.     { 
  82.         /** 
  83.          *後續考慮問題,比如Excel裏面的圖片以及其他數據類型的讀取 
  84.          **/ 
  85.         try 
  86.         { 
  87.             InputStream is=new FileInputStream(filePath); 
  88.             //聲名一個工作薄 
  89.             Workbook rwb = Workbook.getWorkbook(is); 
  90.   
  91.             //獲得工作薄的個數 
  92.             //rwb.getNumberOfSheets(); 
  93.   
  94.             //在Excel文檔中,第一張工作表的缺省索引是0 
  95.             Sheet st = rwb.getSheet("Sheet1"); 
  96.   
  97.             //通用的獲取cell值的方式,getCell(int column, int row) 行和列 
  98.             int Rows=st.getRows(); 
  99.             int Cols=st.getColumns(); 
  100.             System.out.println("當前工作表的名字:"+st.getName()); 
  101.             System.out.println("總行數:"+Rows); 
  102.             System.out.println("總列數:"+Cols); 
  103.   
  104.             Cell c; 
  105.             for(int i=0;i<Cols;++i) 
  106.             { 
  107.                 for(int j=0;j<Rows;++j) 
  108.                 { 
  109.                     //getCell(Col,Row)獲得單元格的值 
  110.                     System.out.print((st.getCell(i,j)).getContents()+"/t"); 
  111.                 } 
  112.                 System.out.print("/n"); 
  113.             } 
  114.             //操作完成時,關閉對象,釋放佔用的內存空間 
  115.             rwb.close(); 
  116.         } 
  117.         catch(Exception e) 
  118.         { 
  119.             e.printStackTrace(); 
  120.         } 
  121.     } 
  122. }  

 

本文出自 “On My Way” 博客,請務必保留此出處http://shuyangyang.blog.51cto.com/1685768/1028421

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章