2012-01-17 31 views
5

Tôi đã thực hiện một số tìm kiếm ở đây trên SO, trên this, this, this và nhiều hơn nữa, nhưng không có đầu mối, vì vậy tôi sẽ phải hỏi các bạn.Cách xác minh xem tệp có phải là bảng tính excel hợp lệ không?

Tôi đang cố gắng mở tệp Excel qua Interop và tôi đã cài đặt Office 2007, vì vậy tôi đang sử dụng Microsoft.Office.Interop.Excel phiên bản 14.0.

Khi tôi cố gắng mở tệp hợp lệ xls, mọi thứ đều ổn.

Nhưng nếu tôi cố gắng mở tệp không hợp lệ (như bitmap hoặc tệp thi hành) qua Interop, Excel sẽ mở tệp đó mà không có khiếu nại hoặc cảnh báo.

Làm thế nào tôi có thể phát hiện Excel có tệp sổ làm việc không hợp lệ được tải, mà không chặn cảnh báo?

Tôi đang cố viết một bài kiểm tra đơn vị của trình đọc đối tượng Excel của mình. Một trong những trường hợp là cố mở một tệp không hợp lệ.

Một số mã để giúp: Application Creation:

_app = new Application() 
     { 
      Visible = false, 
      DisplayAlerts = false,  // <-- I don't want to remove this. 
      AskToUpdateLinks = false, 
     }; 

Workbook mở:

_workbooks.Open(filename); 
    _workbook = _workbooks.get_Item(1); // 1-based. 
    _worksheets = _workbook.Sheets; 

EDIT: Chỉ cần thêm 1 thông tin: Excel tải các tập tin không hợp lệ. Nếu DisplayAlerts được thiết lập là true, nó than phiền (mở một hộp thoại) thông báo cho workbook dường như bị hỏng, nhưng nếu DisplayAlerts được thiết lập là false, nó tải các tập tin giống như dưới đây:

Excel Loads Invalid File

+0

cũng có một cách để kiểm tra tệp ext .csv hoặc xls hợp lệ có vẻ là cách tiếp cận đơn giản nhất ... – MethodMan

+0

Bạn có thể thấy thuộc tính _app.Ready chuyển thành false khi tải tệp không hợp lệ. Chỉ là một ý nghĩ tôi đã không thử nó. – Tod

+0

@DJ KRAZE, tôi đã kiểm tra phần mở rộng trước khi tải tệp. Nhưng điều gì sẽ xảy ra nếu ai đó thay đổi phần mở rộng của tập tin và thử tải một tệp .exe thay thế? – Machado

Trả lời

8

Tôi vừa kết thúc bằng cách tiếp cận khác: Sổ làm việc Excel có thuộc tính được gọi là FileFormat. Khi Excel mở một tập tin không hợp lệ, nó đặt các định dạng tập tin đến một trong các giá trị điều tra viên của văn bản:

XlFileFormat.xlTextMac 
    XlFileFormat.xlTextMSDOS 
    XlFileFormat.xlTextPrinter 
    XlFileFormat.xlTextWindows 

Và bên trong liệt kê này Excel có hồ sơ hợp lệ (có giá trị cho mục đích của tôi):

XlFileFormat.xlExcel12 
    XlFileFormat.xlExcel7 
    XlFileFormat.xlExcel8 
    XlFileFormat.xlExcel9795 

Vì vậy, tôi đã kết thúc bằng một đơn giản "or" để lọc các loại tập tin tôi muốn nhập:

bool validFile = (f == XlFileFormat.xlExcel12 ) 
        || (f == XlFileFormat.xlExcel7 ) 
        || (f == XlFileFormat.xlExcel8 ) 
        || (f == XlFileFormat.xlExcel9795); 

Và bây giờ tôi t hoạt động. Cảm ơn các bạn đã giúp đỡ, bạn đặt tôi đi đúng hướng.

3

Bạn có thể kiểm tra số lượng bảng tính trước và sau khi tải tệp. Nếu cả hai số đều giống nhau, tệp không tải được.

int countBefore = _workbooks.get_Count(); 
_workbooks.Open(filename); 
int countAfter = _workbooks.get_Count(); 
if (countBefore == countAfter) { 
    // The file failed to load. 
} 
+0

Đẹp! Nhưng đếm số tiền 1, vì RAM TCHAN! Excel tải tệp không hợp lệ.Nhưng nó không giống như một bảng tính, bởi vì Excel tải nội dung của tệp một cách kỳ lạ. Hãy xem chỉnh sửa, xin vui lòng. – Machado

Các vấn đề liên quan