2010-09-30 31 views
5

Tôi có mã sau để mở tệp mẫu Excel và lưu tệp đó dưới dạng tệp .xlsx và tôi gặp lỗi bên dưới khi tôi cố gắng mở tệp mới. Xin hãy giúp giải quyết vấn đề này.Mở XML SDK - Lưu tệp mẫu (.xltx thành .xlsx)

Excel không thể mở tệp ‘sa123.xlsx’ do định dạng tệp hoặc tiện ích không hợp lệ. Xác minh rằng tệp không bị hỏng và tệp mở rộng khớp với định dạng tệp.

 string templateName = "C:\\temp\\sa123.xltx"; 
     byte[] docAsArray = File.ReadAllBytes(templateName); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      stream.Write(docAsArray, 0, docAsArray.Length); // THIS performs doc copy 
      File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray());  
     } 

Trả lời

7

Để thực hiện việc này, bạn cần phải sử dụng số Open XML SDK 2.0. Dưới đây là một đoạn mã mà làm việc cho tôi khi tôi đã thử nó:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\sa123.xltx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true)) 
    { 
     // Change from template type to workbook type 
     spreadsheetDoc.ChangeDocumentType(SpreadsheetDocumentType.Workbook); 
    } 
    File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray()); 
} 

gì mã này làm là phải mất tập tin mẫu của bạn và mở nó thành một đối tượng SpreadsheetDocument. Loại đối tượng này là Template, nhưng vì bạn muốn nó là Workbook, bạn gọi phương thức ChangeDocumentType để thay đổi từ Template thành Workbook. Điều này sẽ làm việc vì XML cơ bản là giống nhau giữa tệp .xltx và tệp .xlsx và đó chỉ là loại đã gây ra sự cố cho bạn.

+0

Cảm ơn bạn. Những sự giúp đỡ đó. –

1

Excel thấy phần mở rộng .xlsx và cố gắng mở tệp dưới dạng tệp bảng tính. Nhưng không phải vậy. Đó là một tệp mẫu. Khi bạn có một mẫu mở trong Excel và lưu nó dưới dạng tệp .xlsx, nó chuyển đổi nó thành định dạng trang tính. Những gì bạn đang làm cũng giống như thay đổi phần mở rộng trong tên tệp. Hãy thử nó trong Windows Explorer và bạn sẽ nhận được kết quả tương tự.

Tôi tin rằng bạn sẽ có thể thực hiện những gì bạn muốn bằng cách sử dụng Excel Object Model. Tôi đã không sử dụng điều này mặc dù.

+0

Bất kỳ ý tưởng nào tôi nên làm để bí mật/lưu nó ở định dạng trang tính trong mã ở trên. –

+0

@SA. Tôi đã chỉnh sửa bằng câu trả lời để bao gồm câu trả lời cho câu hỏi của bạn. – YWE

+0

Đoạn đầu tiên của bạn là một lời giải thích tốt về vấn đề này, nhưng đề xuất ai đó sử dụng interop excel để giải quyết vấn đề này là cách quá mức cần thiết. –

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