Java實戰—POI操作Excel文檔、讀取、寫入、合併單元格

一、POI項目簡介

POI全稱 Poor Obfuscation Implementation,利用POI接口可以通過JAVA操作Microsoft office 套件工具的讀寫功能。官網:http://poi.apache.org ,POI支持office的所有版本。

二、POI操作Excel文檔

(一)準備開發環境
所需要的相關依賴包:

	<!-- POI -->
		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>3.16</version>
        </dependency>        
	<!-- Junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

(二)用POI操作03版EXCEL文檔
在POI包中有如下幾個主要對象和excel的幾個對象對應:

HSSFWorkbook Excel 工作簿workbook
HSSFSheet Excel 工作表 sheet
HSSFRow Excel 行
HSSFCell Excel 單元格

利用以上幾個對象,我們簡單創建一個Excel工作表,往裏面的C1單元格寫入和讀出“Hello World”:
1、寫入excel:

@Test
	public void testExcelWrite() throws IOException{
		//1、新建工作簿
		HSSFWorkbook workbook=new HSSFWorkbook();
		//2、創建工作表
		HSSFSheet sheet=workbook.createSheet("工作表1");
		//3、創建行
		HSSFRow row=sheet.createRow(0);
		//4、創建單元格
		HSSFCell cell=row.createCell(2);
		//5、單元格寫入內容
		cell.setCellValue("你好JAVA");
		
		//6、保存工作簿
		File file=new File("d:\\hello.xls");
		workbook.write(file);
		System.out.println("創建Excel成功");
	}

2、讀取excel:

/**
	 * 讀取Excel演示
	 * @throws IOException 
	 */
	@Test
	public void readExcelTest() throws IOException{
		FileInputStream input=new FileInputStream("d:\\hello.xls");
		HSSFWorkbook workbook=new HSSFWorkbook(input);
		HSSFSheet sheet=workbook.getSheet("工作表1");
		HSSFRow row=sheet.getRow(0);
		HSSFCell cell=row.getCell(2);
		System.out.println("讀取單元格內容:"+cell.getStringCellValue());
	}

(三)用POI操作07版EXCEL文檔
POI 也能對07以後的excel版本進行讀寫,讀寫方法和讀寫03版是一樣的,只是對象名稱變了;原來各對象的開頭字母H變爲X,操作方式不變。
1、 Excel 的工作簿對應POI的XSSFWorkbook對象;
2、 Excel 的工作表對應POI的XSSFSheet對象;
3、 Excel 的行對應POI的XSSFRow對象;
4、 Excel 的單元格對應POI的XSSFCell對象。
1、寫入xlsx:

/**
	 * 寫入2007格式的Excel
	 * @throws IOException
	 */
	@Test
	public void testExcel2007Write() throws IOException{
		//1、創建工作簿
		XSSFWorkbook workbook=new XSSFWorkbook();
		
		//2、新建工作表
		XSSFSheet sheet=workbook.createSheet("新建工作表1");
		//3、新增行
		XSSFRow row=sheet.createRow(0);
		//4、新建單元格
		XSSFCell cell=row.createCell(2);
		//5、給單元格填充數據
		cell.setCellValue("hello world");
		//6、保存工作簿
		FileOutputStream fileout=new FileOutputStream("d:\\hello2.xlsx");
		workbook.write(fileout);
		System.out.println("創建2007格式的Excel成功");
		
	}

2、讀取xlsx:

/**
	 * 讀取2007格式的Excel
	 * @throws IOException 
	 */
	@Test
	public void TestExcel2007Read() throws IOException{
		//1、創建FileInputStream
		FileInputStream filein=new FileInputStream("d:\\hello2.xlsx");
		//2、基於流來創建Excel工作簿
		XSSFWorkbook workbook=new XSSFWorkbook(filein);
		//3、從工作簿來讀取工作表
		XSSFSheet sheet=workbook.getSheet("新建工作表1");
		//4、從工作表讀取行
	    XSSFRow row=sheet.getRow(0);
	    //5、從行中讀取單元格
	    XSSFCell cell=row.getCell(2);
	    //6、從單元格獲取內容
	    System.out.println(cell.getStringCellValue());
	}

(四)用POI統一讀取03、07版EXCEL文檔
從api文檔中我們瞭解到:
HSSFWorkbook 和 XSSFWorkbook 都實現了Workbook接口;
HSSFSheet 和 XSSFSheet 實現了Sheet接口;
HSSFRow 和 XSSFRow 實現了Row接口;
HSSFCell 和 XSSFCell 實現了Cell接口;
因爲這兩類處理對象共同實現了對應的同一接口,屆時將大大方便和簡化了同時處理不同格式的excel文件的編碼工作。如;在處理03和07版本的excel文件時利用統一的接口就可以做到分析兩個版本的excel數據。
POI同時讀入03和07版本的excel。
方法一:判斷文件的名稱後調用對應版本的讀入方法。
方法二:根據WorkbookFactory來讀入文件並統一處理。

@Test
	public void AllExcelRead() throws IOException, EncryptedDocumentException, InvalidFormatException{
		//1、指定要讀取EXCEL文檔名稱
		String filename="d:\\hello2.xlsx";
		//filename="d:\\hello.xls";
		//2、創建輸入流
		FileInputStream input=new FileInputStream(filename);
		//3、通過工作簿工廠類來創建工作簿對象
		Workbook workbook=WorkbookFactory.create(input);
		//4、獲取工作表
		Sheet sheet=workbook.getSheet("新建工作表1");
		//5、獲取行
		Row row=sheet.getRow(0);
		//6、獲取單元格
		Cell cell=row.getCell(2);
		//7、讀取單元格內容
		System.out.println(cell.getStringCellValue());
	}

(五)遍歷讀取一個Excel文件

/**
	 * 遍歷一個Excel
	 * 
	 * @throws IOException
	 * @throws InvalidFormatException
	 * @throws EncryptedDocumentException
	 */
	@Test
	public void ExcelReadIteart() throws EncryptedDocumentException, InvalidFormatException, IOException {
		// 1、指定要讀取EXCEL文檔名稱
		String filename = "d:\\test.xlsx";
		// filename="d:\\hello.xls";
		// 2、創建輸入流
		FileInputStream input = new FileInputStream(filename);
		// 3、通過工作簿工廠類來創建工作簿對象
		Workbook workbook = WorkbookFactory.create(input);
		//4、遍歷工作簿下面的所有工作表
		int sheetnum=workbook.getNumberOfSheets();
		for(int i=0;i<sheetnum;i++){
			//獲取到單個工作表
			Sheet sheet=workbook.getSheetAt(i);
			//獲取工作表下的所有行數
			int rownum=sheet.getPhysicalNumberOfRows();
			//獲取第一行的單元格個數
			
			for(int j=0;j<rownum;j++){
				//獲取到每一行
				Row row=sheet.getRow(j);
				int cellnum=row.getPhysicalNumberOfCells();
				//獲取每一行下的全部單元格
				for(int x=0;x<cellnum;x++){
					Cell cell=row.getCell(x);
					//判斷單元格類型,獲取對應數據
					if(cell.getCellTypeEnum()==CellType.STRING){
						System.out.print(cell.getStringCellValue()+"\t");
					}else if(cell.getCellTypeEnum()==CellType.NUMERIC){
						System.out.print(cell.getNumericCellValue()+"\t");
					}else if(cell.getCellTypeEnum()==CellType.BOOLEAN){
						System.out.print(cell.getBooleanCellValue()+"\t");
					}else if(cell.getCellTypeEnum()==CellType.BLANK){
						System.out.print("null"+"\t");
					}else{
						System.out.print(cell.getDateCellValue()+"\t");
					}
				}
				System.out.println("");
			}
			
		}
	}

單元格類型 描述
CELL_TYPE_BLANK 代表空白單元格
CELL_TYPE_BOOLEAN 代表布爾單元(true或false)
CELL_TYPE_ERROR 表示在單元的誤差值
CELL_TYPE_FORMULA 表示一個單元格公式的結果
CELL_TYPE_NUMERIC 表示對一個單元的數字數據
CELL_TYPE_STRING 表示對一個單元串(文本)

(六)POI合併EXCEL單元格
合併單元格
在POI中有一個CellRangeAddress對象,中文直譯是 單元格範圍地址,主要用於在單元格的合併上,這個對象的構造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4個參數,分別表示(起始行號,終止行號, 起始列號,終止列號), 設置這個對象中要合併的單元格範圍後,工作表對象sheet調用方法addMergedRegion(CellRangeAddress region) ,將上述設置的CellRangeAddress對象作爲參數傳入即可合併單元格。

public void mergedRegion() throws IOException{
		//新建工作簿
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
		//新建工作表
		XSSFSheet sheet = xssfWorkbook.createSheet("工作表1");
		//指定合併開始行、合併結束行 合併開始列、合併結束列
		CellRangeAddress rangeAddress = new CellRangeAddress(1, 2, 1, 3);
		//添加要合併地址到表格
		sheet.addMergedRegion(rangeAddress);
		
		//創建行,指定起始行號,從0開始
		XSSFRow row = sheet.createRow(1);
		//創建單元格,指定起始列號,從0開始
		XSSFCell cell = row.createCell(1);
		//設置單元格內容
		cell.setCellValue("我是合併後的單元格");
		//創建樣式對象
		CellStyle style = xssfWorkbook.createCellStyle();
		//設置樣式對齊方式:水平\垂直居中
		style.setAlignment(HorizontalAlignment.CENTER);
		style.setVerticalAlignment(VerticalAlignment.CENTER);
		//設定填充單色
		style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
		//設定背景顏色
		style.setFillForegroundColor(IndexedColors.RED.getIndex());
		//爲指定單元格設定樣式
		cell.setCellStyle(style);
		FileOutputStream fileOutputStream = new FileOutputStream("d:\\hello-3.xlsx");
		xssfWorkbook.write(fileOutputStream);
		fileOutputStream.close();
	}

在這裏插入圖片描述
【注意:上圖中合併單元格後,單元格的名稱是第一個單元格;即上面中合併了第二到第三行的第二列到第五列,合併後的單元格叫B2,而其它被合併的單元格已經無效了,不能對無效單元格設置值。如果進行了設置將不顯示。】

點擊查看

Java實戰—POI 與SpringMVC框架(SSM框架)整合實現Excel導入導出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章