poi

简介

  1. Apache POI是java编写的免费开源的跨平台的java API

  2. Apache POI提供api给java提供对office格式档案读和写的功能

  3. POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现

  4. 用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。

  5. Apache POI 提供Java操作Excel解决方案\

导包

<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.4</version>
		</dependency>
		<!-- poi导包 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.15-beta2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.15-beta2</version>
		</dependency>	

读取

  1. 读取Excel


    • XSSFWorkbook wb = new XSSFWorkbook(); // .xlsx
      HSSFWorkbook wb = new HSSFWorkbook();// .xls
    • 基础api
      • Sheet sheet = wb.getSheetAt(索引); //获取工作簿
      • int i = wb. getNumberOfSheets() //获取表的数量
      • int I = sheet.getFirstRowNum(); // 获取第一行有值的索引
      • int i = sheet.getLastRowNum(); // 获取最后一行有值的索引
      • for(Row row : sheet){} // poi中直接可以直接遍历工作簿 (row每行)
      • int i = row.getFirstCellNum(); // 获取this行的第一列有值的索引
      • int i =row.getLastCellNum(); // 获取this行的最后一列有值的索引
      • row.getLastCellNum() // 获取this行的总列数
      • row.getRowNum() // 获取正在遍历的行(索引)
      • row.getCell(0).getStringCellValue(); // 获取this行的第一列(索引)类型必须一致

    同一类型格式

    /**
    	 * 转换类型
    	 * 
    	 * @param cell
    	 * @return
    	 */
    	public static String getCellValue(Cell cell) {
    
    		String cellValue = "";
    
    		if (cell == null) {
    
    			return cellValue;
    
    		}
    		// 判断数据的类型
    		switch (cell.getCellType()) {
    		case Cell.CELL_TYPE_NUMERIC: // 数字
    
    			// short s = cell.getCellStyle().getDataFormat();
    
    			if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
    
    				SimpleDateFormat sdf = null;
    
    				// 验证short值
    
    				if (cell.getCellStyle().getDataFormat() == 14) {
    
    					sdf = new SimpleDateFormat("yyyy/MM/dd");
    
    				} else if (cell.getCellStyle().getDataFormat() == 21) {
    
    					sdf = new SimpleDateFormat("HH:mm:ss");
    
    				} else if (cell.getCellStyle().getDataFormat() == 22) {
    
    					sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    
    				} else {
    
    					throw new RuntimeException("日期格式错误!!!");
    
    				}
    
    				Date date = cell.getDateCellValue();
    
    				cellValue = sdf.format(date);
    
    			} else if (cell.getCellStyle().getDataFormat() == 0) {// 处理数值格式
    
    				cell.setCellType(Cell.CELL_TYPE_STRING);
    
    				cellValue = String.valueOf(cell.getRichStringCellValue().getString());
    
    			}
    
    			break;
    
    		case Cell.CELL_TYPE_STRING: // 字符串
    
    			cellValue = String.valueOf(cell.getStringCellValue());
    
    			break;
    
    		case Cell.CELL_TYPE_BOOLEAN: // Boolean
    
    			cellValue = String.valueOf(cell.getBooleanCellValue());
    
    			break;
    
    		case Cell.CELL_TYPE_FORMULA: // 公式
    
    			cellValue = String.valueOf(cell.getCellFormula());
    
    			break;
    
    		case Cell.CELL_TYPE_BLANK: // 空值
    
    			cellValue = null;
    
    			break;
    
    		case Cell.CELL_TYPE_ERROR: // 故障
    
    			cellValue = "非法字符";
    
    			break;
    
    		default:
    
    			cellValue = "未知类型";
    
    			break;
    
    		}
    
    		return cellValue;
    
    	}
    

写入

  1. 写入 Excel

      • XSSFWorkbook wb = new XSSFWorkbook(); // .xlsx
      • HSSFWorkbook wb = new HSSFWorkbook();// .xls
    • 基础api

      • Workbook xwb = new XSSFWorkbook(); //创建对象Excel
      • Sheet xs = xwb.createSheet();// 创建工作簿 “有参:给工作簿命名”
      • Row row = xs.createRow(0); // 创建行(索引)
      • Cell cell = row.createCell(0); // 创建this行的列(索引)
      • cell.setCellValue(); // 向this索引赋值
      • xwb.write(new FileOutputStream(new File(“D:\a.xlsx”))); // 向文档保存到XX目录下,后缀固定
  2. 实际java代码

    	@RequestMapping("uplode")
    	public void uplode(MultipartFile excelFile) throws Exception {
    		/*
    		 * =================================================== 获取文档数据Excel
    		 */
    		// 判断文件类型
    		Workbook wb = null;
    		// 获取后缀判断使用哪个类
    		String houZhui = excelFile.getOriginalFilename()
    				.substring(excelFile.getOriginalFilename().lastIndexOf(".") + 1);
    		if (houZhui.equalsIgnoreCase("xlsx")) {
    			wb = new XSSFWorkbook(excelFile.getInputStream());
    		} else if (houZhui.equalsIgnoreCase("xls")) {
    			wb = new HSSFWorkbook(excelFile.getInputStream());
    		}
    		// 获取第几个工作簿(索引)
    		Sheet sheet = wb.getSheetAt(0);
    		List<Student> list = new ArrayList<Student>();
    		// 内置遍历每列
    		for (Row row : sheet) {
    			String st = "";
    			Student student = new Student();
    			/* 获取每行的总列数 */
    //			short s = row.getLastCellNum();
    //			System.out.println(s + "a");
    			/* 获取正在操作的行(索引) */
    //			int i = row.getRowNum();
    //			System.out.println(i);
    			/* 获取第一列(索引) 的值 */
    			/* 如果类型不同需要转换 */
    //			 row.getCell(0).getStringCellValue();
    			/* 通过遍历获取this行的每列数据 */
    			short s = row.getLastCellNum();
    			for (int i = 0; i < s; i++) {
    
    				String value = row.getCell(i).getStringCellValue();
    				st = st + "," + value;
    			}
    			String[] split = st.split(",");
    			student.setName(split[1]);
    			student.setPassword(split[2]);
    			list.add(student);
    		}
    
    		/*
    		 * ==================================================== 创建并写入Excel
    		 */
    		/* 创建Excel对象 */
    		XSSFWorkbook xwb = new XSSFWorkbook();
    		// 创建工作簿
    		XSSFSheet xs = xwb.createSheet();
    		for (int i = 0; i < list.size(); i++) {
    			// 创建每行
    			XSSFRow row = xs.createRow(i);
    			// 创建并赋值this行的列
    			XSSFCell cell = row.createCell(0);
    			cell.setCellValue(list.get(i).getName());
    			
    			row.createCell(1).setCellValue(list.get(i).getPassword());
    		}
    		// 保存到xx目录 “后缀固定”
    		xwb.write(new FileOutputStream(new File("D:\\a.xlsx")));
    	}
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值