2015-10-12 19 views
14

Tôi đang phát triển một ứng dụng nơi bạn có thể xuất một số dữ liệu sang tệp Excel bằng OpenXML. Mọi thứ đều hoạt động tốt ngoại trừ bộ lọc tự động. Ý tưởng là thêm bộ lọc tự động vào phần chính của dữ liệu để người dùng tự động có các điều khiển để lọc và sắp xếp dữ liệu. Vì vậy, trong mã, tôi làm điều gì đó như thế này:Thêm tính năng tự động lọc và sắp xếp khiến Excel gặp sự cố

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

Trong XLSX xuất khẩu nó xuất hiện một cái gì đó như thế này:

<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" /> 

Và nó được thêm vào bảng tính giữa sheetDatamergeCells.

Sau đó tôi có thể mở bộ lọc này trong Excel và hoạt động tốt. Mong đợi nếu bạn cố gắng sắp xếp một cột, cột sắp xếp và sau đó Excel gặp sự cố. Lưu và tải lại tệp (buộc Excel làm sạch mọi thứ) không khắc phục được sự cố. Tuy nhiên, nếu bạn áp dụng bộ lọc trước tiên (hãy lọc cột thành > 10, sau đó xóa bộ lọc đó, bạn có thể sắp xếp mà không bị lỗi. Tôi đã lưu tệp sau khi áp dụng bộ lọc và xóa bộ lọc đó và bây giờ tệp đó là tốt, nhưng hãy xem XML của tệp "đã được sửa chữa", tôi không thấy bất kỳ sự khác biệt rõ ràng nào.

Có ai có ý tưởng gì có thể gây ra sự cố không? Tôi có thể làm gì khác khi áp dụng bộ lọc tự động thay vì chỉ thêm nó vào bảng tính

Lưu ý: Chúng tôi đang sử dụng Excel 2010 (phiên bản 14.0.7153.5000)

Dưới đây là một ví dụ file (bấm tải về và nó sẽ tải về như một .zip. Đổi tên thành .xlsx để mở trong Excel. Bật chỉnh sửa, chọn một trong các cột và cố gắng sắp xếp).

Chỉnh sửa: chơi xung quanh với điều này một số chi tiết. Nếu bạn lưu tệp trong Excel, tệp vẫn bị hỏng. Tuy nhiên, nếu bạn lần đầu tiên áp dụng một bộ lọc (và sau đó xóa nó) và sau đó resave trong Excel, bạn nhận được một tập tin làm việc. Nhìn sâu hơn về hai tập tin (file resaved vẫn bị phá vỡ và các tập tin hiện đang làm việc), tôi nhận thấy chút thêm này được bổ sung vào bảng tính sau khi lọc được áp dụng (và xóa):

<x:definedNames> 
    <x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 
    </x:definedNames> 

Không chắc rằng có thể là một cái gì đó hay không ...

+0

@mason: OpenXML cho phép bạn tạo tệp Excel không hợp lệ mọi lúc. Bởi vì các quy tắc cho một tệp Excel hợp lệ là chặt chẽ hơn (và hoàn toàn không có giấy tờ) so với các quy tắc cho một tệp OpenXML hợp lệ (ví dụ, không có gì trong tiêu chuẩn ra lệnh cho trẻ em dưới 'bảng tính ', nhưng Excel rất kén chọn nên xuât hiện). Thông thường Excel phàn nàn (với một thông báo lỗi rất vô ích) khi bạn lần đầu tiên mở tệp. Nhưng tập tin này sẽ mở ra tốt và vấn đề chỉ bật lên nếu bạn cố gắng sắp xếp một cột. –

+0

Thứ tự các yếu tố của bạn có vẻ chính xác (xem [answerFilter answer here] của tôi (http://stackoverflow.com/a/25410242/3791802) cho tài liệu đơn đặt hàng). Vấn đề duy nhất được báo cáo bởi công cụ Năng suất là một trong các phần tử 'Màu' trên một' Phông chữ' không đúng - tôi có [một câu trả lời khác] (http://stackoverflow.com/questions/29989234/change-sheet-tab-color -of-excel-file-using-open-xml/29991215 # 29991215) có thông tin về 'Color's nhưng tôi nghi ngờ nó sẽ giúp vấn đề này. Tôi sẽ xem xét và xem liệu tôi có thể tìm ra bất cứ điều gì ... – petelids

+0

@petelids: Cảm ơn bạn đã xem xét và cảm ơn những người đứng đầu về vị trí thực sự được chỉ định. Tôi đã không nhận ra rằng đã có và nó có thể giúp tôi tiết kiệm rất nhiều đau buồn. –

Trả lời

4

Ok, vậy có vẻ như công thức kỳ diệu ở đây là để thêm phần DefinedNames như tôi đề nghị trong biên tập của tôi:

<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 

Rõ ràng _xlmn._FilterDatabase là cần thiết cho AutoFilter để công việc (ít nhất là để phân loại). Tôi đoán nếu nó không có khi bạn lọc, nó được tạo ra, nhưng nếu nó không có khi bạn sắp xếp, nó thổi lên Excel. .

Vì vậy, bạn cần có tên này và các tham chiếu ô để điền vào nó trong

Nhìn qua các tiêu chuẩn Open XML, trong phần 18.2.5 của definedName, tôi thấy điều này:

Lọc & nâng cao Lọc

_xlnm. Tiêu chí: tên được xác định này đề cập đến một dải có chứa các giá trị tiêu chí để được sử dụng trong việc áp dụng bộ lọc nâng cao cho một dải dữ liệu.

_xlnm ._FilterDatabase: có thể là một trong số sau đây

a. tên được xác định này đề cập đến phạm vi mà bộ lọc nâng cao đã được áp dụng . Điều này thể hiện phạm vi dữ liệu nguồn, chưa được lọc.

b. Tên được xác định này đề cập đến phạm vi mà Tự động lọc đã được áp dụng .

Vì vậy, có vẻ như bạn cần thêm _xlnm._FilterDatabase cho mỗi trang có bộ lọc (xuất hiện không có cách nào để có nhiều bộ lọc trên một trang tính). Tên là giống nhau _xlmn_FilterDatabase bất kể bạn có bao nhiêu tờ với bộ lọc vì tôi đoán chỉ có sự kết hợp của tên và localSheetId cần phải là duy nhất.

Vì vậy, cuối cùng, tôi có một cái gì đó như thế này:

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}", 
    sheet.Name, 
    leftColumnLetter, 
    topRowIndex, 
    rightColumnLetter, 
    bottomRowIndex)) 
{ 
    Name = "_xlnm._FilterDatabase", 
    LocalSheetId = sheet.SheetId - 1, 
    Hidden = true 
}); 

này dường như như nó làm việc xung quanh một lỗi trong Excel. Excel nên kiểm tra xem tên được xác định trước khi sắp xếp và tạo nó tự động nếu cần (có vẻ như nó sẽ làm nếu bạn lọc thay vì sắp xếp).

+0

Cảm ơn rất nhiều! Tôi đã có cùng một vấn đề khi tạo ra một Excel trong javascript khi cố gắng để tăng cường thư viện ExcelBuilder. Điều đó đã làm các trick! – nbeuchat

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