java JXL操作Excel文件

-------------jxl和POI的區別(來自網絡,感謝)-----
jxl優點:
①Jxl對中文支持非常好,操作簡單,方法看名知意。
②Jxl是純javaAPI,在跨平臺上表現的非常完美
③生成Excel 2000標準格式
④支持字體、數字、日期操作
⑤能夠修飾單元格屬性
④支持圖像和圖表,但是這套API對圖形和圖表的支持很有限,而且僅僅識別PNG格式。
缺點:效率低,圖片支持不完善,對格式的支持不如POI強大
POI優點:
①效率高,效率測試,可參考:http://blog.csdn.net/jarvis_java/article/details/4924099
②支持公式,宏,一些企業應用上會非常實用
③能夠修飾單元格屬性
④支持字體、數字、日期操作
缺點:不成熟,bug較多

用於項目,主要是讀取少量數據的導入和導出,需要穩定性,則選擇jxl

pom.xml

		<!-- execel -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.13</version>
		</dependency>
		<dependency>
			<groupId>net.sourceforge.jexcelapi</groupId>
			<artifactId>jxl</artifactId>
			<version>2.6.12</version>
		</dependency>

操作代碼如下:

package my.demo.java.z.file;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;

import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Boolean;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Binary Interchange File Format:Biff 二進制文件交換格式
 * @desc 導入讀取和導出寫入
 * 
 * */
public class RWExcelFile_jxl {
	
	//log
	private static final Logger LOG = LoggerFactory.getLogger(ExcelFile_jxl.class);
	
	/**
	 * 讀取excel工作簿信息.<br>
	 * @param book Excel工作簿
	 * */
	public void readExcel(Workbook book){
		try {
			//獲取excel下的sheet頁總個數
			int maxSheet = book.getNumberOfSheets();
			LOG.info("Excel工作簿的sheet頁總數:" + maxSheet + "頁.");
			//獲取各個excel,可以控制需要導入那個頁
			for(int sheeti = 0; sheeti < maxSheet; sheeti++){
				LOG.info("第" + (sheeti + 1) + "頁讀取開始……");
				//獲取sheet頁
				Sheet sheet = book.getSheet(sheeti);
				//通過名稱獲取sheet頁
//				Sheet sheet = book.getSheet("sheet3");
				//獲取sheet的名稱
				String sheetName = sheet.getName();
				LOG.info("第" + (sheeti + 1) + "頁名稱:" + sheetName + ".");
				//當前sheet實際行總數
				int realRows = sheet.getRows();
				LOG.info("第" + (sheeti + 1) + "頁實際行總數:" + realRows + "行.");
				//當前sheet實際列總數
				int realColumns = sheet.getColumns();
				LOG.info("第" + (sheeti + 1) + "頁實際列總數:" + realColumns + "列.");
				//遍歷每行每列的單元格 --類似二位數組定位excel單元格讀取
				//行
				for(int row = 0; row < realRows; row++){
					//列
					for(int column = 0; column < realColumns; column++){
						//定位的單元格
						Cell cell = sheet.getCell(column, row);
						//獲取單元格類型
						CellType type = cell.getType();
						//獲取單元格內容 -- 注:數據驗證格式/純數字需對科學計數法轉換
						String content = cell.getContents();
						LOG.info("單元格[第" + (sheeti + 1) + "頁-第" + (row + 1) + "行-第" + (column + 1) + "列(類型:" + type + ")]:" + content);
					}
				}
				//釋放資源
				sheet = null;
			}
		} catch (IndexOutOfBoundsException e) {
			LOG.info("讀取excel工作簿信息數組下標越界:" + e.getMessage(), e);
		}finally{
			//釋放資源
			book.close();
		}
	}
	
	/**
	 * 寫入數據導出excel工作簿 -- 數據格式化
	 * */
	public void writeExcel(){
		WritableWorkbook book = null;
			try {
				//不加路徑,導出在項目根目錄
				String excelName = "writeExcel.xls";
				File excel = new File(excelName);
				book = Workbook.createWorkbook(excel);
				//參數一:名稱,寫入名爲"batchexport"sheet頁,參數二:0表示這是第一頁
				WritableSheet sheet = book.createSheet("batchexport", 0);
				//行高和列寬
				//將第一行的高度設爲320
				sheet.setRowView(0 , 320);
				//將第4列的寬度設爲30
				sheet.setColumnView(3 , 300);
				sheet.setColumnView(1 , 30);
				//構造Label對象,並指定單元格位置是第一列第一行(0,0)--(列,行)
				Label str1 = new Label(0, 0, "卡卡");
				//將定義好的str1添加到工作表中
				sheet.addCell(str1);
				Number num1 = new Number(1, 0, 17400005555.889d);
				sheet.addCell(num1);
				Boolean bool1 = new Boolean(2, 0, true);
				sheet.addCell(bool1);
				String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis());
				//---字串格式化
				//WritableFont不同情況下有非常豐富的構造方法,jExcelAPI的java-doc中有詳細介紹,也可搜索.
				//字串格式:字體爲TIMES,字號16,加粗顯示  --WritableFont.createFont("宋體")
				WritableFont font1 =  new WritableFont(WritableFont.TIMES, 16, WritableFont.BOLD);
				//WritableCellFormat類,通過它可以指定單元格的各種屬性,單元格格式化
				WritableCellFormat format1 = new WritableCellFormat(font1);
				//定數據的對齊方式
				//水平對齊方式指定爲居中
				format1.setAlignment(Alignment.CENTRE);
				format1.setVerticalAlignment(VerticalAlignment.CENTRE);
				//垂直對齊方式指定爲居中
				//字串被賦予format1格式
				Label date = new Label(3, 0, "時間:" +time,format1);
				sheet.addCell(date);
				//合併第一列,第二行到第六列,第一行的所有單元格
				sheet.mergeCells(0 , 1, 5, 1);
				//寫入數據到工作簿
				book.write();
				LOG.info(excelName + "寫入文件導出成功.");
			} catch (RowsExceededException e) {
				LOG.info("寫入Excel工作簿內容行超過異常:" + e.getMessage(), e);
			} catch (WriteException e) {
				LOG.info("寫入Excel工作簿內容寫入異常:" + e.getMessage(), e);
			} catch (IOException e) {
				LOG.info("寫入Excel工作簿內容輸入輸出流異常:" + e.getMessage(), e);
			}finally{
				try {
					//關閉文件
					book.close();
				} catch (WriteException e) {
					LOG.info("寫入Excel工作簿內容寫入異常:" + e.getMessage(), e);
				} catch (IOException e) {
					LOG.info("寫入Excel工作簿內容輸入輸出流異常:" + e.getMessage(), e);
				}
			}
	}
	
	/**
	 * 修改數據導出excel工作簿
	 * */
	public void editExcel(){
		String excelName = "writeExcel.xls";
		Workbook orgBook = null;
		WritableWorkbook reBook = null;
		try {
			File orgExcel = new File(excelName);
			File reExcel = new File(excelName);
			//獲得excel文件
			orgBook = Workbook.getWorkbook(orgExcel);
			//打開一個excel文件的副本,並且指定數據寫回到原文件
			reBook = Workbook.createWorkbook(reExcel, orgBook);
			//添加一個工作頁
			WritableSheet sheet = reBook.createSheet("editSheet", 1);
			sheet.addCell(new Label(0, 0, "編輯excel文件測試數據"));
			reBook.write();
			LOG.info(excelName + "編輯文件導出成功.");
		} catch (RowsExceededException e) {
			LOG.info("編輯Excel工作簿內容異常:" + e.getMessage(), e);
		} catch (BiffException e) {
			LOG.info("編輯Excel工作簿內容異常:" + e.getMessage(), e);
		} catch (WriteException e) {
			LOG.info("編輯Excel工作簿內容異常:" + e.getMessage(), e);
		} catch (IOException e) {
			LOG.info("編輯Excel工作簿內容異常:" + e.getMessage(), e);
		}finally{
			try {
				reBook.close();
				orgBook.close();
			} catch (WriteException e) {
				LOG.info("編輯Excel工作簿內容寫入異常:" + e.getMessage(), e);
			} catch (IOException e) {
				LOG.info("編輯Excel工作簿內容輸入輸出流異常:" + e.getMessage(), e);
			}
		}
	}
	
	/**
	 * 文件形式.<br>
	 * 操作Excel工作簿.<br>
	 * @param file Excel文件
	 * */
	public void readExcelOfFile(File file){
		Workbook book = null;
		try {
			book = Workbook.getWorkbook(file);
			readExcel(book);
		} catch (BiffException e) {
			LOG.info("讀取Excel工作簿文件二進制文件交換格式異常:" + e.getMessage(), e);
		} catch (IOException e) {
			LOG.info("讀取Excel工作簿文件輸入輸出流異常:" + e.getMessage(), e);
		}
	}
	
	/**
	 * 輸入流形式.<br>
	 * 操作Excel工作簿.<br>
	 * @param is Excel輸入流,比如上傳
	 * @throws IOException 
	 * */
	public void readExcelOfInputStream(InputStream is) throws IOException{
		Workbook book = null;
		try {
			book = Workbook.getWorkbook(is);
			readExcel(book);
		} catch (BiffException e) {
			LOG.info("讀取Excel工作簿文件二進制文件交換格式異常:" + e.getMessage(), e);
		} catch (IOException e) {
			LOG.info("讀取Excel工作簿文件輸入輸出流異常:" + e.getMessage(), e);
		}finally{
			is.close();
		}
	}
	
	//測試
	public static void main(String[] args) {
		RWExcelFile_jxl jxlrw1 = new RWExcelFile_jxl();
		//讀取
		//單元格格式--此處都爲"文本"
		String excelPath = "D:/RWExcelFile_jxl.xls";
		File excel = new File(excelPath);
		jxlrw1.readExcelOfFile(excel);
		//導出
		jxlrw1.writeExcel();
		//編輯
		jxlrw1.editExcel();
	}
}
測試結果:
第一次導出:


底部:


編輯:


底部:


讀取:


底部:


讀取結果:

15:58:47.810 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - Excel工作簿的sheet頁總數:5頁.
15:58:47.813 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第1頁讀取開始……
15:58:47.870 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第1頁名稱:批量註冊.
15:58:47.870 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第1頁實際行總數:10行.
15:58:47.871 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第1頁實際列總數:5列.
15:58:47.871 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第1行-第1列(類型:Label)]:姓名
15:58:47.871 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第1行-第2列(類型:Label)]:手機號
15:58:47.872 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第1行-第3列(類型:Label)]:執證號
15:58:47.872 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第1行-第4列(類型:Empty)]:
15:58:47.872 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第1行-第5列(類型:Empty)]:
15:58:47.872 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第2行-第1列(類型:Label)]:本兮
15:58:47.872 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第2行-第2列(類型:Number)]:15500005550
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第2行-第3列(類型:Number)]:44556600000
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第2行-第4列(類型:Empty)]:
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第2行-第5列(類型:Empty)]:
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第3行-第1列(類型:Label)]:童可可
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第3行-第2列(類型:Number)]:15500005551
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第3行-第3列(類型:Number)]:44556600001
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第3行-第4列(類型:Empty)]:
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第3行-第5列(類型:Empty)]:
15:58:47.873 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第4行-第1列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第4行-第2列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第4行-第3列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第4行-第4列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第4行-第5列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第5行-第1列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第5行-第2列(類型:Label)]:true
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第5行-第3列(類型:Label)]:2015-12-31 09:50:55
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第5行-第4列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第5行-第5列(類型:Empty)]:
15:58:47.874 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第6行-第1列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第6行-第2列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第6行-第3列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第6行-第4列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第6行-第5列(類型:Label)]:測試總列數
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第7行-第1列(類型:Label)]:@#$%^&*B11
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第7行-第2列(類型:Label)]:AAAAaaaa
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第7行-第3列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第7行-第4列(類型:Empty)]:
15:58:47.875 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第7行-第5列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第8行-第1列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第8行-第2列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第8行-第3列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第8行-第4列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第8行-第5列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第9行-第1列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第9行-第2列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第9行-第3列(類型:Empty)]:
15:58:47.876 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第9行-第4列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第9行-第5列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第10行-第1列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第10行-第2列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第10行-第3列(類型:Label)]:測試總行數
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第10行-第4列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 單元格[第1頁-第10行-第5列(類型:Empty)]:
15:58:47.877 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第2頁讀取開始……
15:58:47.935 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第2頁名稱:Sheet1.
15:58:47.935 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第2頁實際行總數:0行.
15:58:47.935 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第2頁實際列總數:0列.
15:58:47.935 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第3頁讀取開始……
15:58:47.980 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第3頁名稱:Sheet2.
15:58:47.980 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第3頁實際行總數:0行.
15:58:47.980 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第3頁實際列總數:0列.
15:58:47.980 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第4頁讀取開始……
15:58:48.017 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第4頁名稱:Sheet3.
15:58:48.017 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第4頁實際行總數:0行.
15:58:48.017 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第4頁實際列總數:0列.
15:58:48.017 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第5頁讀取開始……
15:58:48.057 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第5頁名稱:Sheet4.
15:58:48.057 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第5頁實際行總數:0行.
15:58:48.057 [main] INFO  my.demo.java.z.file.ExcelFile_jxl - 第5頁實際列總數:0列.


發佈了155 篇原創文章 · 獲贊 872 · 訪問量 136萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章