2009-12-10 23 views
7

Có ai gặp vấn đề về hiệu năng khi xóa hàng đầu tiên trong tệp hàng hơn 20.000 hàng bằng cách sử dụng OpenXML SDK v2.0 không?Mở XML SDK v2.0 Vấn đề về hiệu suất khi xóa hàng đầu tiên trong 20.000+ hàng Tệp Excel

Tôi đang sử dụng mã hóa hàng xóa được đề xuất trong tài liệu SDK XML mở. Tôi mất vài phút để xóa hàng đầu tiên bằng cách sử dụng Open XML SDK, nhưng nó chỉ mất một giây trong ứng dụng Excel.

Tôi cuối cùng đã phát hiện ra rằng cổ chai thực sự là cách tiếp cận bong bóng khi xử lý xóa hàng. Có nhiều hàng cập nhật sau hàng đã xóa. Vì vậy, trong trường hợp của tôi, có khoảng 20.000 hàng được cập nhật, chuyển lên hàng dữ liệu theo hàng.

Tôi tự hỏi nếu có cách nào nhanh hơn để thực hiện xóa hàng.

Có ai có ý tưởng không?

Trả lời

4

Vâng, tin xấu ở đây là: yep, đó là cách nó là.

Bạn có thể có được hiệu suất tốt hơn một chút di chuyển bên ngoài của SDK mình thành System.IO.Packaging và chỉ cần tạo ra một IEnumerable/List trong như LINQ-to-XML của tất cả các hàng, sao chép mà đến một mới IEnumerable/List mà không hàng đầu tiên, viết lại thuộc tính r của <row r="?"/> để nó nằm trong chỉ mục, và viết lại vào bên trong <sheetData/> đối với trẻ em hiện có.

Bạn sẽ cần phải loại làm tương tự cho bất kỳ chuỗi trong sharedStrings.xml tập tin - tức là loại bỏ các yếu tố <ssi>.<si> rằng trong hàng đó đã bị xóa, nhưng trong trường hợp này họ đang ngầm được lập chỉ mục, vì vậy, bạn có thể thoát khỏi việc chỉ cần loại bỏ chúng.

0

Cách tiếp cận giải nén tệp, thao tác và đóng gói lại rất dễ bị lỗi.

Làm thế nào về điều này: Nếu bạn nói, nó hoạt động tốt trong Excel: Bạn đã thử sử dụng Interop chưa? Điều này bắt đầu một thể hiện mới của Excel (có thể nhìn thấy hoặc vô hình), sau đó bạn có thể mở tệp, xóa dòng, lưu và đóng lại ứng dụng.

using System; 
using System.IO; 
using Microsoft.Office.Interop.Excel; 
using Excel = Microsoft.Office.Interop.Excel; 
public void OpenAndCloseExcel() 
{ 
    Excel.Application excelApp = new Excel.Application(); 
    // Open Workbook, open Worksheet, delete line, Save 
    excelApp.Quit(); 
} 

Phạm vi đối tượng đủ điều kiện cho nhiều mục đích. Ngoài ra để xóa các phần tử. Hãy xem: MSDN Range-Description. Một gợi ý nữa: Interop sử dụng Excel, vì vậy tất cả các đối tượng phải được nhấn mạnh với chỉ mục dựa trên 1! Để biết thêm tài nguyên, hãy xem this StackOverflow-thread.

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