Tạo tệp CSV cho Excel, làm thế nào để có một dòng mới bên trong một giá trị


158

Tôi cần tạo một tệp cho Excel, một số giá trị trong tệp này chứa nhiều dòng.

cũng có văn bản không phải tiếng Anh trong đó, vì vậy tệp phải là Unicode.

Tệp tôi đang tạo bây giờ trông như thế này: (trong UTF8, với văn bản không phải tiếng Anh được trộn lẫn và có rất nhiều dòng)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

Lưu ý giá trị nhiều dòng được đặt trong dấu ngoặc kép, với dòng mới hàng ngày bình thường trong đó.

Theo những gì tôi tìm thấy trên web, ứng dụng này hoạt động, nhưng không, ít nhất là không giành được các tệp Excel 2007 và UTF8, Excel coi dòng thứ 3 là hàng dữ liệu thứ hai không phải là dòng thứ hai của hàng dữ liệu thứ nhất .

Điều này phải chạy trên các máy của khách hàng của tôi và tôi không có quyền kiểm soát phiên bản Excel của họ, vì vậy tôi cần một giải pháp sẽ hoạt động với Excel 2000 trở lên.

Cảm ơn

EDIT: Tôi đã "giải quyết" vấn đề của mình bằng cách có hai tùy chọn CSV, một cho Excel (Unicode, tách tab, không có dòng mới trong các trường) và một cho phần còn lại của thế giới (UTF8, CSV tiêu chuẩn).

Không phải những gì tôi đang tìm kiếm nhưng ít nhất nó hoạt động (cho đến nay)


1
FYI: Tất cả đều hoạt động hoàn hảo trong LibreOffice và việc nhập CSV dễ dàng hơn nhiều ngay từ đầu.
2061057

9
Câu trả lời được chấp nhận về các khoảng trắng thừa vô cùng khó hiểu khi bạn đã chỉnh sửa câu hỏi của mình và xóa các khoảng trắng ...
Matti Virkkunen

Câu trả lời:


70

Bạn nên có các ký tự khoảng trắng ở đầu các trường CHỈ trong đó các ký tự khoảng trắng là một phần của dữ liệu. Excel sẽ không loại bỏ các không gian hàng đầu. Bạn sẽ nhận được khoảng trắng không mong muốn trong các tiêu đề và trường dữ liệu của bạn. Tồi tệ hơn, "điều đó sẽ "bảo vệ" việc ngắt dòng trong cột thứ ba sẽ bị bỏ qua vì nó không ở đầu trường.

Nếu bạn có các ký tự không phải ASCII (được mã hóa bằng UTF-8) trong tệp, bạn nên có BOM UTF-8 (3 byte, hex EF BB BF) khi bắt đầu tệp. Mặt khác, Excel sẽ diễn giải dữ liệu theo mã hóa mặc định của miền địa phương của bạn (ví dụ cp1252) thay vì utf-8 và các ký tự không phải ASCII của bạn sẽ được chuyển vào thùng rác.

Nhận xét sau áp dụng cho Excel 2003, 2007 và 2013; chưa được thử nghiệm trên Excel 2000

Nếu bạn mở tệp bằng cách bấm đúp vào tên của nó trong Windows Explorer, mọi thứ đều hoạt động tốt.

Nếu bạn mở nó từ trong Excel, kết quả sẽ thay đổi:

  1. Bạn chỉ có các ký tự ASCII trong tệp (và không có BOM): hoạt động.
  2. Bạn có các ký tự không phải ASCII (được mã hóa bằng UTF-8) trong tệp, với BOM UTF-8 khi bắt đầu: nó nhận ra rằng dữ liệu của bạn được mã hóa trong UTF-8 nhưng nó bỏ qua phần mở rộng csv và thả bạn vào Văn bản Nhập không phải là Trình hướng dẫn , thật không may với kết quả là bạn gặp sự cố ngắt dòng.

Các tùy chọn bao gồm:

  1. Huấn luyện người dùng không mở các tệp trong Excel :-(
  2. Xem xét việc viết tệp XLS trực tiếp ... có các gói / thư viện có sẵn để thực hiện điều đó trong Python / Perl / PHP / .NET / etc

1
Cảm ơn, tôi đã khắc phục sự cố không gian hàng đầu trong câu hỏi, tôi đã nhập ví dụ CSV theo cách thủ công và không sao chép-dán từ tệp thực, tệp thực không bao gồm các khoảng trắng đó, bắt tốt.

@Nir: Bây giờ hãy nói về vấn đề thực sự của bạn. Vì vậy, điều đó có nghĩa là bạn đã có BOM UTF-8 và mở tệp từ trong Excel và nhận được Trình hướng dẫn nhập văn bản không nhận ra rằng dòng mới Value3 của bạn phải được "bảo vệ" - đúng không? Hoặc có lẽ bạn không có BOM UTF-8 và bạn phải nói với TIW rằng dữ liệu của bạn đã được mã hóa UTF-8 và nó vẫn bị lỗi dòng mới?
John Machin

Nếu tôi muốn sử dụng | làm dấu tách trường, dòng mới làm dấu tách bản ghi, sử dụng "để bảo vệ nội dung của trường văn bản và trường văn bản có thể chứa |," và dòng mới. Điều này có thể không?
Giorgio

1
FYI: Tôi đã xuất Excel2007 và CSV từ hệ thống Redmine. Sau khi thêm UTF-8 BOM (EFBBBF) vào lúc bắt đầu, Excel đã mở tệp một cách hoàn hảo. Các dòng mới được nhúng trong "mô tả vấn đề" colunm được xử lý chính xác và cấu trúc hàng không bị hỏng và tất cả các ký tự quốc gia được đọc đúng cách (chúng đã bị vứt bỏ khi đọc mà không có UTF8 BOM). Excel thậm chí không hiển thị trình hướng dẫn nhập văn bản. Hiện tại, CSV đó hiện có EFBBBFtiêu đề, sử dụng 0Alàm dấu tách hàng và 0D0Alàm dòng mới bên trong chuỗi trong các ô văn bản.
quetzalcoatl

1
Nếu bạn đang cố gắng để Excel cho OS X đọc chính xác CSV của bạn, cũng như Excel cho Windows, thì đây là một tài nguyên tuyệt vời: stackoverflow.com/questions/4348802/
Lỗi

25

Sau nhiều lần điều chỉnh, đây là một cấu hình hoạt động tạo tệp trên Linux, đọc trên Windows + Excel, mặc dù định dạng dòng mới được nhúng không theo tiêu chuẩn :

  • Các dòng mới trong một trường cần phải là \ n (và rõ ràng được trích dẫn trong dấu ngoặc kép)
  • Kết thúc hồ sơ: \ r \ n
  • Đảm bảo rằng bạn không bắt đầu một trường bằng, nếu không nó sẽ được coi là công thức và bị cắt cụt

Trong Perl, tôi đã sử dụng Text :: CSV để làm điều này như sau:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);

3
Có đó \ r \ n đã làm điều đó. Tôi có thể xác nhận điều này hoạt động với Windows + Excel, OSX + Numbers và Google Docs.
Yorick Sijsling

3
Sử dụng \ n (cũng đã thử \ n) trong trường được đính kèm "và sử dụng \ r \ n để phân chia các hàng. Vẫn không khắc phục được sự cố này cho tôi trong Excel 2010. Tôi đã thử ANSI và UTF8-with-BOM. Không thành công
nl-x

1
Nhưng điều này là do tôi sử dụng | làm dải phân cách trường. Nếu tôi sử dụng; là trình phân tách trường, sự cố vẫn tồn tại khi nhập dữ liệu CSV, nhưng sự cố sẽ biến mất khi mở CSV bằng cách nhấp đúp vào nó trong File Explorer.
nl-x

2
Câu trả lời của Ian không hoạt động với tôi trong Excel 2003/2010 trên Windows 7. Tôi đã thử sử dụng trình soạn thảo hex để chỉnh sửa tệp BOM UTF-8 của mình và xóa 0D (\ r) khỏi các bit '0D0A' (\ r \ n) cho dòng mới trong các lĩnh vực. Nhưng nó không hoạt động.
Dan W

Câu trả lời này đã có hiệu quả đối với tôi (với số sửa đổi bằng 0!) Bằng Excel 2010 và WUsows 7; cũng sử dụng perl v5.14.2 mà tàu có cygwin. Dòng mới nhúng của tôi là tất cả \n. Cảm ơn
ardew

21

Gần đây tôi gặp vấn đề tương tự, tôi đã giải quyết nó bằng cách nhập tệp HTML , ví dụ cơ bản sẽ như sau:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

Tôi biết, nó không phải là CSV và có thể hoạt động khác nhau đối với các phiên bản Excel khác nhau, nhưng tôi nghĩ rằng nó đáng để thử.

Tôi hi vọng cái này giúp được ;-)


35
@GusDeCooL Từ ngữ của câu đầu tiên của OP "Tôi cần tạo một tệp cho Excel, một số giá trị trong tệp này chứa nhiều dòng." gợi ý rằng có lẽ nó không cần phải là tệp CSV. Ngoài ra, định dạng Q & A cũng áp dụng cho các độc giả khác và nó có thể là một lựa chọn khả thi cho một số người trong số họ (ngay cả khi OP phải sử dụng CSV). Tôi thấy downvote của bạn không hợp lý (vẫn, cảm ơn bạn đã giải thích lý do tại sao).
dtldarek

1
Đây là lựa chọn tốt nhất cho tôi, trên thực tế; cảm ơn bạn đã gợi ý nó
Jordan Gray

8

Điều đáng chú ý là khi tệp .CSV có các trường được bọc trong dấu ngoặc kép chứa ngắt dòng, Excel sẽ không nhập tệp .CSV đúng cách nếu tệp .CSV được viết ở định dạng UTF-8. Excel xử lý ngắt dòng như thể nó là CR / LF và bắt đầu một dòng mới. Bảng tính bị cắt xén. Điều đó dường như đúng ngay cả khi dấu chấm phẩy được sử dụng làm dấu phân cách trường (thay vì dấu phẩy).

Vấn đề có thể được giải quyết bằng cách sử dụng Windows Notepad để chỉnh sửa tệp .CSV, sử dụng Tệp> Lưu dưới dạng ... để lưu tệp và trước khi lưu tệp, thay đổi mã hóa tệp từ UTF-8 sang ANSI. Khi tệp được lưu ở định dạng ANSI, sau đó tôi thấy rằng Microsoft Excel 2013 đang chạy trên Windows 7 Professional sẽ nhập tệp đúng cách.


7

Dòng mới bên trong một giá trị dường như hoạt động nếu bạn sử dụng dấu chấm phẩy làm dấu phân cách, thay vì dấu phẩy hoặc tab và sử dụng dấu ngoặc kép.

Điều này hoạt động với tôi trong cả Excel 2010 và Excel 2000. Tuy nhiên, thật ngạc nhiên, nó chỉ hoạt động khi bạn mở tệp dưới dạng bảng tính mới, không phải khi bạn nhập tệp vào bảng tính hiện có bằng tính năng nhập dữ liệu.


vâng, nhưng sau đó tôi đã không tìm thấy tùy chọn để tạo dòng kết thúc bằng dấu chấm phẩy trong excel
GusDeCooL

Điều gì nếu một số dữ liệu văn bản thực tế có chứa dấu hai chấm? Điều này sẽ không hoạt động.
htm11h

4

Trên PC, ký tự ASCII # 10 là những gì bạn muốn đặt một dòng mới trong một giá trị.

Tuy nhiên, khi bạn đưa nó vào Excel, bạn cần đảm bảo rằng tính năng ngắt từ được bật cho các ô nhiều dòng hoặc dòng mới sẽ xuất hiện dưới dạng một ô vuông.


3

Điều này sẽ không hoạt động nếu bạn cố gắng nhập tệp vào EXCEL.

Liên kết phần mở rộng tệp csv với EXCEL.EXE để bạn có thể gọi EXCEL bằng cách nhấp đúp vào tệp csv.

Ở đây tôi đặt một số văn bản theo sau bởi NewLine Char và theo sau là một số văn bản khác VÀ kèm theo toàn bộ chuỗi với dấu ngoặc kép.

Không sử dụng CR vì EXCEL sẽ đặt một phần của chuỗi vào ô tiếp theo.

""text" + NL + "text""

Khi bạn gọi EXCEL, bạn sẽ thấy điều này. Bạn có thể phải tự động kích thước chiều cao để xem tất cả. Trường hợp ngắt dòng sẽ phụ thuộc vào chiều rộng của ô.

2

NGÀY

Đây là mã trong Basic

CHR$(34,"2", 10,"DATE", 34)

2

Tôi tìm thấy cái này và nó đã làm việc cho tôi

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Sau đó, nơi bạn cần phải có công cụ kèm theo

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

Sau đó, khi bạn cần viết một cái gì đó - như HTML bao gồm "bạn có thể làm điều này

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Dòng mới kết thúc bằng . PHP_EOL

Phần cuối của tập lệnh in ra một liên kết để người dùng có thể tải xuống tệp.

echo 'Click <a href="myfile.csv">here</a> to download file';

1

Các tệp UTF có chứa BOM sẽ khiến Excel xử lý các dòng mới theo nghĩa đen ngay cả trong trường đó được bao quanh bởi dấu ngoặc kép. (Đã kiểm tra Excel 2008 Mac)

Giải pháp là làm cho bất kỳ dòng mới nào trở lại vận chuyển (CHR 13) chứ không phải là một nguồn cấp dữ liệu.


Excel 2016 dường như xử lý tệp CSV của tôi một cách chính xác ngay cả khi nó có BOM UTF8. Tuy nhiên, điều làm nên sự khác biệt là sử dụng ';' như một dấu tách trường (đó là những gì Excel làm cho tất cả các vị trí có ',' dưới dạng dấu tách thập phân).
Ale

1

Kiểm tra điều này: Nó hoàn toàn hoạt động với tôi: Đặt các dòng sau vào một xxxx.csvtệp

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Mở bằng excel.

trong một số trường hợp sẽ mở trực tiếp nếu không sẽ cần sử dụng cột để chuyển đổi dữ liệu. mở rộng chiều rộng cột và nhấn nút bọc văn bản. hoặc định dạng các ô và kích hoạt văn bản bọc.

và cảm ơn vì những gợi ý khác, nhưng chúng không hiệu quả với tôi. Tôi đang ở trong một cửa sổ thuần env và không muốn chơi với unicode hay những thứ buồn cười khác.

Bằng cách này, bạn đặt một công thức từ csv để excel. Nó có thể được sử dụng nhiều cho phương pháp làm việc này. (lưu ý = trước dấu ngoặc kép)

pd: Trong các đề xuất của bạn, vui lòng đặt một số mẫu dữ liệu không chỉ mã.


1

đặt "\ r" ở cuối mỗi hàng thực sự có tác dụng ngắt dòng trong excel, nhưng trong .csv nó biến mất và để lại một mớ hỗn độn xấu xí trong đó mỗi hàng bị đè bẹp ở hàng tiếp theo không có khoảng trắng và không ngắt dòng


0

Cách chúng tôi thực hiện (chúng tôi sử dụng VB.Net) là gửi văn bản với các dòng mới trong Chr (34), đó là char đại diện cho dấu ngoặc kép và thay thế tất cả các ký tự CR-LF cho LF.


0

Thông thường một dòng mới là "\ r \ n". Trong CSV của tôi, tôi đã thay thế "\ r" bằng giá trị trống. Đây là mã trong Javascript:

cellValue = cellValue.replace(/\r/g, "")

Khi tôi mở CSV trong MS Excel, nó hoạt động tốt. Nếu một giá trị có nhiều dòng, nó sẽ nằm trong 1 ô duy nhất trong bảng Excel.


0

Chỉ dành cho tệp Mở , cú pháp là

 ,"one\n
 two",...

Điều quan trọng là không có khoảng trống sau dấu "," đầu tiên. Thông thường không gian là tốt, và cắt nếu chuỗi không được trích dẫn. Nhưng nếu không thì khó chịu. Mất một lúc để tìm ra điều đó.

Sẽ không có vấn đề gì nếu dòng kết thúc \ n hoặc \ c \ n.

Hãy chắc chắn rằng bạn mở rộng thanh công thức để bạn thực sự có thể nhìn thấy văn bản trong ô (nhận được tôi sau một ngày dài ...)

Tất nhiên, bây giờ, File Open sẽ không hỗ trợ UTF-8 đúng cách (trừ khi người ta sử dụng các thủ thuật).

Excel> Dữ liệu> Nhận dữ liệu ngoài > Từ văn bản

Có thể được đặt chế độ UTF-8 (đó là danh sách các phông chữ). Tuy nhiên, trong trường hợp đó, các dòng mới dường như không hoạt động và tôi biết không có cách nào để khắc phục điều đó.

(Một điều có thể là sau 30 năm MS sẽ có được thứ này đúng.)


0

Trong Excel 365 trong khi nhập tệp:

Dữ liệu -> Từ Văn bản / CSV -> Chọn Tệp> Chuyển đổi dữ liệu -> Cấu hình nguồn dữ liệu -> Chọn Nguồn dữ liệu -> Nhấp vào Chỉnh sửa nguồn -> Trong danh sách ngắt dòng, chọn Bỏ qua ngắt dòng trong dấu ngoặc kép.

Các văn bản trên được dịch từ tiếng Bồ Đào Nha nên từ ngữ có thể khác trong tiếng Anh.


-1

bạn có thể làm tiếp theo "\"Value3 Line1 Value3 Line2\"". Nó hoạt động đối với tôi tạo tệp csv trong java


-2

Đây là một cách tiếp cận thú vị bằng cách sử dụng JavaScript ...

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  

-3

In một dòng mới HTML <br/>vào nội dung và mở trong excel sẽ hoạt động tốt trên mọi excel


-3

Bạn có thể sử dụng phím tắt ALT + Enter.

  1. Chọn ô bạn muốn chỉnh sửa
  2. vào chế độ chỉnh sửa bằng cách nhấp đúp vào nó hoặc nhấn F2 3.Nhấn Alt + enter. Điều này sẽ tạo ra một dòng mới trong ô

Làm thế nào để bạn tích hợp nó vào việc tạo tập tin CVS?
jikuja
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.