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导入导出

发布了19 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42548384/article/details/83008583