POI方法导入Excel

需要的jar包:

poi-3.7-20101029.jarpoi-ooxml-3.7-20101029.jar
poi-ooxml-schemas-3.7-20101029.jar
commons-io-2.5.jar
xmlbeans-2.3.0.jar
dom4j-1.6.1.jar


对office2003和2007分别处理(即对xls和xlsx分别处理)

	// Excel 2003
	private final static String XLS = "xls";
	// Excel 2007
	private final static String XLSX = "xlsx";

根据Excel路径获取Workbook:

	public static Workbook getWorkbook(String path) throws Exception {
		Workbook workbook = null;
		File file = new File(path);
		FileInputStream fis = null;
		String extensionName = FilenameUtils.getExtension(file.getName());
		fis = new FileInputStream(file);
		if (extensionName.toLowerCase().equals(XLS)) {
			workbook = new HSSFWorkbook(fis);
		} else if (extensionName.toLowerCase().equals(XLSX)) {
			workbook = new XSSFWorkbook(fis);
		} else {
			workbook = null;
		}
		return workbook;
	}

获取Workbookl中的Sheet数量:

	public static int getNumberOfSheets(Workbook workbook) {
		int count = 0;
		if (null != workbook) {
			count = workbook.getNumberOfSheets();
		}
		return count;
	}

获取Sheet的名称集合并存储在List集合中:

	public static List<String> getNameOfSheets(Workbook workbook) {
		List<String> list = new ArrayList<String>();
		if (null != workbook) {
			int count = getNumberOfSheets(workbook);
			for (int i = 0; i < count; i++) {
				list.add(workbook.getSheetName(i));
			}
		}
		return list;
	}

获取Sheet集合数组:

	public static Sheet[] getSheets(Workbook workbook) {
		Sheet[] sheets = null;
		if (null != workbook) {
			int count = getNumberOfSheets(workbook);
			if (count > 0) {
				sheets = new Sheet[count];
				for (int i = 0; i < count; i++) {
					sheets[i] = workbook.getSheetAt(i);
				}
			}
		}
		return sheets;
	}

获取Sheet的行数据并以字符串的格式保存到List集合中:

	public static List<String> getRowToList(Sheet sheet, int index) {
		List<String> list = new ArrayList<String>();
		if (null != sheet) {
			// 第一行索引(从0开始)
			int minNumOfRows = sheet.getFirstRowNum();
			// 最后一行索引
			int maxNumOfRows = sheet.getLastRowNum();
			if (index >= minNumOfRows && index <= maxNumOfRows) {
				Row row = sheet.getRow(index);
				// 第一列索引
				int minNumCells = row.getFirstCellNum();
				// 最后一列索引
				int maxNumCells = row.getLastCellNum();
				Cell cell = null;
				// 格式化日期
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s");
				// 格式化数字(去除小数点后无用的0)
				NumberFormat nf = NumberFormat.getInstance();
				for (int i = minNumCells; i < maxNumCells; i++) {
					cell = row.getCell(i);
					switch (cell.getCellType()) {
					case Cell.CELL_TYPE_BOOLEAN:// 布尔类型
						boolean t = cell.getBooleanCellValue();
						if (t) {// true--->1
							list.add(String.valueOf(1));
						} else {// false--->0
							list.add(String.valueOf(0));
						}
						break;
					case Cell.CELL_TYPE_NUMERIC: // 数字类型(包括日期类型)
						// 这里的日期类型会被转换为数字类型,需要判别后区分处理
						if (DateUtil.isCellDateFormatted(cell)) {
							list.add(String.valueOf(format.format(cell.getDateCellValue())));
						} else {
							list.add(String.valueOf(nf.format(cell.getNumericCellValue())));
						}
						break;
					case Cell.CELL_TYPE_STRING: // 字符串类型
						list.add(cell.getStringCellValue());
						break;
					default: // 其他类型
						list.add("");
						break;
					}
				}
			}
		}
		return list;
	}

获取Sheet中指定行数据到Map中(key为Sheet第一行数据):

	public static Map<String, String> getRowToMap(Sheet sheet, int index) {
		Map<String, String> map = null;
		if (null != sheet) {
			int minNumOfRows = sheet.getFirstRowNum();
			int maxNumOfRows = sheet.getLastRowNum();
			List<String> header = getRowToList(sheet, minNumOfRows);
			int minNumCells = sheet.getRow(minNumOfRows).getFirstCellNum();
			int maxNumCells = sheet.getRow(minNumOfRows).getLastCellNum();
			index = minNumOfRows + index + 1;// 不算第一行
			if (index >= minNumOfRows && index <= maxNumOfRows) {
				map = new HashMap<String, String>();
				// 格式化日期
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s");
				// 格式化数字(去除小数点后无用的0)
				NumberFormat nf = NumberFormat.getInstance();
				Cell cell = null;
				String headerCellValue = null;
				// 不含标题行(minNumOfRows + 1)
				Row row = sheet.getRow(index);
				map = new HashMap<String, String>();
				for (int j = minNumCells; j < maxNumCells; j++) {
					cell = row.getCell(j);
					headerCellValue = header.get(j);
					if (null != cell) {
						switch (cell.getCellType()) {
						case Cell.CELL_TYPE_BOOLEAN:// 布尔类型
							boolean t = cell.getBooleanCellValue();
							if (t) {// true--->1
								map.put(headerCellValue, "1");
							} else {// false--->0
								map.put(headerCellValue, "0");
							}
							break;
						case Cell.CELL_TYPE_NUMERIC:
							// 这里的日期类型会被转换为数字类型,需要判别后区分处理
							if (DateUtil.isCellDateFormatted(cell)) {
								map.put(headerCellValue, String.valueOf(format.format(cell.getDateCellValue())));
							} else {
								map.put(headerCellValue, String.valueOf(nf.format(cell.getNumericCellValue())));
							}
							break;
						case Cell.CELL_TYPE_STRING:
							map.put(headerCellValue, cell.getStringCellValue());
							break;
						default:
							map.put(headerCellValue, "");
							break;
						}
					}
				}
			}
		}
		return map;
	}

获取Sheet数据到List<Map<String,String>>中:

	public static List<Map<String, String>> getData(Sheet sheet) {
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		if (null != sheet) {
			Map<String, String> map = null;
			int minNumOfRows = sheet.getFirstRowNum();
			int maxNumOfRows = sheet.getLastRowNum();
			List<String> rowData = null, firstRowData = getRowToList(sheet, minNumOfRows);
			int firstCellSize = firstRowData.size(), cellSize = 0;
			// 不含标题行(minNumOfRows + 1)
			for (int i = minNumOfRows + 1; i <= maxNumOfRows; i++) {
				map = new HashMap<String, String>();
				rowData = getRowToList(sheet, i);
				cellSize = rowData.size();
				for (int j = 0; j < cellSize && j < firstCellSize; j++) {
					if (j >= cellSize) {
						map.put(firstRowData.get(j), "");
					} else if (j >= firstCellSize) {
						map.put(String.valueOf(j), rowData.get(j));
					} else {
						map.put(firstRowData.get(j), rowData.get(j));
					}
				}
				list.add(map);
			}
		}
		return list;
	}

测试主程序:

    public static void main(String[] args) throws Exception {
        Workbook workbook = getWorkbook("d://ceshi.xlsx");
        // 获取sheet数量
        int sheetNum = getNumberOfSheets(workbook);
        System.out.println("工作薄中共有Sheet:" + sheetNum + "个。");
        List<String> sheetNames = getNameOfSheets(workbook);
        System.out.println("工作薄中Sheet名称:" + sheetNames.toString());
        Sheet sheet = workbook.getSheetAt(0);
        List<String> rowList = getRowToList(sheet, 10);
        System.out.println("第一个Sheet中的第一行数据:" + rowList.toString());
        System.out.println("第一个Sheet中的所有数据:");
        List<Map<String, String>> list = getData(sheet);
        for (Map<String, String> map : list) {
            System.out.println(map.toString());
        }
    }

Excel表格中数据:



程序测试结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot可以使用POI库来导入Excel文件。POI是一个Java库,用于读取和写入Microsoft Office格式的文件,包括Excel。以下是使用Spring Boot和POI导入Excel文件的基本步骤: 1. 添加POI依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建Excel文件 在Excel中创建一个表格,包含要导入的数据。确保表格的列名与Java类中的属性名称相匹配。 3. 创建Java类 创建一个Java类来表示Excel中的数据。该类应该包含与Excel表格中的列相对应的属性。 4. 创建Controller 创建一个Spring Boot控制器,用于处理Excel文件的导入。在控制器中,使用POI库来读取Excel文件,并将数据映射到Java对象中。 5. 测试导入 使用Postman或其他HTTP客户端测试导入功能。将Excel文件作为请求体发送到控制器,并验证数据是否已成功导入。 以上是使用Spring Boot和POI导入Excel文件的基本步骤。 ### 回答2: Spring Boot 是一个快速开发框架,它通过自动配置帮助开发人员快速搭建应用程序,POI 则是一款提供操作 Microsoft Office 文件的 Java 库。在开发过程中,经常需要将数据导入 Excel 表格中,使用 Spring Boot 和 POI 结合起来,可以更加简单地实现数据导入 Excel 的功能。 首先,需要在 Maven 中引入 POI 相关依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 接下来,使用 Spring Boot 提供的文件上传组件 MultipartFile 接收上传的文件,并使用 POI 的工具类读取 Excel 文件中的数据: ``` import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; @RestController public class ExcelController { @PostMapping("/import") public String importExcel(@RequestParam("file") MultipartFile file) throws Exception { InputStream inputStream = file.getInputStream(); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); // 获取第一个工作表 XSSFSheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { String value = cell.getStringCellValue(); System.out.println(value); } } workbook.close(); inputStream.close(); return "success"; } } ``` 在上述代码中,首先通过 MultipartFile 对象获取上传的文件,然后获取文件的输入流并传给 XSSFWorkbook 类,通过该类的 getSheetAt() 方法获取第一个工作表,接着循环遍历每一行和每一列的单元格,使用 getStringCellValue() 方法获取每个单元格的值。 值得注意的是,上述代码只是简单地读取 Excel 文件中的数据,如果需要将数据插入或更新至数据库,还需要对读取到的数据进行处理。 综上所述,使用 Spring Boot 和 POI 结合实现数据导入 Excel 的功能,既方便又高效,能够提高开发效率,并且可以通过扩展代码实现更多的功能。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它很适合于开发Web应用程序和微服务。在Spring Boot项目中使用POI(Poor Obfuscation Implementation)导入Excel文件可以方便地读取和处理大量数据。以下是关于如何使用Spring Boot和POI导入Excel的详细步骤。 第一步:在pom.xml中导入POI库依赖 ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version> </dependency> ``` 第二步:编写处理Excel文件的Java程序 1. 首先使用@RequestMapped注释将处理程序的URL映射到控制器类中。 ```java @Controller @RequestMapping("/excel") public class ExcelController { } ``` 2. 通过使用@RequestParam注释接收上传Excel文件的请求,并使用MultipartFile对象处理上传的Excel文件。 ```java @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { } ``` 3. 读取Excel数据需要使用POI的对象,首先我们需要定义一个Workbook对象来表示整个Excel文件。 ```java Workbook workbook = null; ``` 4. 接下来使用try/catch块加载Excel文件,并使用XSSFWorkbook对象将文件数据转换成Workbook对象。 ```java try { workbook = new XSSFWorkbook(file.getInputStream()); } catch (IOException e) { e.printStackTrace(); } ``` 5. 通过Workbook对象获取Sheet对象,Sheet对象表示Excel文件中的一个工作表。 ```java Sheet sheet = workbook.getSheetAt(0); ``` 6. 接下来,使用for循环遍历工作表中的每一行。 ```java for (Row row: sheet) { } ``` 7. 在for循环中,我们可以使用getCell()方法获取每一行的单元格数据。 ```java Cell cell = row.getCell(0); ``` 8. 使用if语句检查单元格数据类型。 ```java if (cell.getCellType() == CellType.STRING) { } ``` 9. 如果单元格数据是字符串,则使用getString()方法获取该单元格的值。 ```java String cellValue = cell.getStringCellValue(); ``` 10. 最后,关闭workbook对象并返回结果。 ```java workbook.close(); return "redirect:/success"; ``` 总结:通过Spring Boot框架和POI库,处理Excel文件已经变得很简单。我们只需要在配置文件中导入POI库依赖项,编写处理Excel文件的Java程序,然后在控制器类中将其映射到相应的URL路径即可。通过这种方法,我们可以快速地读取和处理大量的Excel数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值