天天看點

使用JXL生成Excel執行個體詳解

最近研究導資料接觸到了JXL,就順帶着琢磨了下。在這裡記錄一下,以後就不用導出找資料了。

代碼:

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.PageOrientation;
import jxl.format.PaperSize;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class JXLClass {
	public static String savePath = "D:"+java.io.File.separator+"saveDir";//文檔所在目錄
	
	/**
	 * 練習使用JXL生成Excel檔案
	 */
	public static void main(String[] args) {
		 String fileName = System.currentTimeMillis()+".xls";//以目前時間作為Excel的名稱:2003版本的
		 String filePath = savePath+ java.io.File.separator + fileName;
		System.out.println("檔案路徑:"+filePath);
		File excelFile = new File(filePath);//檔案所在具體路徑
		
		createExcel(excelFile);

	}
	
	public static void createExcel(File file){
		System.out.println("生成Excel檔案開始了!");
		try {
			String[] title={"序号","姓名","年齡","工資","出生日期","婚否","頭像"};//标題數組
			
			//1、建立可以寫入的Excel工作簿
			WritableWorkbook workBook = Workbook.createWorkbook(file);
			
			//2、建立工作表
			//createSheet(param1,param2):param1為目前工作表名稱,param2表示是第幾張表,從0開始
			WritableSheet sheet = workBook.createSheet("工作表1", 0);//0表示第一張表
			WritableSheet sheet2 = workBook.createSheet("工作表2", 1);
			WritableSheet sheet3 = workBook.createSheet("工作表3", 2);
			
			//3、設定列印屬性
            sheet.getSettings().setOrientation(PageOrientation.LANDSCAPE) ;// 設定為橫向列印
            sheet.getSettings().setPaperSize(PaperSize.A4);//設定紙張A4
            sheet.getSettings().setFitHeight(297);//列印區高度
            sheet.getSettings().setFitWidth(210) ;//列印區寬度
            // 設定邊距            
            sheet.getSettings().setTopMargin(0.5) ;
            sheet.getSettings().setBottomMargin(0.3) ;
            sheet.getSettings().setLeftMargin(0.1) ;
            sheet.getSettings().setRightMargin(0.1) ;
            //設定頁腳
            sheet.getSettings().getFooter().getCentre().appendPageNumber() ;// 為頁腳添加頁數
            sheet.getSettings().setFooterMargin(0.07) ;// 設定頁腳邊距(下)
           
            //4、設定保護,并加密碼 鎖定的Cell才會起作用
            //啟用保護并設定密碼找回,生成的Excel為隻讀,在”審閱-更改-撤銷工作表保護“子產品可取消,取消時要求輸入下面設定的密碼
            sheet.getSettings().setProtected(true) ;//啟用保護
            sheet.getSettings().setPassword("123456") ;//設定保護密碼
            // 設定列印标題行
            sheet.getSettings().setPrintHeaders(true) ;// 啟用列印頭資訊
            
            //5、合并單元格
			//mergeCells(int x,int y,int m,int n):合并單元格,表示将
			//從第x+1列,y+1行到m+1列,n+1行合并 (四個點定義了兩個坐标,左上角和右下角)
			//結果是合并了m-x+1行,n-y+1列,兩者乘積就是合并的單元格數量。
			sheet.mergeCells(0,0,title.length-1,0);//工作表1的第一行合并,顯示标題
			//setRowView(int i,int height); 指定第i行的高度(這個高度好像得是Excel中的20倍,也就是這裡設定成200,Excel中高度差不多為10)
			//有三個參數時,第三個參數表示目前行是否隐藏(當第三個參數為true,高度即便再高也顯示不出來。且預設為true)。若是隻寫兩個參數,目前會被隐藏
			sheet.setRowView(0,500,false);//第一行為合并性的标題行,第二行開始顯示title中的内容,第三行為文本内容

			//6、設定标題的樣式
			//WritableFont()參數依次為:字型(宋體、楷體等),大小,字形(正常、加粗等),
			//是否傾斜(true表示傾斜,false表示不傾斜),下劃線樣式(這裡設定的雙下劃線),字型顔色(這裡為紅色)
			WritableFont titleFont = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD,
								true,UnderlineStyle.DOUBLE,Colour.RED);//字型樣式定義
			WritableCellFormat cellFormatForTitle = new WritableCellFormat(titleFont);//單元格樣式定義
			cellFormatForTitle.setAlignment(jxl.format.Alignment.CENTRE); //設定水準方向對齊方式
			cellFormatForTitle.setVerticalAlignment(VerticalAlignment.CENTRE);//設定垂直方向對齊方式
			cellFormatForTitle.setWrap(true);//是否自動換行
			cellFormatForTitle.setBorder(Border.ALL, BorderLineStyle.THIN);//設定邊框樣式
			cellFormatForTitle.setBackground(Colour.LIGHT_GREEN);//設定背景色
			//cellFormat.setIndentation(2);//設定縮進字元個數
			 
			//7、為第一行合并的單元格設定标題
			Label lab = new Label(0,0,"JXL練習",cellFormatForTitle);
			//Label(int x,int y,String content,WritableCellFormat wcf):指明單元格的位置和内容,四個參數依次為;第幾列、第幾行、内容、樣式
			sheet.addCell(lab);//将單元格添加到sheet中
			
			//8、将title寫到Excel中
			for(int i=0;i<title.length;i++){
				//setColumnView(int i,int width):指定第i列的寬度
				sheet.setColumnView(i, 20);//設定單元格的寬度:這個寬度與Excel裡面的寬度差不多
				Label label = new Label(i,1,title[i],cellFormatForTitle);//在第二行中添加文本類單元格
				sheet.addCell(label);//将标題添加到sheet中
			}
			sheet.setRowView(1,500,false);//标題行行高25
			
			//9、設定正文的樣式
			//Arial是一套随同多套微軟應用軟體所分發的無襯線體TrueType字型
			WritableFont bodyFont = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,
					false,UnderlineStyle.NO_UNDERLINE,Colour.BLACK);//字型樣式定義:ARIAL,12号,不加粗,不傾斜,沒有下劃線,黑色
			WritableCellFormat cellFormatForBody = new WritableCellFormat(bodyFont);//單元格樣式定義
			cellFormatForBody.setAlignment(jxl.format.Alignment.CENTRE); //設定水準方向對齊方式
			cellFormatForBody.setVerticalAlignment(VerticalAlignment.CENTRE);//設定垂直方向對齊方式
			cellFormatForBody.setWrap(true);//是否自動換行
			cellFormatForBody.setBorder(Border.ALL, BorderLineStyle.THIN);//設定邊框樣式
			cellFormatForBody.setBackground(Colour.LIGHT_GREEN);//設定背景色
			
			//10、給正文添加内容
			//第一列,序号,數字類型,Number():參數依次為:第幾列,第幾行,顯示内容,樣式
			Number number = new Number(0,2,1,cellFormatForBody);
			sheet.addCell(number);
			
			//第二列,姓名,基本文字類型
			Label name = new Label(1,2,"張三",cellFormatForBody);
			sheet.addCell(name);
			
			//第三列,年齡,數字類型
			Number age = new Number(2,2,10,cellFormatForBody);
			sheet.addCell(age);
			
			//第四列,工資,帶有格式的數字類型
			NumberFormat nf = new NumberFormat("#.##");//格式
			WritableCellFormat wcfN = new WritableCellFormat(nf);
			//設定樣式
			wcfN.setAlignment(Alignment.CENTRE); //設定水準方向對齊方式
			wcfN.setVerticalAlignment(VerticalAlignment.CENTRE);//設定垂直方向對齊方式
			wcfN.setWrap(true);//是否自動換行
			wcfN.setBorder(Border.ALL, BorderLineStyle.THIN);//設定邊框樣式
			wcfN.setBackground(Colour.LIGHT_GREEN);//設定背景色
			Number salary = new Number(3,2,3000.1415926,wcfN);
			sheet.addCell(salary);
				
			//第五列,出生日期,時間類型
			DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");//定義時間格式
			WritableCellFormat wcfDF = new WritableCellFormat(df);
			//設定樣式
			wcfDF.setAlignment(Alignment.CENTRE); //設定水準方向對齊方式
			wcfDF.setVerticalAlignment(VerticalAlignment.CENTRE);//設定垂直方向對齊方式
			wcfDF.setWrap(true);//是否自動換行
			wcfDF.setBorder(Border.ALL, BorderLineStyle.THIN);//設定邊框樣式
			wcfDF.setBackground(Colour.LIGHT_GREEN);//設定背景色
			DateTime birthday = new DateTime(4,2,new Date(),wcfDF);
			//添加值
			sheet.addCell(birthday);
			
			//第六列,婚否,boolean類型
			//Boolean marry = new Boolean(5, 2, false, cellFormatForBody);
			//sheet.addCell(marry);
			//下拉選的格式,隻能從給定的資料中選擇
			Label lblColumn  = new Label(5, 2, "請選擇",cellFormatForBody);//生成一個待選擇的标簽
            WritableCellFeatures wcf2 = new WritableCellFeatures();//待選擇集合對象,這是jxl的對象
            List angerlist = new ArrayList();
            angerlist.add("已婚");
            angerlist.add("未婚");
            wcf2.setDataValidationList(angerlist);//設定jxl對象要選擇的集合
            lblColumn.setCellFeatures(wcf2);//設定到單元格裡面去
            sheet.addCell(lblColumn);//加入sheet表格中
				
			//第七列,頭像,圖檔類型:隻支援png檔案
			//WritableImage():參數依次為:第幾列,第幾行,圖檔需要占據幾列,圖檔需要占據幾行,圖形檔案
			System.out.print("圖檔路徑:"+(savePath+ java.io.File.separator+"1.png"));
			WritableImage photo=new WritableImage(6,2,1,1,new File(savePath+ java.io.File.separator+"1.png"));
			sheet.addImage(photo);
			
			sheet.setRowView(2,400,false);//正文行高20
			
			//11、在Excel中寫入資料并關閉檔案
			workBook.write();
			workBook.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
           

 說明:

1、啟用了密碼保護功能,是以生成的Excel不能編輯,Excel2007可以在”審閱-更改-撤銷工作表保護“子產品取消保護,取消時要求輸入下面設定的密碼123456

sheet.getSettings().setProtected(true) ;//啟用保護
sheet.getSettings().setPassword("123456") ;//設定保護密碼
           

參考:http://www.blogjava.net/xing5156/archive/2011/11/18/364221.html   2、設定行高的問題: 可以使用setRowView(int i,int height)方法來設定行高。

sheet.setRowView(0,500,false);
           

 這個方法可以有兩個參數,也可以有三個。 第一個參數是要設定行高的行, 第二個參數是設定行高的高度。這個高度大概得設定成Excel裡面行高的20倍才能達到相應的效果。 第三個參數是boolean類型,是否隐藏,預設為隐藏。要是不調用setRowView方法那麼目前行不會隐藏,要是調用了且隻寫了兩個參數,那麼會被隐藏。寫了三個參數時,true為隐藏,false為不隐藏。設定列寬的setColumnView方法跟這個相同。   3、圖像類型的資料:

WritableImage photo=new WritableImage(6,2,1,1,new File(savePath+ java.io.File.separator+"1.png"));
           

 這四個參數分别表示:第幾列,第幾行,圖檔需要占據幾列,圖檔需要占據幾行,圖形檔案。需要注意的是第三和第四兩個參數,它們并不是圖檔的像數數值,而是占據幾個單元格的意思。 參考:http://blog.csdn.net/hantiannan/article/details/6868865   4、标題帶有下拉框的形式:

Label lblColumn  = new Label(5, 2, "請選擇",cellFormatForBody);//生成一個待選擇的标簽
WritableCellFeatures wcf2 = new WritableCellFeatures();//待選擇集合對象
List angerlist = new ArrayList();
angerlist.add("已婚");
angerlist.add("未婚");
wcf2.setDataValidationList(angerlist);//設定jxl對象要選擇的集合
lblColumn.setCellFeatures(wcf2);//設定到單元格裡面去
sheet.addCell(lblColumn);//加入sheet表格中
           

下拉框參考:http://747017186.iteye.com/blog/2151995

繼續閱讀