2012-06-18 12 views
32

Tôi đang cố gắng tạo tệp xlsx theo chương trình trên iOS. Vì dữ liệu nội bộ của các tệp xlsx về cơ bản được lưu trữ trong các tệp xml riêng biệt, tôi đã cố gắng tạo lại cấu trúc xlsx với tất cả các tệp và thư mục con của nó, nén chúng thành tệp zip và đặt phần mở rộng của nó thành xlsx. Tôi sử dụng trình phân tích cú pháp/trình ghi GDataXML để tạo tất cả các tệp xml cần thiết. Tuy nhiên, tệp tôi nhận được không thể mở dưới dạng tệp xlsx. Ngay cả khi tôi trích xuất tất cả dữ liệu từ tệp xlsx hợp lệ, hãy tạo tất cả các tệp xml theo cách thủ công bằng cách sao chép dữ liệu từ tệp xml gốc và nén chúng theo cách thủ công, tôi không thể tạo lại tệp xlsx hợp lệ.Làm thế nào để lắp ráp đúng một tệp xlsx hợp lệ từ các thành phần phụ bên trong của nó?

Các câu hỏi là:

  • là xlsx thực sự chỉ là một kho lưu trữ có chứa các file xml?
  • làm cách nào để tạo tệp xlsx hợp lệ theo chương trình nếu tôi không thể nén tệp xml thành tệp zip và đặt tiện ích mở rộng của tệp thành xlsx?

Trả lời

40

Trong câu trả lời cho câu hỏi của bạn:

  1. XLSX chỉ là một bộ sưu tập các tập tin XML trong một container zip. Không có phép thuật nào khác.
  2. Nếu bạn giải nén/giải nén tệp XLSX hợp lệ và sau đó recompress/zip nó và bạn không thể đọc kết quả đầu ra thì vấn đề với phần mềm nén. Hãy thử một thư viện/tiện ích khác hoặc kiểm tra loại và mức độ nén mặc định mà nó sử dụng và thử kết hợp nó với bất kỳ Excel nào sử dụng. Hoặc kiểm tra tệp zip để đảm bảo cấu trúc thư mục được duy trì.

Ví dụ về các nội dung của một file xlsx:

unzip -l example.xlsx 
Archive: example.xlsx 
    Length  Date Time Name 
-------- ---- ---- ---- 
     769 10-15-14 09:23 xl/worksheets/sheet1.xml 
     550 10-15-14 09:22 xl/workbook.xml 
     201 10-15-14 09:22 xl/sharedStrings.xml 
     ... 

Tôi thường xuyên giải nén file XLSX, làm cho những thay đổi nhỏ để thử nghiệm và tái nén chúng mà không cần bất kỳ vấn đề.

Cập nhật: Điều quan trọng là tránh nén thư mục gốc. Dưới đây là một ví dụ sử dụng tiện ích zip hệ thống trên Linux hoặc OS X:

# Unzip an xlsx file into a directory. 
unzip example.xlsx -d newdir 

# Make some valid changes to the files. 
cd newdir/ 
vi xl/worksheets/sheet1.xml 

# Rezip the files *FROM* the unzipped directory. 
# Note: you could also re-zip to the original file if required. 
find . -type f | xargs zip ../newfile.xlsx 

# Check the file looks okay. 
cd .. 
unzip -l newfile.xlsx 
xdg-open newfile.xlsx 
+1

Phiên bản 7 zip 9,20 không thực hiện công việc. Bạn sử dụng phần mềm nào có giá trị mặc định chính xác cho xlsx của Office? –

+5

7-zip phiên bản 9,20 đã làm các trick, nhưng như David nói, chúng tôi sẽ không thực hiện một zip với thư mục mẹ. Mã zip (sẽ được đổi tên thành xslx) phải có trực tiếp các thư mục _rels, docProps và xl. –

+2

Tôi đã thêm một ví dụ. – jmcnamara

27

Nếu tôi giải nén một file xlsx vào một thư mục và sau đó tôi nén lại nó một lần nữa, xlsx trở nên tham nhũng/không được công nhận. Trong trường hợp của tôi, nguyên nhân là công cụ zip của tôi đang sử dụng tên thư mục làm cấp độ đầu tiên cho đường dẫn tương đối của từng tệp trong zip.

Tôi đã giải quyết được sự cố bằng cách tạo tệp zip trống trong thư mục có nội dung xlsx rồi thêm tất cả các tệp và thư mục vào đó.

Thực ra, nếu bạn cố nén chính thư mục, tệp không phải là xlsx hợp lệ. Bạn nên đi vào bên trong thư mục, chọn tất cả nội dung và sau đó nhấp chuột phải vào & zip.

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