最近研究導資料接觸到了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