Làm cách nào tôi có thể ngăn Excel ăn các tệp CSV ngon lành của mình và bài tiết dữ liệu vô dụng?


128

Tôi có một cơ sở dữ liệu theo dõi doanh số của các vật dụng theo số sê-ri. Người dùng nhập dữ liệu và số lượng người mua và quét từng tiện ích vào một chương trình khách hàng tùy chỉnh. Sau đó họ hoàn tất đơn hàng. Tất cả điều này hoạt động hoàn hảo.

Một số khách hàng muốn có bảng tính tương thích với Excel của các vật dụng họ đã mua. Chúng tôi tạo ra điều này với một tập lệnh PHP truy vấn cơ sở dữ liệu và đưa ra kết quả dưới dạng CSV với tên cửa hàng và dữ liệu liên quan. Điều này cũng hoạt động hoàn toàn tốt.

Khi được mở trong trình soạn thảo văn bản như Notepad hoặc vi, tệp sẽ trông như thế này:

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

Như bạn có thể thấy, các số sê-ri có mặt (trong trường hợp này là hai lần, không phải tất cả các sê-ri thứ cấp đều giống nhau) và là các chuỗi số dài. Khi tệp này được mở trong Excel, kết quả sẽ trở thành:

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

Như bạn có thể đã quan sát, các số sê-ri được bao quanh bởi dấu ngoặc kép. Excel dường như không tôn trọng vòng loại văn bản trong các tệp .csv. Khi nhập các tệp này vào Access, chúng tôi không gặp khó khăn gì. Khi mở chúng dưới dạng văn bản, không có rắc rối nào cả. Nhưng Excel, không có lỗi, chuyển đổi các tệp này thành rác vô dụng. Cố gắng hướng dẫn người dùng cuối trong nghệ thuật mở tệp CSV bằng ứng dụng không mặc định đang trở nên mệt mỏi. Có hy vọng không? Có cài đặt nào tôi không thể tìm thấy không? Đây có vẻ là trường hợp của Excel 2003, 2007 và 2010.


46
Tôi có thể cung cấp +1 cho tên không?
Tombull89

11
Excel does not seem to respect text qualifiers in .csv files- dấu ngoặc kép không phải là vòng loại văn bản, chúng chỉ đơn giản cho phép dấu phẩy trong dữ liệu của bạn, nếu bạn không sử dụng dấu phẩy trong dữ liệu của mình thì chúng là vô nghĩa . Tất cả dữ liệu trong tệp CSV không được nhập, do đó Excel chỉ có thể đoán rằng số sê-ri lớn của bạn là một số và đó là khi bạn chạy đến độ chính xác tối đa 15 chữ số của Excel , đó là số bị cắt bớt số của bạn.
DMA57361

1
Excel dường như không tôn trọng tất cả các dấu phẩy trong dấu ngoặc kép. Hãy xem xét "ngày 12 tháng 8 năm 2012" Excel cũng biến nó thành rác.
zundarz

5
Tôi muốn đề cập đến câu hỏi SU này . Nó giải thích những tùy chọn bạn có khi xử lý CSV trong Excel.
nixda

1
@nixda Cảm ơn! Đó là những gợi ý hữu ích, đặc biệt là cho người dùng có nhiều kinh nghiệm hơn. Vấn đề của tôi gần như là vấn đề của con người, trong đó Excel liên kết chính nó với các tệp .csv và mọi người nhìn thấy biểu tượng và nhấp đúp chuột (vì đó là cách bạn mở mọi thứ), và sau đó thường nhấn Save (vì chúng tôi luôn nói họ để tiết kiệm!), và tất cả đã mất. Nhưng tôi chắc chắn sẽ sử dụng phương pháp của bạn khi có thể.
atroon

Câu trả lời:


58

Nhưng Excel, không có lỗi, chuyển đổi các tệp này thành rác vô dụng.

Excel là rác vô dụng.

Giải pháp

Tôi sẽ hơi ngạc nhiên nếu bất kỳ khách hàng nào muốn dữ liệu của bạn ở định dạng Excel không thể thay đổi định dạng hiển thị trên ba cột đó thành "Số" với số thập phân bằng 0 hoặc "văn bản". Nhưng hãy giả sử rằng một tài liệu hướng dẫn ngắn ra khỏi câu hỏi.

Lựa chọn của bạn là:

  1. Bỏ một ký tự không phải là số, không phải khoảng trắng vào số sê-ri của bạn.
  2. Viết ra một tệp xls hoặc tệp xlsx với một số định dạng mặc định.
  3. Cheat và xuất các số đó dưới dạng công thức ="268435459705526269","",="268435459705526269"(bạn cũng có thể ="268435459705526269",,="268435459705526269"tự lưu 2 ký tự). Điều này có lợi thế là hiển thị chính xác và có thể nói chung là hữu ích, nhưng bị phá vỡ một cách tinh tế (vì chúng là công thức).

Hãy cẩn thận với tùy chọn 3, vì một số chương trình (bao gồm Excel & Open Office Calc), sẽ không còn coi dấu phẩy bên trong =""các trường là thoát. Điều đó có nghĩa là ="abc,xyz"sẽ kéo dài hai cột và phá vỡ nhập khẩu.

Sử dụng định dạng "=""abc,xy"""giải quyết vấn đề này, nhưng phương pháp này vẫn giới hạn bạn ở mức 255 ký tự do giới hạn độ dài công thức của Excel.


1
Trên thực tế, đó không phải là khắc nghiệt. Sao chép và dán một trong các số trên vào Excel, sau đó thay đổi định dạng số theo đề xuất. Excel thay đổi giá trị, dẫn đến rác.
Joe Internet

1
@Joe, tôi đã quá khó hiểu về cái nhìn tổng quan ban đầu của tôi. Excel thực sự đang tạo ra rác và chính nó là rác. Tôi đã cập nhật câu trả lời của mình để phản ánh điều đó. Một tùy chọn có thể có "Excel csv" và cũng có "csv có thể sử dụng được" đáng giá
Tyler

2
@Tyler - Tôi không nghĩ Excel là rác, chỉ nói rằng OP đã đúng rằng nó đang tạo ra rác trong trường hợp này. Đây thực sự là một câu hỏi hay, không có giải pháp có vẻ thanh lịch.
Joe Internet

1
Tùy chọn Format Cells ... đã được đề xuất và tôi đã thử sử dụng nó. Trong trường hợp này, thời điểm bạn mở tệp, Excel dường như chuyển đổi các chuỗi thành ký hiệu Khoa học (đã đồng ý, không bất ngờ) và đưa ra độ chính xác. Khi bạn thay đổi chúng thành một số hoặc thành văn bản, chuỗi không quay trở lại. Đó thực sự là bản chất của vấn đề. Xuất ra như các công thức có thể làm điều đó mặc dù ... Tôi đã không nghĩ về điều đó.
atroon

9
@ DMA57361 Hành vi không được mong đợi, nó có thể xác định được. Độ chính xác số được ghi lại rõ ràng, làm thế nào excel đọc CSV không. Việc thiếu cảnh báo và âm thầm loại bỏ dữ liệu là vô lý. Việc bạn thậm chí không thể nói với Excel cách nhập dữ liệu cũng vô lý như vậy. Là tiêu cực cần thiết ? Không, nhưng trung thực là chính sách tốt nhất và đó là cảm giác của tôi.
Tyler

42

Chúng tôi đã gặp một vấn đề tương tự khi chúng tôi có các tệp CSV với các cột chứa các phạm vi như 3-5 và Excel sẽ luôn chuyển đổi chúng thành ngày, ví dụ 3-5 sẽ là 3 tháng 3, sau đó việc chuyển đổi lại thành số đã cho chúng tôi một số nguyên ngày vô dụng. Chúng tôi đã khắc phục nó bằng cách

  1. Đổi tên phần mở rộng CSV thành TXT
  2. Sau đó, khi chúng tôi mở nó trong Excel, điều này sẽ khởi động trong trình hướng dẫn nhập văn bản
  3. Trong Bước 3 trên 3 trong trình hướng dẫn, chúng tôi đã nói với nó các cột trong câu hỏi là văn bản và chúng được nhập đúng.

Bạn có thể làm tương tự ở đây tôi sẽ nghĩ.

thuật sĩ nhập văn bản

Chúc mừng


2
+1 là cách chính xác để làm điều đó. (chỉnh sửa: xin lỗi phải chỉnh sửa một chút để làm rõ giải pháp)
jay

2
Bạn không phải đổi tên tập tin của bạn. Chỉ cần sử dụng trình hướng dẫn nhập Shift-select tất cả các cột và chọn làm văn bản.
nixda

1
Thuật sĩ nhập văn bản là câu trả lời. Tất cả các giải pháp khác là hack không cần thiết do không hiểu cách sử dụng Excel để xem và chỉnh sửa CSV.
Xuất sắc

1
@Excellll, làm cho nó một tập tin tại một thời điểm chắc chắn. Khi tự động hóa quá trình này, 'tin tặc không cần thiết' thường tiết kiệm trong ngày.
Chồng Parrish

1
điều này hoàn toàn vô dụng khi excel được người dùng tiêu chuẩn sử dụng để hiển thị các tệp CSV. trước khi tôi cố gắng giải thích cách sử dụng trình hướng dẫn nhập văn bản cho ~ 15 người dùng văn phòng kỹ năng mới bắt đầu, tôi muốn tự mình nhập mã nguồn tài liệu excel.
Northkildonan

8

Giải pháp tốt hơn là tạo ra Workbook XML. Như thế này:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

Tệp phải có phần mở rộng .xml. Excel và OpenOffice mở nó một cách chính xác.


Bạn có nghĩa là OP nên sử dụng tập lệnh PHP để chuyển đổi cơ sở dữ liệu sang định dạng XML?
Prasanna

2
Sạch sẽ hơn rất nhiều so với việc người dùng mở .csv trong Excel hoặc làm rối CSV của bạn để chỉ Excel có thể hiểu CSV của bạn. Nó thậm chí không phức tạp của một lược đồ.
b Liệu

Tiêu chuẩn này được ghi nhận ở đâu? Tôi muốn biết thêm về các loại dữ liệu có sẵn.
John Doherty

1

Giải pháp của tôi: Tôi gặp vấn đề tương tự với việc nhập số sê-ri. Chúng không phải được coi là số, tức là không có hàm toán học nào được thực hiện trên đó, nhưng chúng ta cần toàn bộ số trong đó. Điều đơn giản nhất tôi có là chèn một khoảng trắng trong số sê-ri. ví dụ: "12345678 90123456 1234". Khi Excel nhập nó, nó sẽ được coi là văn bản thay vì số.


0

Tôi đã có số tài khoản dài bị cắt xén.

Đây là cách tôi sửa nó:

Mở tệp của bạn.csv trong Libre Office / Open Office (bạn có thể phải chỉ định các dấu phân cách, v.v.) sau đó lưu tệp dưới dạng tệp Excel XML.

Sau đó mở tệp này trong Excel và sau đó bạn sẽ thấy các cột không còn được thay đổi thành định dạng khoa học hay bất cứ điều gì. Để an toàn, nhấp chuột phải vào cột và đặt rõ ràng định dạng là Văn bản, sau đó lưu dưới định dạng tệp Excel.

Mở tệp định dạng Excel và cột vẫn ổn!


1
Trong khi điều này sẽ làm việc, cố gắng giải thích cho một người chỉ nói tiếng Anh bị hỏng tại sao anh ta cần sử dụng một bộ văn phòng khác sẽ tạo ra nhiều vấn đề như nó giải quyết. Theo ý kiến ​​riêng của tôi, phần mềm thay thế cho M $ Office là tốt, nhưng tôi nhận ra rằng tôi không thể chuyển đổi tất cả mọi người.
atroon

0

Trình hướng dẫn nhập khẩu là giải pháp tốt nhất cho người dùng thông thường và các tình huống một lần. Nếu bạn cần một giải pháp lập trình, bạn có thể sử dụng phương thức QueryTables.Add (đây là những gì Trình hướng dẫn nhập khẩu đang sử dụng phía sau hậu trường).

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.