JAVA中操作Excel的有兩種比較主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls為後綴的excel。而poi可以操作Excel 95及以後的版本,即可操作後綴為 .xls(03版)和.xlsx(07版)兩種格式的excel。所以, 如果你的項目中需要導入導出Excel, 那麼就可能需要POI. 講解之前了解一下Excel的幾個概念, 這也是POI操作的基礎. 一個excel文件就是一個工作簿workbook,一個工作簿中可以創建多張工作表sheet,而一個工作表中包含多個單元格Cell,這些單元格都是由列(Column)行(Row)組成.
poi-ooxml-3.10.1-20140818.jar,poi-ooxml-schemas-3.10.1-20140818.jar,以及ooxml-lib目錄下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。
我的准則是動手操作. 看過的聽過的永遠都是"我好像會了", 只有真正自己動手才是"我會了". 所以話不多說, 下面一個寫入03Excel和寫入07Excel的例子你操作一遍就會體會POI的基本寫入操作
寫入03Excel
public void testWrite03Excel() throws Exception{ //創建03版工作薄(workbook) HSSFWorkbook workbook = new HSSFWorkbook(); //創建名稱為hello的工作表(sheet) HSSFSheet sheet = workbook.createSheet("hello"); //創建第3行 HSSFRow row = sheet.createRow(2); //創建第3列 HSSFCell cell = row.createCell(2); //設置單元格的值 cell.setCellValue("hello world"); //創建輸出流用來寫入到硬盤 FileOutputStream outputStream = new FileOutputStream("F:/my/tempTest/測試.xls"); //寫入 workbook.write(outputStream); //關閉流 outputStream.close(); workbook.close(); }View Code
寫入07Excel
public void testWrite07Excel() throws Exception{ //創建07版工作薄(workbook) XSSFWorkbook workbook = new XSSFWorkbook(); //創建工作表(sheet) XSSFSheet sheet = workbook.createSheet("hello"); //創建第3行 XSSFRow row = sheet.createRow(2); //創建第3列 XSSFCell cell = row.createCell(2); //設置值 cell.setCellValue("hello world"); //創建輸出流用來寫入 FileOutputStream outputStream = new FileOutputStream("F:/my/tempTest/測試.xlsx"); workbook.write(outputStream); outputStream.close(); workbook.close(); }View Code
從這兩個可以看出, 生成文件的後綴不同, 操作他們的類也不相同, 操作03版的都是Hxx, 操作07版的是Xxx, 那麼你也許想問, 有沒有相同的類或接口來操作他們, 答案是有的, 不過在new 工作薄(workbook)的時候要區分一下, 因為他們都只是實現公共的接口, 在下面讀取的時候講解.
讀取03和07Excel
//這個應該是把Excel作為一個參數傳入, 為了測試方便, 就不傳參了 @Test public void testRead03And07Excel() throws Exception{ String fileName = "F:/my/tempTest/測試.xls"; FileInputStream inputStream = new FileInputStream(fileName); Workbook workbook = null; //讀取工作薄(workbook), 根據後綴判斷工作薄的版本 if(fileName.endsWith(".xls")) workbook = new HSSFWorkbook(inputStream); else if(fileName.endsWith(".xlsx")) workbook = new XSSFWorkbook(inputStream); //讀取第1個工作表(sheet) Sheet sheet = workbook.getSheetAt(0); //讀取第3行 Row row = sheet.getRow(2); //讀取第3列 Cell cell = row.getCell(2); //讀取值 String value = cell.getStringCellValue(); System.out.println("第3行第3列的值是" + value); workbook.close(); inputStream.close(); }View Code
接收Excel時判斷其版本, 然後用不同的workbook接收, 接下來的操作都用他們的共同接口表示, 這樣實現了一個方法讀取不同版本的Excel. 我這裡讀取的一行數據, 在實際導入Excel的時候肯定不止一行數據, 到時候需要注意循環讀取, 讀取的起始行以及讀取數據的類型等.
public void testExcelStyle() throws Exception { //創建工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); //創建單元格樣式, 樣式屬於工作薄, 運用於單元格 HSSFCellStyle cellStyle = workbook.createCellStyle(); //水平居中 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //垂直居中 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //創建字體, 字體屬於工作薄, 應用於單元格 HSSFFont font = workbook.createFont(); //字體大小 font.setFontHeightInPoints((short) 16); //字體顏色 font.setColor(HSSFFont.COLOR_RED); //加粗 font.setBold(true); //運用字體 cellStyle.setFont(font); //背景色需要設置前景色、背景色和填充模式,否則可能沒有效果 //設置前景色 cellStyle.setFillForegroundColor(HSSFColor.BLUE_GREY.index); //設置背景色 cellStyle.setFillBackgroundColor(HSSFColor.YELLOW.index); //設置填充模式, 以前景色為准, 也可以設置其他的填充模式, 得到的結果就是前景色背景色交相輝映 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //創建合並單元格對象 //合並單元格, 屬於工作薄, 運用於工作表 //構造方法的4個參數分別是firstRow, lastRow, firstCol, lastCol CellRangeAddress rangeAddress = new CellRangeAddress(2, 2, 2, 3); //創建名稱為hello的工作表 HSSFSheet sheet = workbook.createSheet("hello"); //sheet運用合並單元格對象 sheet.addMergedRegion(rangeAddress); //設置第3列的寬度 //sheet.setColumnWidth(2, 12000); //創建第3行 HSSFRow row = sheet.createRow(2); //row.setHeightInPoints((short) 80);//設置行高 //創建第3列 HSSFCell cell = row.createCell(2); //設置值 cell.setCellValue("hello world"); //運用樣式 cell.setCellStyle(cellStyle); //創建輸出流用來寫入 FileOutputStream outputStream = new FileOutputStream("F:/my/tempTest/測試Style.xls"); workbook.write(outputStream); outputStream.close(); workbook.close(); }View Code
POI操作Excel的基本操作就這麼多了, 再結合文件的上傳下載就可以實現Excel的導入導出了.