본문 바로가기
개발언어/C#

[C#] 폴더 내에 있는 모든 엑셀파일에서 문자열 찾기

by 창용이랑 2022. 9. 16.
728x90

특정 폴더 또는 특정 폴더를 포함한 서브 폴더에 있는 모든 엑셀 파일에서 찾는 문자가 들어 있는 엑셀 파일만 찾는 C# 프로그램 소스 입니다.

- xls, xlsx 모두 검색 가능

 

<실행 화면>

 

<C# 프로그램 소스>

using Microsoft.Office.Interop.Excel;
 
string findStr = "검색어";  //찾고자 하는 검색어
 
string sDirPath = System.IO.Directory.GetCurrentDirectory();  //찾을 파일이 있는 폴더 지정
DirectoryInfo info = new DirectoryInfo(sDirPath);
 
if (info.Exists)
{
    //Current디렉토리에서 찾기
    GetFiles(info);
 
    //서브디렉토리까지 확장해서 검색할 경우
    GetDirectories(info.GetDirectories());
}
 
private void GetFiles(DirectoryInfo sDirPath)
{
    FileInfo[] MyFilesList = sDirPath.GetFiles();
 
    foreach (FileInfo file in MyFilesList)
    {
         string filename = file.FullName;
 
         object False = false;
         object True = true;
 
         _Application excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
 
         try
         {
             Workbook wb = excel.Workbooks._Open(filename, False, False, Missing.Value, Missing.Value, False, False, Missing.Value, Missing.Value, False, Missing.Value, Missing.Value, True);
 
             int numSheets = wb.Sheets.Count;
 
             for (int i = 1; i < numSheets + 1; i++)   //엑셀의 Sheet 갯수만큼 반복하면서 해당 Sheet에 검색어가 있는지 확인
             {
                 _Worksheet ws = (_Worksheet)wb.Worksheets[i];
 
                 //Sheet의 모든 Cell에서 검색을 찾는 과정
                 Range rng = ws.Cells.Find(findStr, Missing.Value, XlFindLookIn.xlValues, Missing.Value, Missing.Value, XlSearchDirection.xlNext, False, False, Missing.Value);
 
                 if (rng != null)    //rng != null 이면 찾는 검색어가 존재한다는 의미
                 {
                      //찾았을때 적당한 로직 구현 list에 Add 작업 등
 
 
                      //찾고자하는 문자가 존재하는 Sheet가 있으니 다른 시트에서 더 이상 찾지 않고 끝냄.
                      break;
                 }
             }
             wb.Close(false, Type.Missing, Type.Missing);
         }
         catch{ }
    }
}
 
private void GetDirectories(DirectoryInfo[] subDirs)
{
    DirectoryInfo[] subSubDirs;
    foreach (DirectoryInfo subDir in subDirs)
    {
        //현재의 디렉토리의 파일에서 찾기
        GetFiles(subDir);
 
        // 해당 폴더의 Sub폴더들을 찾아서 재호출
        subSubDirs = subDir.GetDirectories();
        if (subSubDirs.Length != 0)
        {
            GetDirectories(subSubDirs);
        }
    }
}

출처 : https://jujun.tistory.com/222