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的導入導出了.