POI操作Excel
-
Excel簡介
一個excel文件就是一個工作簿workbook认罩,一個工作簿中可以創(chuàng)建多張工作表sheet,而一個工作表中包含多個單元格Cell蹬耘,這些單元格都是由列(Column)行(Row)組成造烁,列用大寫英文字母表示,從A開始到Z共26列躏精,然后再從AA到AZ又26列,再從BA到BZ再26列以此類推鹦肿。行則使用數(shù)字表示矗烛,例如;A3 表示第三行第一列箩溃,E5表示第五行第五列瞭吃。
- TIM截圖20170820183058.png
-
POI工具包
JAVA中操作Excel的有兩種比較主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls為后綴的excel涣旨。而poi可以操作Excel 95及以后的版本歪架,即可操作后綴為 .xls 和 .xlsx兩種格式的excel。
POI全稱 Poor Obfuscation Implementation,直譯為“可憐的模糊實現(xiàn)”霹陡,利用POI接口可以通過JAVA操作Microsoft office 套件工具的讀寫功能和蚪。官網(wǎng):http://poi.apache.org ,POI支持office的所有版本烹棉,并且在接下來的演示中需要從前端頁面導(dǎo)入用戶上傳的版本不確定的excel文件攒霹,所以選擇POI來講解。
-
示例環(huán)境
- JDK 1.8
- OS: Windows10
- POI 3.16
-
添加 Maven 依賴
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.16</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans --> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>2.6.0</version> </dependency> <!-- https://mvnrepository.com/artifact/dom4j/dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
-
HelloWorld
-
07版本前
- Excel 的工作簿對應(yīng)POI的HSSFWorkbook對象浆洗;
- Excel 的工作表對應(yīng)POI的HSSFSheet對象催束;
- Excel 的行對應(yīng)POI的HSSFRow對象;
- Excel 的單元格對應(yīng)POI的HSSFCell對象伏社。
-
07版本及07以后版本
- Excel 的工作簿對應(yīng)POI的XSSFWorkbook對象抠刺;
- Excel 的工作表對應(yīng)POI的XSSFSheet對象塔淤;
- Excel 的行對應(yīng)POI的XSSFRow對象;
- Excel 的單元格對應(yīng)POI的XSSFCell對象矫付。
Hello POI
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; /** * Created by huangMP on 2017/8/20. * decription : */ public class OutputExcelDemo { /** * 從 工作簿中寫入 數(shù)據(jù) OutputExcelDemo * 07 版本及之前的版本寫法 * @throws IOException */ public void outputExcel() throws IOException { // 1. 創(chuàng)建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 2. 創(chuàng)建工作類 HSSFSheet sheet = workbook.createSheet("hello world"); // 3. 創(chuàng)建行 , 第三行 注意:從0開始 HSSFRow row = sheet.createRow(2); // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始 HSSFCell cell = row.createCell(2); cell.setCellValue("Hello World"); String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls"; FileOutputStream fileOutputSteam = new FileOutputStream(fileName); workbook.write(fileOutputSteam); workbook.close(); fileOutputSteam.close(); } }
- 測試方法
@Test public void outputExcel() throws Exception { OutputExcelDemo outputExcelDemo = new OutputExcelDemo(); outputExcelDemo.outputExcel(); }
-
-
從工作簿(Excel)文件讀取信息
/** * 從 工作簿中讀取 數(shù)據(jù) ReadExcelDemo * @throws IOException */ public void readExel() throws IOException { String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls"; FileInputStream fileInputStream = new FileInputStream(fileName); // 1. 創(chuàng)建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream); // 2. 創(chuàng)建工作類 HSSFSheet sheet = workbook.getSheetAt(0); // 3. 創(chuàng)建行 , 第三行 注意:從0開始 HSSFRow row = sheet.getRow(2); // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始 HSSFCell cell = row.getCell(2); String cellString = cell.getStringCellValue(); System.out.println("第三行第三列的值為 : " + cellString ); workbook.close(); fileInputStream.close(); }
-
格式化Excel
- 在POI中可以利用格式化對象來格式化excel文檔凯沪;也即設(shè)置excel內(nèi)容的樣式。POI中主要的格式化對象常用的有合并單元格买优、設(shè)置單元格字體妨马、邊框,背景顏色等杀赢。
- 常用設(shè)置
- 合并單元格
在POI中有一個CellRangeAddress對象,中文直譯是 單元格范圍地址烘跺,主要用于在單元格的合并上,這個對象的構(gòu)造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4個參數(shù)脂崔,分別表示(起始行號滤淳,終止行號, 起始列號砌左,終止列號), 設(shè)置這個對象中要合并的單元格范圍后脖咐,工作表對象sheet調(diào)用方法addMergedRegion(CellRangeAddress region) ,將上述設(shè)置的CellRangeAddress對象作為參數(shù)傳入即可合并單元格汇歹。
-
設(shè)置單元格樣式
- 首先要設(shè)置單元格樣式則要先初始化POI中的單元格樣式對象HSSFCellStyle屁擅,然后在樣式對象中設(shè)置不同的樣式(內(nèi)容位置、字體产弹、背景派歌、顏色、邊框等)痰哨。單元格樣式是由工作簿workbook創(chuàng)建的胶果,一個工作簿可以創(chuàng)建多個樣式。
- 設(shè)置單元格內(nèi)容位置斤斧;設(shè)置水平位置 setAlignment(short align) 早抠,設(shè)置垂直位置setVerticalAlignment(short align)
- 設(shè)置單元格字體;POI中的字體對象為HSSFFont撬讽,字體是由工作簿創(chuàng)建蕊连,可以用于多個單元格上。
- 設(shè)置單元格背景色锐秦。
- 首先要設(shè)置單元格樣式則要先初始化POI中的單元格樣式對象HSSFCellStyle屁擅,然后在樣式對象中設(shè)置不同的樣式(內(nèi)容位置、字體产弹、背景派歌、顏色、邊框等)痰哨。單元格樣式是由工作簿workbook創(chuàng)建的胶果,一個工作簿可以創(chuàng)建多個樣式。
- 合并單元格
- 示例代碼
public void testExcelStyle() throws IOException { // 1. 創(chuàng)建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 1.1 創(chuàng)建單元格對象 合并第三行第三列到5列 // 構(gòu)造參數(shù) 起始行號 結(jié)束行號 起始列號 結(jié)束列號 CellRangeAddress cellRangeAddress = new CellRangeAddress( 2, 2, 2, 4 ); // 1.2 創(chuàng)建單元格樣式 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setAlignment(HSSFCellStyle.VERTICAL_CENTER); // 1.3 創(chuàng)建字體 HSSFFont font = workbook.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setFontHeightInPoints((short)16); // 將字體加載到樣式中 style.setFont(font); // 1.4 設(shè)置背景色為黃色 // 1.4.1 設(shè)置填充模式 style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setFillBackgroundColor(HSSFColor.YELLOW.index); style.setFillForegroundColor(HSSFColor.GREEN.index); // 2. 創(chuàng)建工作類 HSSFSheet sheet = workbook.createSheet("hello world"); // 2.1 加入合并單元格對象 sheet.addMergedRegion(cellRangeAddress); // 3. 創(chuàng)建行 , 第三行 注意:從0開始 HSSFRow row = sheet.createRow(2); // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始 HSSFCell cell = row.createCell(2); cell.setCellValue("Hello World"); // 4.1 單元格添加樣式 cell.setCellStyle(style); String fileName = "D:\\huangMP\\Desktop\\HelloExcelStyle.xls"; FileOutputStream fileOutputSteam = new FileOutputStream(fileName); workbook.write(fileOutputSteam); workbook.close(); fileOutputSteam.close(); }