用Java从Excel中进行搜索

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>mygroup</groupId>
	<artifactId>excelgrep</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>5.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>5.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.20.0</version>
		</dependency>
	</dependencies>
</project>
package excelgrep;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {
	public static void main(String[] args) throws Exception {
		// 検索開始フォルダ
		String[] dirPaths = { "C:\\dir1", "C:\\dir2" };
		// 検索語
		String[] words = { "検索語1", "\"" };
		// 除外サブフォルダ名
		String[] excludeSubDirNames = { "除外サブフォルダ1", "除外サブフォルダ2" };
		// 除外シート名
		String[] excludeSheetNames = { "除外シート1", "除外シート2" };

		System.out.println("開始します。");
		System.out.println("ファイル\tシート\tセル\t内容");
		List<String> wordsList = new ArrayList<String>(Arrays.asList(words));
		List<String> excludeSubDirNamesList = new ArrayList<String>(Arrays.asList(excludeSubDirNames));
		List<String> excludeSheetNamesList = new ArrayList<String>(Arrays.asList(excludeSheetNames));
		for (String dirPath : dirPaths) {
			func(new File(dirPath), wordsList, excludeSubDirNamesList, excludeSheetNamesList);
		}
		System.out.println("終了します。");
	}

	private static void func(File dir, List<String> wordsList, List<String> excludeSubDirNamesList, List<String> excludeSheetNamesList) throws Exception {
		File[] fileOrSubDirs = dir.listFiles();
		if (fileOrSubDirs != null) {
			for (File fileOrSubDir : fileOrSubDirs) {
				// 除外サブフォルダでなければ再帰的に処理
				if (fileOrSubDir.isDirectory() && !excludeSubDirNamesList.contains(fileOrSubDir.getName())) {
					func(fileOrSubDir, wordsList, excludeSubDirNamesList, excludeSheetNamesList);
				}
				// 拡張子が.xlsxなファイルから検索
				if (fileOrSubDir.isFile() && fileOrSubDir.getName().endsWith(".xlsx")) {
					try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(fileOrSubDir))) {
						// 除外シート以外のシートから検索
						workbook.forEach(sheet -> {
							if (!excludeSheetNamesList.contains(sheet.getSheetName())) {
								sheet.forEach(row -> row.forEach(cell -> {
									if (cell.getCellType() == CellType.STRING) {
										String cellValue = cell.getStringCellValue();
										wordsList.forEach(word -> {
											if (cellValue.contains(word)) {
												// 検索結果はExcelに貼り付けやすい書式で出力
												System.out.printf("%s\t%s\t%s\t\"%s\"%n", fileOrSubDir.getAbsoluteFile(), sheet.getSheetName(), cell.getAddress().toString(),
														cellValue.replaceAll("\"", "\"\""));
											}
										});
									}
									// TODO STRING以外や数式やオブジェクト内からも検索
								}));
							}
						});
					} catch (Exception e) {
						System.err.println(e.toString());
					}
				}
			}
		}
	}
}

这个链接是他参考创建Apache POI的Excel Grep工具时使用的。非常感谢。

广告
将在 10 秒后关闭
bannerAds