2015-09-24 26 views
5

Tôi đang tạo một chuỗi Sổ làm việc Excel bằng EPPlus v3.1.3. Khi tôi mở các tập tin mới được tạo ra, nếu tôi đóng nó mà không chạm vào bất cứ điều gì nó hỏi tôi nếu tôi muốn lưu các thay đổi của tôi. Điều duy nhất tôi đã nhận thấy những thay đổi nếu tôi nói "có" là tệp app.xml hơi bị thay đổi - không có sự khác biệt rõ ràng trong sổ làm việc và phần còn lại của tệp XML giống nhau. Tôi đã thử cả hai cách tiếp cận:Đã Nhắc Lưu Thay đổi trên tệp được tạo bằng EPPlus

ExcelPackage p = new ExcelPackage(new FileInfo(filename)); 
p.Save(); 

cũng như

ExcelPackage p = new ExcelPackage(); 
p.SaveAs(new FileInfo(filename)); 

và cả hai đều có cùng một vấn đề. Có cách nào để có tệp output.xml trong dạng cuối cùng của nó không?

Lý do đây là vấn đề là vì chúng tôi sử dụng chương trình SAS cho QC và khi chương trình SAS mở tệp khi chúng được xuất trực tiếp từ chương trình EPPlus, nó không nhận các giá trị từ các ô có công thức trong chúng. Nếu nó được mở ra và "có" được chọn cho "bạn có muốn lưu thay đổi", nó hoạt động tốt. Tuy nhiên, khi chúng tôi đang tạo ra hàng trăm trong số này, đó là không thực tế.

Ngoài ra, tôi đang sử dụng mẫu. Mẫu xuất hiện bình thường.

Điều đặc biệt lạ là chúng tôi đã sử dụng hệ thống này trong hơn một năm và đây là lần đầu tiên chúng tôi gặp sự cố này.

Có cách nào xung quanh vấn đề này không? Trên cả hai bên C# hoặc SAS?

+0

Bạn đã vô tình tắt tính toán công thức trong Excel chưa? Bạn có thể xác nhận xem đây có phải là sự cố từ một máy khác không? –

+0

Tính toán công thức được bật và Chế độ xem được bảo vệ bị tắt. Tôi đã thử trên hai máy khác nhau. – yammerade

Trả lời

2

Điều bạn đang thấy không thực sự khác thường. Epplus không thực sự tạo ra một tệp XLSX đầy đủ - thay vào đó nó tạo ra nội dung XML thô (tất cả các định dạng tài liệu Office 2007 dựa trên xml) và đặt nó trong tệp zip được đổi tên thành XLSX. Vì nó chưa được chạy qua công cụ Excel nên nó chưa được định dạng đầy đủ để vượt trội so với ý thích.

Nếu đó là một bảng dữ liệu đơn giản thì rất có thể Excel không phải thực hiện nhiều phép tính - chỉ là định dạng cơ bản. Vì vậy, trong trường hợp đó nó sẽ không nhắc bạn lưu lại. Nhưng ngay cả sau đó nếu bạn làm bạn sẽ thấy nó thay đổi tập tin XLSX một chút. Nếu bạn thực sự muốn xem những gì nó đang làm đằng sau hậu trường đổi tên tệp thành .zip và xem các tệp xml bên trong trước và sau.

Sự cố bạn đang gặp phải là vì nó không chỉ là một bảng xuất Excel đơn giản phải chạy các phép tính khi được mở lần đầu tiên. Điều này có thể được nhiều thứ - công thức, autofilters, auto cột/hàng chiều cao adustments, phác thảo, vv Về cơ bản, bất cứ điều gì mà sẽ làm cho tờ trông một chút "khác nhau" sau khi excel được thực hiện với nó.

Thật không may, không có cách khắc phục dễ dàng cho việc này. Chạy nó thông qua DOM của excel bằng cách nào đó sẽ đơn giản nhất mà tất nhiên đánh bại mục đích của việc sử dụng EPPlus. Điều khác bạn có thể làm là thấy sự khác biệt giữa trước và sau của các tập tin xml (và có một bó trong đó bạn sẽ phải xem xét) và bắt chước những gì excel sẽ thay đổi/thêm vào "sau" phiên bản tập tin bằng cách chỉnh sửa thủ công nội dung XML. Đây không phải là một lựa chọn rất đẹp tùy thuộc vào cách mở rộng các thay đổi. Bạn có thể thấy làm thế nào tôi đã làm nó trong những tình huống khác tại đây:

Create Pivot Table Filters With EPPLUS

Adding a specific autofilter on a column

Set Gridline Color Using EPPlus?

+0

Cảm ơn. Tôi nghĩ đây sẽ là câu trả lời nhưng tôi hy vọng có một cách giải quyết đơn giản hơn. Tôi nghĩ rằng tôi sẽ chuyển tất cả các tính toán ra khỏi Excel để chúng tôi không đánh bom hệ thống QC của mình. – yammerade

+0

@LisaMcCusker Chắc chắn rồi. Một lựa chọn khác mà tôi quên đề cập đến là VBA. Bạn có thể di chuyển logic vi phạm sang một macro mà sẽ kích hoạt khi trang tính đầu tiên mở ra trong Excel và sau đó tự lưu lại mà không có VBA. Ngoài ra không phải là cách sạch nhất để đi về nó, nhưng figured tôi sẽ đề cập đến nó. Xem tại đây: http://stackoverflow.com/questions/26734787/epplus-pivot-table-copy-values-to-new-sheet/26736549#26736549. – Ernie

1

Tôi chạy vào vấn đề này cùng sử dụng EPPlus (phiên bản 4.1.0, fyi) và tìm thấy thêm mã sau đây trước khi đóng cố định sự cố:

p.Workbook.Calculate(); 
p.Workbook.FullCalcOnLoad = false; 
Các vấn đề liên quan