最近的項目需要使用大量的Excel表,策劃把資料都做成Excel表,通過編輯器把Excel表的資料匯入到資料庫,編輯器提供各種編輯操作,還要提供將資料庫匯出成Excel表的功能。藉助於Java Excel API,這個問題就很簡單了。
一:史上最簡單的方法
對於簡單的表格(純文字),其實可以不藉助Java Excel API而有更簡單的方法!用定位字元/t隔開每個域,用分行符號/n隔開每一行,將檔案尾碼名改為".xls"搞定!只是這樣弄出來的Excel表無法指定格式(如顏色,邊框,對齊等等)。
二:Java Excel API
Java Excel 是一個開源項目,通過它Java開發人員可以讀取Excel檔案的內容、建立新的Excel檔案、更新已經存在的Excel檔案等,在項目中需要匯入名為jxl.jar的包。在這裡只是樣本它的基本用法,其他進階的功能(圖片、公式、格式等)請參考Java Excel的協助文檔,這裡是關於它的資料:http://jexcelapi.sourceforge.net/。
如有一個使用者資料的Excel表,包含ID、使用者名稱、性別、郵件等資訊,定義一個使用者JavaBean:
package com.monitor1394.excel;</p><p>/**<br /> *<br /> * 使用者<br /> *<br /> * @author monitor<br /> * Created on 2010-12-22, 9:57:58<br /> */<br />public class User {<br /> /** ID */<br /> private int id;<br /> /** 使用者名稱 */<br /> private String name;<br /> /** 性別 1:男 2:女*/<br /> private int sex;<br /> /** 郵件 */<br /> private String email;</p><p> public User(){<br /> }</p><p> public User(int id,String name,int sex,String email){<br /> this.id=id;<br /> this.name=name;<br /> this.sex=sex;<br /> this.email=email;<br /> }</p><p> public String getEmail() {<br /> return email;<br /> }</p><p> public void setEmail(String email) {<br /> this.email = email;<br /> }</p><p> public int getId() {<br /> return id;<br /> }</p><p> public void setId(int id) {<br /> this.id = id;<br /> }</p><p> public String getName() {<br /> return name;<br /> }</p><p> public void setName(String name) {<br /> this.name = name;<br /> }</p><p> public int getSex() {<br /> return sex;<br /> }</p><p> public void setSex(int sex) {<br /> this.sex = sex;<br /> }</p><p> @Override<br /> public String toString(){<br /> return id+":"+name;<br /> }<br />}
提供的Excel表操作類如下,某些儲存格的格式可按自己意願指定:
package com.monitor1394.excel;</p><p>import java.io.File;<br />import java.io.IOException;<br />import java.util.ArrayList;<br />import java.util.List;<br />import jxl.Sheet;<br />import jxl.Workbook;<br />import jxl.format.Alignment;<br />import jxl.format.Border;<br />import jxl.format.BorderLineStyle;<br />import jxl.format.Colour;<br />import jxl.format.VerticalAlignment;<br />import jxl.read.biff.BiffException;<br />import jxl.write.Label;<br />import jxl.write.Number;<br />import jxl.write.NumberFormats;<br />import jxl.write.WritableCellFormat;<br />import jxl.write.WritableFont;<br />import jxl.write.WritableSheet;<br />import jxl.write.WritableWorkbook;<br />import jxl.write.WriteException;</p><p>/**<br /> *<br /> * Excel表操作<br /> *<br /> * @author monitor<br /> * Created on 2010-12-22, 9:50:28<br /> */<br />public class Excel {<br /> /** 標題儲存格格式 */<br /> private static WritableCellFormat titleFormat=null;<br /> /** 主題內容儲存格格式 */<br /> private static WritableCellFormat bodyFormat=null;<br /> /** 注釋儲存格格式 */<br /> private static WritableCellFormat noteFormat=null;<br /> /** 浮點型資料的儲存格格式 */<br /> private static WritableCellFormat floatFormat=null;<br /> /** 整型資料的儲存格格式 */<br /> private static WritableCellFormat intFormat=null;<br /> /** 初始化資料 */<br /> private static boolean init=false;</p><p> /** 私人構造方法,防止錯誤使用Excel類 */<br /> private Excel(){<br /> }</p><p> /**<br /> * 初始化各儲存格格式<br /> * @throws WriteException 初始化失敗<br /> */<br /> private static void init() throws WriteException{<br /> WritableFont font1,font2,font3,font4;<br /> //Arial字型,9號,粗體,儲存格黃色,田字邊框,置中對齊<br /> font1 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false);<br /> titleFormat = new WritableCellFormat (font1);<br /> titleFormat.setBackground(Colour.YELLOW);<br /> titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN);<br /> titleFormat.setAlignment(Alignment.CENTRE);<br /> //Arial字型,9號,粗體,儲存格黃色,田字邊框,左右置中對齊,垂直置中對齊,自動換行<br /> font2 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false);<br /> noteFormat = new WritableCellFormat (font2);<br /> noteFormat.setBackground(Colour.YELLOW);<br /> noteFormat.setBorder(Border.ALL, BorderLineStyle.THIN);<br /> noteFormat.setAlignment(Alignment.CENTRE);<br /> noteFormat.setVerticalAlignment(VerticalAlignment.CENTRE);<br /> noteFormat.setWrap(true);<br /> //Arial字型,9號,非粗體,儲存格淡綠色,田字邊框<br /> font3 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);<br /> bodyFormat = new WritableCellFormat (font3);<br /> bodyFormat.setBackground(Colour.LIGHT_GREEN);<br /> bodyFormat.setBorder(Border.ALL, BorderLineStyle.THIN);<br /> //Arial字型,9號,非粗體,儲存格淡綠色,田字邊框<br /> font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);<br /> floatFormat = new WritableCellFormat (font4,NumberFormats.FLOAT);<br /> floatFormat.setBackground(Colour.LIGHT_GREEN);<br /> floatFormat.setBorder(Border.ALL, BorderLineStyle.THIN);<br /> //Arial字型,9號,非粗體,儲存格淡綠色,田字邊框<br /> font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);<br /> intFormat = new WritableCellFormat (font4,NumberFormats.INTEGER);<br /> intFormat.setBackground(Colour.LIGHT_GREEN);<br /> intFormat.setBorder(Border.ALL, BorderLineStyle.THIN);</p><p> init=true;<br /> }</p><p> public static void createUserExcelFile(List<User> userList,File destFile) throws WriteException, IOException{<br /> if(init==false) init();<br /> int index,row;<br /> WritableSheet sheet=null;<br /> WritableWorkbook book=null;<br /> book = Workbook.createWorkbook(destFile);<br /> sheet = book.createSheet("使用者表", 0);<br /> sheet.setColumnView(0, 15);<br /> sheet.setColumnView(1, 15);<br /> sheet.setColumnView(2, 15);<br /> sheet.setColumnView(3, 40);<br /> //欄位變數名<br /> index=0;<br /> sheet.addCell(new Label(index++,0,"id",titleFormat));<br /> sheet.addCell(new Label(index++,0,"name",titleFormat));<br /> sheet.addCell(new Label(index++,0,"sex",titleFormat));<br /> sheet.addCell(new Label(index++,0,"email",titleFormat));<br /> //欄位名<br /> index=0;<br /> sheet.addCell(new Label(index++,1,"ID",titleFormat));<br /> sheet.addCell(new Label(index++,1,"使用者名稱",titleFormat));<br /> sheet.addCell(new Label(index++,1,"性別",titleFormat));<br /> sheet.addCell(new Label(index++,1,"郵件",titleFormat));<br /> //欄位注釋<br /> index=0;<br /> sheet.addCell(new Label(index++,2,null,noteFormat));<br /> sheet.addCell(new Label(index++,2,null,noteFormat));<br /> sheet.addCell(new Label(index++,2,"1:男/n2:女",noteFormat));<br /> sheet.addCell(new Label(index++,2,null,noteFormat));<br /> row=3;<br /> for(User user:userList){<br /> if(user==null) continue;<br /> index=0;<br /> sheet.addCell(new Number(index++,row,user.getId(),bodyFormat));<br /> sheet.addCell(new Label(index++,row,user.getName(),bodyFormat));<br /> sheet.addCell(new Number(index++,row,user.getSex(),bodyFormat));<br /> sheet.addCell(new Label(index++,row,user.getEmail(),bodyFormat));<br /> row++;<br /> }<br /> book.write();<br /> if(book!=null) book.close();<br /> }</p><p> public static List<User> readUserExcelFile(File file) throws IOException, BiffException{<br /> if(file==null) return null;<br /> int row,column;<br /> String temp=null;<br /> Workbook book =null;<br /> Sheet sheet=null;<br /> List<User> userList=new ArrayList<User>();<br /> book = Workbook.getWorkbook(file);<br /> sheet = book.getSheet(0);<br /> row=3;<br /> while(row<sheet.getRows()){<br /> column=0;<br /> User user=new User();<br /> //id<br /> temp=sheet.getCell(column++,row).getContents().trim();<br /> if(temp!=null && !temp.equals("") && temp.matches("//d+")) user.setId(Integer.parseInt(temp));<br /> else break;<br /> //名稱<br /> temp=sheet.getCell(column++,row).getContents().trim();<br /> if(temp!=null && !temp.equals("")) user.setName(temp);<br /> //性別<br /> temp=sheet.getCell(column++,row).getContents().trim();<br /> if(temp!=null && !temp.equals("") && temp.matches("//d+")) user.setSex(Integer.parseInt(temp));<br /> //郵件<br /> temp=sheet.getCell(column++,row).getContents().trim();<br /> if(temp!=null && !temp.equals("")) user.setEmail(temp);</p><p> userList.add(user);<br /> row++;<br /> }<br /> if(book!=null) book.close();<br /> return userList;<br /> }<br />}
要匯入的Excel表格式如下:
匯出後的Excel表如下: