Thật không may, điều này có vẻ là một hạn chế lớn của EPPlus - bạn có thể tìm thấy những người khác đăng bài trên trang codeplex của họ. Tôi gặp vấn đề tương tự khi xuất tập dữ liệu lớn - các bảng đơn có chiều rộng 115+ cột và cao 60K + hàng. Thông thường khoảng 30 đến 35k hàng là khi nó hết bộ nhớ. Điều gì đang xảy ra là mỗi tế bào được tạo ra là nó sở hữu đối tượng đó là tốt cho tập dữ liệu nhỏ nhưng trong trường hợp của tôi nó sẽ là 115x60K = ~ 7 triệu. Vì mỗi ô là một đối tượng có nội dung (chủ yếu là chuỗi), dấu vết bộ nhớ của nó tăng nhanh.
Tại một thời điểm nào đó trong tương lai, kế hoạch của tôi là tạo tệp XML theo cách thủ công bằng cách sử dụng Linq2Xml. Một xlsx chỉ là một tệp zip được đổi tên thành các tệp XML tạo nên nội dung của sổ làm việc và trang tính. Vì vậy, bạn có thể tạo một xlsx trống bằng cách sử dụng EPP, lưu nó, mở nó như là một zip, kéo ra sheet1.xml và thêm nội dung dữ liệu thông qua thao tác chuỗi. Bạn cũng sẽ phải làm việc trên tệp sharedstring.xml mà Excel sử dụng để giúp giảm kích thước tệp. Có thể có các tệp xml khác cần cập nhật cũng như với các phím hoặc tên.
Nếu bạn đổi tên bất kỳ xlx nào thành đuôi .zip, bạn có thể thấy điều này.
Ví dụ sheet1.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<dimension ref="A1:C2"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="C5" sqref="C5"/>
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
<sheetData>
<row r="1" spans="1:3" x14ac:dyDescent="0.25">
<c r="A1" t="s">
<v>0</v>
</c><c r="B1" t="s">
<v>1</v>
</c><c r="C1" t="s">
<v>0</v>
</c>
</row>
<row r="2" spans="1:3" x14ac:dyDescent="0.25">
<c r="A2" t="s">
<v>1</v>
</c><c r="B2" t="s">
<v>0</v>
</c><c r="C2" t="s">
<v>1</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
Ví dụ sharedstrings.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="6" uniqueCount="2">
<si>
<t>AA</t>
</si>
<si>
<t>BB</t>
</si>
</sst>
Bạn có thể xem như thế nào tôi đã làm thao tác xml trong bài khác của tôi:
Create Pivot Table Filters With EPPLUS
Rất tiếc, tôi không thể cung cấp cho bạn câu trả lời hay hơn nhưng hy vọng điều đó sẽ hữu ích.
Bất kỳ documention rằng nó được cố định trong phiên bản beta 4? Nó không có gì khác biệt đối với tôi - đã được cấp này vài tháng trước. Rất thích nó cố định nhưng nó trông giống như nó đòi hỏi một đại tu chính của động cơ cốt lõi. Tôi luôn luôn sử dụng IDisposable (thông qua sử dụng) và nó không có sự khác biệt đối với tôi. Vấn đề là gói/sổ làm việc sẽ vẫn còn trong bộ nhớ cho đến khi đóng hoàn toàn. Tôi thậm chí đã từng cố gắng xuất dữ liệu bằng một loạt mở-lưu-đóng-mở lại-thêm và nó không có sự khác biệt. Đó là một điều tất cả hoặc không có gì - thời điểm bạn mở tập tin nó được tải. Một lần nữa, rất thích được chứng minh là sai. – Ernie
EPPlus 4.1.0 không giải quyết được. Và việc thuyên giảm không giúp ích gì nếu bạn chỉ có 1 trang tính để viết. – Heiner