>

내 질문은 아주 사소한 것처럼 보이지만 수많은 연구에도 불구하고 답을 찾지 못했습니다.

.NET에서 파일 이름이 Excel 스프레드 시트인지 알 수있는 방법이 있습니까?

특정 확장자 (.xls, .xlsx 등)에 관심이 없습니다. 파일이 Excel 일반 스프레드 시트인지 알고 싶습니다.

  • 답변 # 1

    오래 전에 비슷한 코드를 작성했습니다 :

    private enum Extensions
    {
        Unknown = 0,
        DocOrXls,
        Pdf,
        Jpg,
        Png,
        DocxOrXlsx,
    }
    private static readonly Dictionary<Extensions, string> ExtensionSignature = new Dictionary<Extensions, string>
        {
            {Extensions.DocOrXls, "D0-CF-11-E0-A1-B1-1A-E1"},
            {Extensions.Pdf, "25-50-44-46"},
            {Extensions.Jpg, "FF-D8-FF-E"},
            {Extensions.Png, "89-50-4E-47-0D-0A-1A-0A"},
            {Extensions.DocxOrXlsx, "50-4B-03-04-14-00-06-00"}
        };
    private static string GetExtension(byte[] bytes)
    {
        if (bytes.Length < 8)
            return string.Empty;
        var signatureBytes = new byte[8];
        Array.Copy(bytes, signatureBytes, signatureBytes.Length);
        string signature = BitConverter.ToString(signatureBytes);
        Extensions extension = ExtensionSignature.FirstOrDefault(pair => signature.Contains(pair.Value)).Key;
        switch (extension)
        {
            case Extensions.Unknown:
                return string.Empty;
            case Extensions.DocOrXls:
                if (bytes.Length < 512)
                    break;
                signatureBytes = new byte[4];
                Array.Copy(bytes, 512, signatureBytes, 0, signatureBytes.Length);
                signature = BitConverter.ToString(signatureBytes);
                if (signature == "EC-A5-C1-00")
                    return ".doc";
                return ".xls";
            case Extensions.Pdf:
                return ".pdf";
            case Extensions.Jpg:
                return ".jpg";
            case Extensions.Png:
                return ".png";
            case Extensions.DocxOrXlsx:
                string fileBody = Encoding.UTF8.GetString(bytes);
                if (fileBody.Contains("word"))
                    return ".docx";
                if (fileBody.Contains("xl"))
                    return ".xlsx";
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
        return string.Empty;
    }
    
    

  • 답변 # 2

    어떤 종류의 파일인지 정확히 알기 위해서는 파일 헤더 바이트를 읽어야합니다.

    이 라이브러리의 FileTypeDetective는 원하는 것을 정확하게 수행하지만 프로젝트가 더 이상 활성화되지 않은 것처럼 보입니다. 어쨌든 아이디어를 얻으면 쉽게 적용하고 수정할 수 있습니다.

    참조 :

    // MS Office files
            public readonly static FileType WORD = new FileType(new byte?[] { 0xEC, 0xA5, 0xC1, 0x00 }, 512, "doc", "application/msword");
            public readonly static FileType EXCEL = new FileType(new byte?[] { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00 }, 512, "xls", "application/excel");
            public readonly static FileType PPT = new FileType(new byte?[] {0xFD, 0xFF, 0xFF, 0xFF, null, 0x00, 0x00, 0x00  }, 512, "ppt", "application/mspowerpoint");
    
    

    해야 할 일은 모든 Excel 파일에서 공통 서명을 찾는 것입니다.

    내 생각 엔이 라이브러리가 여전히 잘 작동한다는 것입니다. 이 헤더가 2012 년 이후 (마지막 릴리스) 변경된 이유는 없습니다.

  • 답변 # 3

    try-catch 를 만들 수 있습니다  문을 열고 Excel에서 파일을 열 수 있는지 확인하십시오.

    using Microsoft.Office.Interop.Excel;
    ....
    try
    {
        Application app = new Application();
        Workbook book = app.Workbooks.Open(@workbookPath); //@workbookpath is the file path
    }
    catch
    {
        //Excel encountered an error opening the file at the path
    }
    
    

관련 자료

  • 이전 internationalization - Rails I18n의 yml 파일에서 모든 번역을 검색하는 방법
  • 다음 numpy - 파이썬에서 SVD MemoryError