2015-02-10 14 views
9

Chúng tôi tạo một loạt các báo cáo cho bảng tính Excel bằng EPPlus.Khi cố gắng đóng bảng tính, Excel sẽ yêu cầu người dùng lưu thay đổi

Thông thường mã đi một cái gì đó như thế này:

var workbookFile = new FileInfo(reportFile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    var wb = excel.Workbook; 
    var ws = wb.GetCleanWorksheet("Report"); 
    ws.Select(); 

    // write data to sheet 
    ws.Cells[1, 1].Value = "foo"; 

    excel.Save(); 
} 

Khi người dùng mở các bảng tính, mọi thứ có vẻ tốt đẹp. Khi họ cố gắng đóng bảng tính mà không thực hiện bất kỳ thay đổi nào, Excel sẽ hỏi họ có muốn lưu thay đổi của họ hay không. Đây không phải là một thỏa thuận quá lớn nhưng nó gây phiền nhiễu và hơi đáng lo ngại.

Tôi đã mở các bảng tính trong Công cụ năng suất SDK OpenXML và chúng vượt qua xác thực trong đó.

+1

https://epplus.codeplex.com/discussions/230017 –

+2

Cảm ơn cho việc tìm kiếm đó. Bạn muốn thực hiện một câu trả lời nhanh chóng để tôi có thể chấp nhận nó? (Trừ khi ai đó muốn làm cho một câu trả lời thấu đáo hơn mà có thể tạo ra các kết quả công thức lưu trữ và dính chúng vào XML trực tiếp ...) – Coxy

+0

Nó sẽ luôn luôn yêu cầu bạn lưu các thay đổi ngay cả khi có none nếu bạn có các tế bào liên kết lấy giá trị từ một tài liệu khác. Nó đếm cập nhật ô như thay đổi giá trị, và nếu một vài trường hợp khác tôi không nhớ. – helena4

Trả lời

6

Dưới đây là một phản ứng với một câu hỏi tương tự đã trả lời bằng cách hỗ trợ của Microsoft tại http://support.microsoft.com/kb/213428 "Để buộc một workbook để đóng mà không lưu bất kỳ thay đổi, gõ đoạn mã sau vào một mô-đun Visual Basic của workbook rằng:

Sub Auto_Close ()

ThisWorkbook.Saved = True

End Sub

Bởi vì tài sản đã lưu được thiết lập là True, Excel phản ứng như thể workbook có đã được lưu và không có thay đổi nào xảy ra kể từ lần lưu cuối cùng. "

Hy vọng điều đó sẽ hữu ích.

2

Một giải pháp sẽ là thực hiện phong cách ninja open-save-close với Interop Excel sau khi bạn lưu tệp bằng EPPlus. Một cái gì đó như:

using Excel = Microsoft.Office.Interop.Excel; 

var workbookFile = new FileInfo(reportFile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    var wb = excel.Workbook; 
    var ws = wb.GetCleanWorksheet("Report"); 
    ws.Select(); 

    // write data to sheet 
    ws.Cells[1, 1].Value = "foo"; 

    excel.Save(); 
} 
Excel.Application _Excel = null; 
Excel.Workbook WB = null; 
try 
{ 

    _Excel = new Microsoft.Office.Interop.Excel.Application(); 
    WB = _Excel.Workbooks.Open(reportFile); 
    _Excel.DisplayAlerts = false; 
    WB.Close(true); 
} 
catch (Exception ex) 
{ 
    WB.Close(false); 
} 
finally 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WB); 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_Excel); 
} 
+0

Cả hai câu trả lời của bạn và @thatkindofmatt đều phụ thuộc vào Interop :( –

+0

Bạn không chắc chắn nếu bạn có thể vượt qua nó mà không thực sự mở Excel dựa trên nhận xét liên kết trong bài đăng gốc .... có thể giải pháp tốt hơn sẽ không sử dụng công thức. .. – Tyress

2

Tôi không chắc chắn về EPPLus, nhưng Excel Interop sẽ cho phép bạn tắt tiếng những cảnh báo đó.

var xlApp = new Excel.Application(); 
xlApp.DisplayAlerts = false; 

Excel sau đó sẽ chọn phản hồi mặc định.

+0

Nó sẽ được tốt đẹp .. nhưng ngày nay để chạy Interop trong máy chủ là cần thiết để thay đổi một số tài sản bảo mật ... thậm chí Microsoft khuyến cáo không sử dụng nó: ( –

1

Thử nâng cấp lên phiên bản mới nhất. Kể từ phiên bản 4.0.4.0, điều này dường như không phải là vấn đề với các trang tính đơn giản. Cú pháp có một chút khác biệt mặc dù:

var workbookFile = new FileInfo(reportfile); 
using (var excel = new ExcelPackage(workbookFile)) 
{ 
    ExcelWorksheet ws = excel.Workbook.Worksheets.Add("Report"); 
    ws.Cells[1, 1].Value = "foo"; 
    excel.Save(); 
} 

Excel không yêu cầu tôi lưu bất kỳ thứ gì (trừ khi tôi thay đổi thứ gì đó). Lưu ý rằng vì tệp không chạy qua Excels DOM, hành vi mà bạn thấy vẫn có phần được mong đợi trong các sổ làm việc phức tạp, vì Excel sẽ áp dụng định dạng riêng của nó, nhưng tôi không thấy nó trong các trang tính đơn giản nữa.

1

Bật "DisplayAlerts" tắt khi đóng cửa. Điều này có thể được thực hiện với một kịch bản VBA tích hợp. Chỉ cần thêm đoạn mã sau (workbook là bảng tính hiện tại của bạn):

workbook.CreateVBAProject(); 
workbook.CodeModule.Name = "DisplayAlertsOff"; 
StringBuilder sb = new StringBuilder(); 
sb.AppendLine("Sub CloseBook()"); 
sb.AppendLine(" Application.DisplayAlerts = False"); 
sb.AppendLine(" ActiveWorkbook.Close"); 
sb.AppendLine(" Application.DisplayAlerts = True"); 
sb.AppendLine("End Sub"); 
workbook.CodeModule.Code = sb.ToString(); 
Các vấn đề liên quan