Có thể buộc Excel tự động nhận ra các tệp CSV UTF-8 không?


453

Tôi đang phát triển một phần của ứng dụng chịu trách nhiệm xuất một số dữ liệu thành tệp CSV. Ứng dụng này luôn sử dụng UTF-8 vì tính chất đa ngôn ngữ của nó ở mọi cấp độ. Nhưng việc mở các tệp CSV như vậy (có chứa ví dụ: dấu phụ, chữ cái, chữ Hy Lạp) trong Excel không đạt được kết quả mong đợi hiển thị như thế nào Г„/Г¤, Г–/Г¶. Và tôi không biết làm cách nào để Excel hiểu rằng tệp CSV đang mở được mã hóa theo UTF-8. Tôi cũng đã thử chỉ định BOM UTF-8 EF BB BF, nhưng Excel bỏ qua điều đó.

Có bất kỳ công việc xung quanh?

PS Những công cụ nào có khả năng hoạt động giống như Excel?


CẬP NHẬT

Tôi phải nói rằng tôi đã nhầm lẫn cộng đồng với việc xây dựng câu hỏi. Khi tôi hỏi câu hỏi này, tôi đã hỏi cách mở tệp CSV UTF-8 trong Excel mà không gặp vấn đề gì với người dùng, một cách trôi chảy và minh bạch. Tuy nhiên, tôi đã sử dụng một công thức sai yêu cầu thực hiện nó tự động . Điều đó rất khó hiểu và nó đụng độ với tự động hóa vĩ mô VBA. Có hai câu trả lời cho câu hỏi này mà tôi đánh giá cao nhất: câu trả lời đầu tiên của Alex https://stackoverflow.com/a/6002338/166589 và tôi đã chấp nhận câu trả lời này; và cái thứ hai của Mark https://stackoverflow.com/a/6488070/166589đã xuất hiện muộn hơn một chút. Từ quan điểm về khả năng sử dụng, Excel dường như thiếu hỗ trợ CSV UTF-8 thân thiện với người dùng, vì vậy tôi coi cả hai câu trả lời đều đúng và tôi đã chấp nhận câu trả lời của Alex trước vì thực sự tuyên bố rằng Excel không thể làm được mà minh bạch. Đó là những gì tôi nhầm lẫn với tự động ở đây. Câu trả lời của Mark thúc đẩy một cách phức tạp hơn cho người dùng cao cấp hơn để đạt được kết quả mong đợi. Cả hai câu trả lời đều tuyệt vời, nhưng câu trả lời của Alex phù hợp với câu hỏi không được chỉ định rõ ràng của tôi tốt hơn một chút.


CẬP NHẬT 2

Năm tháng sau lần chỉnh sửa cuối cùng, tôi nhận thấy rằng câu trả lời của Alex đã biến mất vì một số lý do. Tôi thực sự hy vọng nó không phải là một vấn đề kỹ thuật và tôi hy vọng không có cuộc thảo luận nào về câu trả lời nào lớn hơn bây giờ. Vì vậy, tôi chấp nhận câu trả lời của Mark là câu trả lời hay nhất.


1
Bạn có thể sử dụng các tập tin được phân định bằng tab? Nếu vậy, bạn có thể có nhiều may mắn.
Tim Perry

8
Office 2010+: hoạt động tốt nhất: UTF-16LE với BOM và \tlà dấu phân cách. Sẽ làm việc trong cài đặt Excel tiếng Anh và không tiếng Anh. Có thể nhấn Ctrl-Smà không chọn định dạng tệp, v.v. Sẽ giữ nguyên ký tự Unicode.
Sebastian

@Duncan thẳng thắn mà nói, tôi bối rối và thật khó "phán xét". Tôi đã chấp nhận câu trả lời của alex hơn 2 năm trước (cả Q và A vào ngày 14 tháng 5), và sau đó Mark trả lời gợi ý một cách giải quyết khó khăn (tôi thực sự không kiểm tra nó) mà đáng ngạc nhiên ghi được nhiều điểm hơn trong câu hỏi của tôi mà đáng ngạc nhiên đã trở thành phổ biến là tốt. Chúng tôi thực sự đã từ chối hỗ trợ Excel trong dự án của tôi từ lâu và tôi không muốn lấy đi điểm danh tiếng của alex, bởi vì Excel dường như, và có lẽ vẫn còn (xin vui lòng sửa tôi nếu tôi sai), để xử lý sai CSV. Thật khó để nói, xin lỗi.
Lyubomyr Shaydariv

2
Câu trả lời của Alex đã bị xóa bởi một người điều hành. Không có lời giải thích nào được đưa ra, nhưng nếu bạn có đủ danh tiếng, bạn vẫn có thể nhìn thấy nó.
Đánh dấu tiền chuộc

1
Vì cỗ máy thời gian không tồn tại nhưng cũng không cần phải đồng ý.
osexpert

Câu trả lời:


398

Alex là chính xác, nhưng khi bạn phải xuất sang csv, bạn có thể cung cấp cho người dùng lời khuyên này khi mở tệp csv:

  1. Lưu tệp đã xuất dưới dạng csv
  2. Mở Excel
  3. Nhập dữ liệu bằng Dữ liệu -> Nhập Dữ liệu Ngoài -> Nhập Dữ liệu
  4. Chọn loại tệp "csv" và duyệt đến tệp của bạn
  5. Trong trình hướng dẫn nhập, thay đổi File_Origin thành "65001 UTF" (hoặc chọn định danh ký tự ngôn ngữ chính xác)
  6. Thay đổi dấu phân cách thành dấu phẩy
  7. Chọn nơi nhập và kết thúc

Bằng cách này, các ký tự đặc biệt sẽ hiển thị chính xác.


163

Điểm đánh dấu theo thứ tự UTF-8 sẽ gợi ý Excel 2007+ về thực tế là bạn đang sử dụng UTF-8. (Xem bài SO này ).

Trong trường hợp bất kỳ ai cũng gặp vấn đề tương tự như tôi, lớp mã hóa UTF8 của .NET không xuất ra dấu đánh dấu thứ tự byte trong GetBytes()cuộc gọi. Bạn cần sử dụng các luồng (hoặc sử dụng một cách giải quyết ) để đưa BOM ra.


18
Chèn BOM UTF-8 dường như là cách để đi. Sau đó, nó trong suốt.
vy32

12
Tôi sử dụng Notepad ++ để dễ dàng chuyển đổi .csv từ UTF-8sangUTF-8 with BOM
Sébastien

3
Có - giải pháp tốt nhất. Rất nhiều bài viết khó hiểu xung quanh việc đặt tiêu đề trong phản hồi http. Điều này giải quyết vấn đề. Điều tương tự có thể được nhìn thấy khi mở tệp trong notepad và lưu lại ngay bằng cách sử dụng tùy chọn UTF-8. Cũng thêm dấu đánh dấu thứ tự byte.
dùng369142

1
@Elmue: Tôi đoán có lẽ (như tôi) anh ấy nghĩ rằng anh ấy đã lưu nó bằng một dấu thứ tự byte, nhưng không phải vì một số thư viện không hoạt động như anh ấy nghĩ. Tôi thấy nó đáng để thêm câu trả lời này, và rõ ràng một số người khác cũng thấy nó hữu ích. Ở mức độ nào, nó có vẻ như là một câu trả lời tốt hơn so với việc không sử dụng CSV hoặc hướng dẫn người dùng cách mở tệp theo một cách kỳ quái.
StriplingWar Warrior

1
Phiên bản Mac của Excel dường như vẫn bỏ qua BOM. (Excel cho Mac năm 2011)
Thomas Andrew

74

Lỗi với BOM bị bỏ qua dường như đã được sửa cho Excel 2013. Tôi gặp vấn đề tương tự với các chữ cái Cyrillic, nhưng việc thêm ký tự BOM \uFEFFđã giúp ích.


8
Vì tôi đã thêm \ uFEFF vào đầu tệp CSV của mình (được tạo bằng Java), Excel có thể mở chúng một cách chính xác! Thx
Galdo

16
điều đó cũng giải quyết vấn đề của tôi, trong php nó trông như thế này : $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText;
Abdullah

@updola cảm ơn rất nhiều vì bình luận này, đã giúp tôi tiết kiệm hàng giờ
nathan hayfield

UTF-8, theo định nghĩa, không sử dụng và cũng không nên sử dụng các ký tự BOM. Cách Excel đọc BOM tạo ra lợi thế của UTF-8 so với Unicode, khả năng tương thích ngược với ASCII. Thêm BOM sẽ làm cho Excel hoạt động, nhưng phá vỡ các lần đọc tệp UTF-8 / ASCII thích hợp khác.
Nelson

1
\ FE \ FF làm cho Mac OS Excel 2016 toàn bộ tệp dưới dạng chữ tượng hình Nhật Bản.
Nakilon

55

Thật đáng kinh ngạc khi có rất nhiều câu trả lời nhưng không có câu trả lời nào cho câu hỏi:

"Khi tôi hỏi câu hỏi này, tôi đã hỏi cách mở tệp CSV UTF-8 trong Excel mà không gặp vấn đề gì với người dùng, ..."

Câu trả lời được đánh dấu là câu trả lời được chấp nhận với hơn 200 phiếu bầu là vô ích đối với tôi vì tôi không muốn cung cấp cho người dùng của mình hướng dẫn cách định cấu hình Excel. Ngoài ra: hướng dẫn này sẽ áp dụng cho một phiên bản Excel nhưng các phiên bản Excel khác có các hộp thoại và menu cấu hình khác nhau. Bạn sẽ cần một hướng dẫn cho mỗi phiên bản Excel.

Vậy câu hỏi là làm thế nào để Excel hiển thị dữ liệu UTF8 chỉ với một cú nhấp chuột đơn giản?

Ít nhất là trong Excel 2007, điều này là không thể nếu bạn sử dụng các tệp CSV vì BOM UTF8 bị bỏ qua và bạn sẽ chỉ thấy rác. Đây đã là một phần của câu hỏi của Lyubomyr Shaydariv:

"Tôi cũng đã thử chỉ định UTF-8 BOM EF BB BF, nhưng Excel bỏ qua điều đó."

Tôi có cùng trải nghiệm: Viết dữ liệu tiếng Nga hoặc tiếng Hy Lạp vào tệp CSV UTF8 với kết quả BOM trong rác trong Excel:

Nội dung của tệp CSV UTF8:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Kết quả trong Excel 2007:

Excel UTF8 Excel

Một giải pháp là hoàn toàn không sử dụng CSV. Định dạng này được Microsoft triển khai một cách ngu ngốc đến nỗi nó phụ thuộc vào cài đặt vùng trong bảng điều khiển nếu dấu phẩy hoặc dấu chấm phẩy được sử dụng làm dấu phân cách. Vì vậy, cùng một tệp CSV có thể mở chính xác trên một máy tính nhưng trên máy tính bao phấn thì không. "CSV" có nghĩa là " Giá trị phân tách bằng dấu phẩy " nhưng ví dụ trên Windows tiếng Đức theo dấu chấm phẩy mặc định phải được sử dụng làm dấu tách trong khi dấu phẩy không hoạt động. (Ở đây nên đặt tên SSV = Giá trị phân tách dấu chấm phẩy) Các tệp CSV có thể được hoán đổi giữa các phiên bản ngôn ngữ khác nhau của Windows. Đây là một vấn đề bổ sung cho vấn đề UTF-8.

Excel tồn tại từ nhiều thập kỷ. Thật đáng tiếc khi Microsoft đã không thể thực hiện một điều cơ bản như nhập CSV trong tất cả những năm này.


Tuy nhiên, nếu bạn đặt các giá trị tương tự vào tệp HTML và lưu tệp đó dưới dạng tệp UTF8 bằng BOM với phần mở rộng tệp XLS, bạn sẽ nhận được kết quả chính xác.

Nội dung của tệp UTF8 XLS:

<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>

Kết quả trong Excel 2007:

UTF8 HTML Excel

Bạn thậm chí có thể sử dụng màu sắc trong HTML mà Excel sẽ hiển thị chính xác.

<style>
.Head { background-color:gray; color:white; }
.Red  { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>

Kết quả trong Excel 2007:

UTF8 HTML Excel

Trong trường hợp này, chỉ có bảng có đường viền và đường màu đen. Nếu bạn muốn TẤT CẢ các ô hiển thị đường lưới, điều này cũng có thể có trong HTML:

<html xmlns:x="urn:schemas-microsoft-com:office:excel">
    <head>
        <meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
        <xml>
            <x:ExcelWorkbook>
                <x:ExcelWorksheets>
                    <x:ExcelWorksheet>
                        <x:Name>MySuperSheet</x:Name>
                        <x:WorksheetOptions>
                            <x:DisplayGridlines/>
                        </x:WorksheetOptions>
                    </x:ExcelWorksheet>
                </x:ExcelWorksheets>
            </x:ExcelWorkbook>
        </xml>
    </head>
    <body>
        <table>
            <tr><td>Colum1</td><td>Column2</td></tr>
            <tr><td>Val1</td><td>Val2</td></tr>
            <tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
        </table>
    </body>
</html>

Mã này thậm chí cho phép chỉ định tên của bảng tính (ở đây "MySuperSheet")

Kết quả trong Excel 2007:

nhập mô tả hình ảnh ở đây


1
Và thật đáng kinh ngạc khi mọi người vẫn trả lời nó. :) Tuy nhiên, tôi sẽ lập luận rằng CSV đã chết: CSV là một định dạng phát trực tuyến đơn giản chết người và, khi tôi ở trong dự án đó, chúng tôi cũng đã sử dụng nó rất nhiều cho tương tác các thành phần. Tôi sẽ không bao giờ sử dụng định dạng HTML vì tính chất quá đại diện của nó và tôi không bao giờ có thể khiến người dùng của dự án đó xuất dữ liệu sang HTML chỉ để làm cho nó thân thiện với Excel. Excel đã hút vào CSV UTF-8 và tôi không biết điều gì đã thay đổi 5 năm kể từ đó. Nhưng các tập tin được phân cách bằng dấu phẩy, bán dấu hai chấm và tab là sự điên rồ thực sự, tôi đoán vậy.
Lyubomyr Shaydariv

5
Không có gì đáng ngạc nhiên khi mọi người vẫn trả lời câu hỏi của bạn bởi vì Google đưa họ đến đây: Tất cả đều có cùng một câu hỏi: Làm thế nào để tôi có được Excel ngu ngốc để làm những gì tôi muốn? Nhập 3 từ vào Google: "excel csv utf8" và câu hỏi của bạn là kết quả đầu tiên trên toàn thế giới. Bạn đã viết một cuốn sách bán chạy nhất!
Elmue

8
Vì bạn đã dành thời gian để chỉ ra làm thế nào không có câu trả lời nào khác ở đây khiến Excel mở tệp CSV chính xác, điều đáng nói là câu trả lời này cũng không làm điều đó. Câu trả lời được chấp nhận ban đầu (đã bị xóa bởi người điều hành) đã khuyến nghị xuất dữ liệu trực tiếp sang tệp Excel hoặc xuất tệp HTML và cho phép người dùng mở tệp trong Excel. Một trong những giải pháp đó ít bị hack hơn là lưu tệp HTML có phần mở rộng tệp XLS, nhưng không có câu trả lời nào được đề xuất mà thực sự trả lời câu hỏi.
StriplingWar Warrior

3
@War Warrior: "..nhưng không có câu trả lời nào được đề xuất mà thực sự trả lời câu hỏi." Điều này LAF không đúng. Tôi đã trả lời câu hỏi đó: Ít nhất là với Excel 2007, nó không phải là POSSIBLE. Đây là câu trả lời chắc chắn. Nếu Excel bỏ qua BOM UTF8 và diễn giải dữ liệu là ANSI, không có cách nào để nhập văn bản tiếng Hy Lạp hoặc tiếng Nga vào Excel qua CSV bằng cách nhấp đúp vào tệp (đó là câu hỏi: "không có vấn đề gì với người dùng" ). Những gì tôi đề xuất là một giải pháp hoạt động có chức năng với TẤT CẢ các phiên bản Excel với một lần bấm đúp và không yêu cầu các bước bổ sung trong các menu của Excel.
Elmue

2
Điều này không chỉ không trả lời được câu hỏi mà còn hoàn toàn sai khi nói CSV là "di sản" và "đã chết". Chỉ vì bạn không thấy việc sử dụng nó, không có nghĩa là nó đã chết. Ngoài ra, bạn rõ ràng không hiểu lịch sử của nó hoặc ngày nay nó được sử dụng rộng rãi như thế nào. Điều này tốt hơn XML (do kích thước gói nhỏ hơn) và vấn đề ở đây là làm thế nào Microsoft đơn giản không tuân theo một tiêu chuẩn cho định dạng UTF8. Câu trả lời đúng sẽ là sử dụng văn phòng mở chứ không phải Microsoft vì Microsoft chưa bao giờ giỏi mã hóa ngay từ đầu.
Jeremy

49

Chúng tôi đã sử dụng cách giải quyết này:

  1. Chuyển đổi CSV sang UTF-16 LE
  2. Chèn BOM vào đầu tập tin
  3. Sử dụng tab làm dấu tách trường

1
Cảm ơn! Tôi đã thử tất cả các câu trả lời khác trong chuỗi này, nhưng chuyển đổi sang UTF-8 đơn giản là không hoạt động. Khi tôi thử UTF-16 với BOM, nó hoạt động ngay lập tức.
Husky

Đối với Excel cho Mac 2011, tôi đã thành công với các tệp csv endian nhỏ UTF-16
multidocate

Cảm ơn, giải pháp này là tuyệt vời để cung cấp cho người dùng của tôi một csv unicode mà họ có thể mở trong Excel.
dùng1073075

21

Có cùng các vấn đề với các tệp CSV do PHP tạo. Excel đã bỏ qua BOM khi Dấu phân cách được xác định thông qua "sep=,\n"ở đầu nội dung (nhưng tất nhiên là sau BOM).

Vì vậy, việc thêm BOM ( "\xEF\xBB\xBF") vào đầu nội dung và đặt dấu chấm phẩy làm dấu phân tách thông qua fputcsv($fh, $data_array, ";");thủ thuật.


13

Tôi đã từng gặp vấn đề tương tự trong quá khứ (cách tạo tệp mà Excel có thể đọc và các công cụ khác cũng có thể đọc). Tôi đã sử dụng TSV chứ không phải CSV, nhưng vấn đề tương tự với mã hóa đã xuất hiện.

Tôi không tìm được cách nào để Excel tự động nhận dạng UTF-8 và tôi không sẵn lòng / có thể gây ra cho người tiêu dùng các tệp hướng dẫn phức tạp cách mở chúng. Vì vậy, tôi đã mã hóa chúng dưới dạng UTF-16le (với BOM) thay vì UTF-8. Kích thước gấp đôi, nhưng Excel có thể nhận ra mã hóa. Và họ nén tốt, vì vậy kích thước hiếm khi (nhưng đáng buồn là không bao giờ) quan trọng.


Đó là một câu hỏi cũ, nhưng tôi rất vui vì mọi người vẫn trả lời nó. Cảm ơn bạn. :)
Lyubomyr Shaydariv

1
@LyubomyrShaydariv: kể từ khi tôi trả lời câu hỏi này, một đồng nghiệp đã nói với tôi rằng Excel mới nhất xác định các tệp CSV UTF-8 miễn là họ có BOM ban đầu. Vì vậy, trong một vài năm, khi mọi người trên thế giới (hoặc dù sao đi nữa, mọi người chúng tôi gửi tệp đến) đều ở phiên bản Excel đó hoặc tốt hơn, tôi có thể thay đổi mã hóa của mình :-)
Steve Jessop

Lạ thật, đối với tôi nó không hoạt động. Biến các nhân vật thành biểu tượng của Trung Quốc ... (họ được cho là đã được hebrew)
Veverke

Tôi đã có các ký tự tiếng Trung trong Excel khi tôi lưu trong "UTF-16 BE với BOM". Khi tôi thử "UTF-16 LE với BOM", nó đã hoạt động! Tôi đã sử dụng Sublime Text để thử nghiệm.
Henno

12

Câu hỏi cũ nhưng quái, giải pháp đơn giản nhất là:

  1. Mở CSV trong Notepad
  2. Lưu dưới dạng -> chọn mã hóa đúng
  3. Mở tập tin mới

1
Bạn sử dụng phiên bản Excel nào?
Lyubomyr Shaydariv

1
Rực rỡ, chỉ đơn giản là làm việc và giải quyết vấn đề (ít nhất là đối với tôi)
Auberon Vacher

1
Không, bởi vì vấn đề là để Excel mở tệp .csv dưới dạng tệp csv. Ý tôi là, tôi có một quá trình nơi tôi tạo các tệp csv. Người dùng sau đó sẽ chỉ được yêu cầu mở các tệp. Ở đây anh ấy / cô ấy được yêu cầu phải làm nhiều hơn thế.
Veverke

2
@Veverke nếu bạn tạo tệp một cách thường xuyên thì đây không phải là giải pháp tốt nhất. Nhưng nếu đó là một lần, câu trả lời này là hoàn hảo. Nó hoạt động vì Notepad sẽ đặt BOM ở đầu tệp UTF-8 hoặc UTF-16.
Đánh dấu tiền chuộc

Hoạt động như một lá bùa. ((:
dùng2925795

10

Như tôi đã đăng trên http://thinkinginsoftware.blogspot.com/2017/12/c Corrly-generate-csv-that-excel-can.html :

Nói với nhà phát triển phần mềm chịu trách nhiệm tạo CSV để sửa nó. Để giải quyết nhanh, bạn có thể sử dụng gsed để chèn BOM UTF-8 vào đầu chuỗi:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

Lệnh này chèn BOM UTF-4 nếu không có. Vì vậy, nó là một lệnh idempotent. Bây giờ bạn có thể nhấp đúp vào tệp và mở tệp trong Excel.


Cảm ơn đã sửa nó. Tôi vừa chuyển đổi csv ';' được phân tách thành UTF-BOM trong Notepad ++ và biết exels mở nó một cách chính xác.
RandomGuy

Chính xác những gì cần thiết! Đây là một con trỏ hướng dẫn cách thực hiện điều này trong PHP stackoverflow.com/questions/25686191/NH
EFC

Đây là cách giải quyết cho excel không thể nhận ra các chareacters utf trong tệp csv. Vì vậy, sửa chữa này để khắc phục vấn đề excel.
cobp

Điều này làm việc cho Phiên bản tiếng Hy Lạp Excel 2007, với các dấu phẩy. Cảm ơn bạn.
NameOfTheRose

Đã thay đổi mã hóa thành 'UTF-16le' trong fs.createWriteStream (fileName, {mã hóa: 'UTF-16le'}) và excel đã mở tệp CSV chính xác
rahul shukla

9

Bạn có thể chuyển đổi tệp .csv sang UTF-8 bằng BOM qua Notepad ++:

  1. Mở tệp trong Notepad ++ .
  2. Chuyển đến menu EncodingConvert to UTF-8.
  3. Chuyển đến menu FileSave.
  4. Đóng Notepad ++.
  5. Mở tệp trong Excel.

Đã hoạt động trong Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-bit từ Microsoft Office Professional Plus 2013 trên Windows 8.1 với ngôn ngữ cho các chương trình không Unicode được đặt thành "Tiếng Đức (Đức)".


1
Đã làm những gì bạn nói, không làm việc gì cả. Chuyển đổi / mã hóa, thiết lập các bộ ký tự, không có gì hoạt động trong trường hợp của tôi. Nhập tệp vào google sheet, tải xuống dưới dạng csv, hoạt động hoàn hảo.
Chào

1
Tôi đã phải chuyển đổi nó bằng Mã hóa -> Cinvert ti UTF-8-BOM Excel phiên bản 2016
Igor Vuković

4

Macro vba đơn giản để mở tệp văn bản utf-8 và tệp csv

Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

Xuất xứ: = 65001 là UTF-8. Dấu phẩy: Đúng cho các tệp .csv được phân phối trong colums

Lưu nó trong Personal.xlsb để luôn có sẵn. Cá nhân hóa thanh công cụ excel thêm nút gọi macro và mở tệp từ đó. Bạn có thể thêm nhiều định dạng vào macro, như tự động cột, căn chỉnh, v.v.


2
Cảm ơn. Thật không may, đây là gợi ý cho người dùng Excel thực sự tiên tiến và những gì tôi hướng đến, đặt câu hỏi này, là làm cho Excel tự động thực hiện.
Lyubomyr Shaydariv

Tôi đã cố sử dụng đoạn mã này nhưng nó không hoạt động với tôi. Tôi sử dụng Excel 2013.
Sharunas Bielskis

3

Chỉ để giúp người dùng quan tâm đến việc mở tệp trên Excel đạt được chuỗi này như tôi.

Tôi đã sử dụng trình hướng dẫn bên dưới và nó hoạt động tốt với tôi, nhập tệp UTF-8. Không minh bạch, nhưng hữu ích nếu bạn đã có tệp.

  1. Mở Microsoft Excel 2007.
  2. Nhấp vào tùy chọn thanh menu Dữ liệu.
  3. Nhấp vào biểu tượng Từ Văn bản.
  4. Điều hướng đến vị trí của tệp mà bạn muốn nhập. Bấm vào tên tệp và sau đó bấm vào nút Nhập. Thuật sĩ Nhập văn bản - Cửa sổ Bước 1 hoặc 3 sẽ xuất hiện trên màn hình.
  5. Chọn loại tệp mô tả đúng nhất dữ liệu của bạn - Được phân cách hoặc Độ rộng cố định.
  6. Chọn 65001: Unicode (UTF-8) từ danh sách thả xuống xuất hiện bên cạnh Nguồn gốc tệp.
  7. Nhấp vào nút Tiếp theo để hiển thị Trình hướng dẫn Nhập văn bản - Bước 2 hoặc 3 cửa sổ.
  8. Đặt một dấu kiểm bên cạnh dấu phân cách đã được sử dụng trong tệp bạn muốn nhập vào Microsoft Excel 2007. Cửa sổ xem trước dữ liệu sẽ cho bạn thấy dữ liệu của bạn sẽ xuất hiện như thế nào dựa trên dấu phân cách mà bạn đã chọn.
  9. Nhấp vào nút Tiếp theo để hiển thị Trình hướng dẫn Nhập văn bản - Bước 3 trên 3.
  10. Chọn định dạng dữ liệu phù hợp cho từng cột dữ liệu mà bạn muốn nhập. Bạn cũng có tùy chọn không nhập một hoặc nhiều cột dữ liệu nếu bạn muốn.
  11. Nhấp vào nút Kết thúc để hoàn tất nhập dữ liệu của bạn vào Microsoft Excel 2007.

Nguồn: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0


3

Vâng, điều này là có thể. Như nhiều người dùng đã lưu ý trước đây, dường như có một vấn đề với excel khi đọc Dấu thứ tự Byte chính xác khi tệp được mã hóa bằng UTF-8. Với UTF-16 dường như không có vấn đề gì, vì vậy nó là đặc hữu của UTF-8. Giải pháp tôi sử dụng cho việc này là thêm BOM, TWICE. Đối với điều này, tôi thực hiện lệnh sed sau đây hai lần:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

, trong đó ký tự đại diện có thể được thay thế bằng bất kỳ tên tệp nào. Tuy nhiên, điều này dẫn đến một đột biến của sep = ở đầu tệp .csv. Sau đó, tệp .csv sẽ mở bình thường trong excel, nhưng có thêm một hàng với "sep =" trong ô đầu tiên. Cũng có thể xóa "sep =" trong chính nguồn .csv, nhưng khi mở tệp bằng VBA, dấu phân cách phải được chỉ định:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

Định dạng 6 là định dạng .csv. Đặt Local thành true, trong trường hợp có ngày trong tệp. Nếu Local không được đặt thành true, ngày sẽ được Americanized, trong một số trường hợp sẽ làm hỏng định dạng .csv.


1
Khi chạy lệnh sed, tôi nhận được: "sed: tùy chọn không hợp lệ - 'Tôi'", tôi nghĩ rằng nó phải là 'i'
BiAiB

2

Đây là giải pháp làm việc của tôi:

vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001

Chìa khóa là Xuất xứ: = 65001


2

Vâng, nó là có thể. Khi viết luồng tạo csv, điều đầu tiên cần làm là:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

Bạn đã không đọc câu hỏi! Lyubomyr Shaydariv đã viết: "Tôi cũng đã thử chỉ định UTF-8 BOM EF BB BF, nhưng Excel bỏ qua điều đó."
Elmue

Đây là mã làm việc. Nếu bạn viết ra các tệp UTF-8 từ các ứng dụng .Net với khách hàng tiềm năng này, Excel sẽ nhận ra tệp đó là UTF8.
zax

Có thể trong Excel CỦA BẠN nó hoạt động. Nhưng ít nhất trong Excel 2007, BOM bị bỏ qua hoàn toàn. Vì vậy, nếu bạn có ý định viết mã hoạt động trên tất cả các phiên bản Excel, mã của bạn không hữu ích.
Elmue

2

Một danh sách các câu trả lời thực sự tuyệt vời, nhưng vẫn còn một câu trả lời khá hay, tôi sẽ đề cập đến nó ở đây: mở tệp csv bằng các trang google và lưu lại vào máy tính cục bộ của bạn dưới dạng tệp excel.

Trái ngược với Microsoft, Google đã quản lý để hỗ trợ các tệp csv UTF-8 để nó chỉ hoạt động để mở tệp ở đó. Và định dạng xuất sang excel cũng chỉ hoạt động. Vì vậy, mặc dù đây có thể không phải là giải pháp ưa thích cho tất cả mọi người, nhưng nó khá là không an toàn và số lần nhấp không cao như âm thanh, đặc biệt là khi bạn đã đăng nhập vào google.


2

Đây không phải là giải quyết chính xác câu hỏi nhưng vì tôi đã vấp phải điều này và các giải pháp trên không phù hợp với tôi hoặc có những yêu cầu tôi không thể đáp ứng, đây là một cách khác để thêm BOM khi bạn có quyền truy cập vào vim:

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv

2

xin chào tôi đang sử dụng ruby ​​trên đường ray cho thế hệ csv. Trong ứng dụng của chúng tôi, chúng tôi dự định sử dụng đa ngôn ngữ (I18n) và chúng tôi đã gặp phải một vấn đề trong khi xem nội dung I18n trong tệp CSV của windows excel.

Đã ổn với Linux (Ubuntu) và mac.

Chúng tôi đã xác định rằng windows excel cần phải được nhập lại dữ liệu để xem dữ liệu thực tế. Trong khi nhập, chúng tôi sẽ có thêm tùy chọn để chọn bộ ký tự.

Nhưng điều này không thể được giáo dục cho mỗi và mọi người dùng, vì vậy giải pháp chúng tôi tìm kiếm là mở chỉ bằng cách nhấp đúp.

Sau đó, chúng tôi đã xác định cách hiển thị dữ liệu bằng chế độ mở và bom trong windows excel với sự trợ giúp của ý chính aghuddleston . Thêm vào tham khảo.

Ví dụ nội dung I18n

Trong Mac và Linux

Tiếng Thụy Điển: Förnamn Tiếng Anh: Tên

Trong Windows

Tiếng Thụy Điển: Tiếng Anh: Tên

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

Điều quan trọng cần lưu ý ở đây là chế độ mở và bom

open_mode = "w +: UTF-16LE: UTF-8"

bom = "\ xEF \ xBB \ xBF"

Trước khi viết BOM chèn CSV

bom f.write

f.write (csv_file)

Windows và Mac

Tập tin có thể được mở trực tiếp bằng cách nhấp đúp.

Linux (ubfox)

Trong khi mở tệp, hãy yêu cầu các tùy chọn phân tách -> chọn Kiểu TAB nhập mô tả hình ảnh ở đây


1

Tôi đã đối mặt với cùng một vấn đề vài ngày trước và không thể tìm thấy bất kỳ giải pháp nào vì tôi không thể sử dụng import from csvtính năng này vì nó khiến mọi thứ được tạo kiểu như chuỗi.

Giải pháp của tôi là trước tiên mở tệp bằng notpad ++ và change the encode to ASCII. Sau đó, chỉ cần mở tệp trong excel và nó hoạt động như mong đợi.


1

Trong php, bạn chỉ cần thêm $ bom vào $ csv_ chuỗi của mình:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

Đã thử nghiệm với MS Excel 2016, php 7.2.4


0

Đây là một câu hỏi cũ nhưng tôi vừa gặp phải có một vấn đề tương tự và giải pháp có thể giúp người khác:

Có cùng một vấn đề khi ghi dữ liệu văn bản CSV vào một tệp, sau đó mở .csv kết quả trong Excel sẽ chuyển tất cả văn bản thành một cột duy nhất. Sau khi đọc các câu trả lời ở trên, tôi đã thử như sau, có vẻ như sắp xếp vấn đề.

Áp dụng mã hóa UTF-8 khi bạn tạo StreamWriter. Đó là nó.

Thí dụ:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}

@elmue quan tâm đến công phu một chút? Chắc chắn xuất ra CSV bằng cách sử dụng mã hóa chính xác để bắt đầu với việc đảm bảo không có vấn đề tương thích với Excel sau này trong quy trình làm việc?
Rex

Mã sai vì bạn không cần output.Close () nếu bạn có câu lệnh using (). Ngoài ra, Excel CSV còn rất nguyên thủy. Tôi sẽ không sử dụng nó cả. Nếu bạn muốn nhập trong Excel, hãy sử dụng bảng HTML và mở nó trong Excel.
Elmue

Cảm ơn bạn đã làm rõ @Elmue - thật không may, tôi đã gặp phải một số tình huống (bao gồm các tệp trên các ổ đĩa mạng) trong đó yêu cầu đóng rõ ràng cũng như xử lý. Không tìm thấy lý do tại sao như tôi nghĩ tôi nhớ đã thấy một cuộc gọi đến Close()trong Disposengăn xếp nhưng chúng tôi đi. Bạn cũng không chính xác trong tuyên bố của mình về nhập CSV là nguyên thủy vì nó không cần cách tiếp cận HTML không hiệu quả mà bạn đã đề xuất. Trong thực tế, việc tạo các bước lập trình bổ sung để lấy dữ liệu văn bản đơn giản, chuyển đổi thành HTML sau đó kéo vào Excel có vẻ phản tác dụng
Rex

tiếp tục ... Tuy nhiên, các kịch bản khác nhau có các yêu cầu khác nhau và ví dụ của tôi cho thấy chính xác cách chỉ định mã hóa theo yêu cầu của OP
Rex

Vui lòng đọc lại câu hỏi ban đầu: "Tôi cũng đã thử chỉ định UTF-8 BOM EF BB BF, nhưng Excel bỏ qua điều đó." Tôi đã thử nghiệm tương tự và đi đến cùng một kết quả: Excel KHÔNG nhận ra UTF8 BOM. Thử nó! Viết một tệp CSV và đặt các ký tự Hy Lạp hoặc Nga vào đó. Sau đó mở nó trong Excel và bạn sẽ nhận được garbarge. Vì vậy, câu trả lời của bạn không giải quyết bất cứ điều gì.
Elmue

0

Nếu bạn muốn làm cho nó hoàn toàn tự động, chỉ cần một cú nhấp chuột hoặc tải tự động vào Excel từ một trang web, nhưng không thể tạo các tệp Excel thích hợp, thì tôi khuyên bạn nên xem định dạng SYLK thay thế. OK nó không đơn giản như CSV nhưng nó dựa trên văn bản và rất dễ thực hiện và nó hỗ trợ UTF-8 mà không gặp vấn đề gì.

Tôi đã viết một lớp PHP nhận dữ liệu và xuất ra tệp SYLK sẽ mở trực tiếp trong Excel bằng cách chỉ cần nhấp vào tệp (hoặc sẽ tự động khởi chạy Excel nếu bạn viết tệp vào trang web với loại mime chính xác. thêm định dạng (như in đậm, định dạng số theo cách cụ thể, v.v.) và thay đổi kích thước cột hoặc cột kích thước tự động cho văn bản trong các cột và tất cả trong tất cả mã có thể không quá 100 dòng.

Thật dễ dàng để đảo ngược kỹ sư SYLK bằng cách tạo một bảng tính đơn giản và lưu dưới dạng SYLK và sau đó đọc nó bằng trình soạn thảo văn bản. Khối đầu tiên là các tiêu đề và định dạng số tiêu chuẩn mà bạn sẽ nhận ra (mà bạn chỉ cần lấy lại trong mỗi tệp bạn tạo), sau đó dữ liệu chỉ đơn giản là tọa độ X / Y và giá trị.


0
  1. Tải xuống và cài đặt LibreScript Calc
  2. Mở tệp csv bạn chọn trong LibreOffice Calc
  3. Cảm ơn thiên đàng mà trình hướng dẫn nhập văn bản xuất hiện ...
  4. ... chọn tùy chọn mã hóa ký tự và ký tự của bạn
  5. Chọn dữ liệu kết quả trong Calc và sao chép dán vào Excel

0

Tôi đang tạo các tệp csv từ một ứng dụng C # đơn giản và có cùng một vấn đề. Giải pháp của tôi là đảm bảo tệp được viết bằng mã hóa UTF8, như vậy:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

Ban đầu tôi có đoạn mã sau, với các dấu có vẻ ổn trong Notepad ++ nhưng đã được xử lý trong Excel:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

Số dặm của bạn có thể thay đổi - Tôi đang sử dụng .NET 4 và Excel từ Office 365.


0

Giải pháp làm việc cho văn phòng 365

  • lưu vào UTF-16(không LE, BE)
  • sử dụng dải phân cách \t

Mã trong PHP

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);

-1

Đầu tiên lưu bảng tính Excel dưới dạng văn bản Unicode. Mở tệp TXT bằng Internet explorer và nhấp vào "Lưu dưới dạng" Mã hóa TXT - chọn mã hóa phù hợp, nghĩa là cho Win Cyrillic 1251


-1

Tôi đã thử mọi thứ tôi có thể tìm thấy trên chủ đề này và tương tự, không có gì hoạt động đầy đủ. Tuy nhiên, nhập vào trang tính google và chỉ cần tải xuống dưới dạng csv hoạt động như một cơ duyên. Hãy thử nếu bạn đến điểm thất vọng của tôi.

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.