Làm cách nào tôi có thể xuất CSV UTF-8 trong PHP mà Excel sẽ đọc đúng?


191

Tôi đã có một điều rất đơn giản là chỉ xuất ra một số nội dung ở định dạng CSV, nhưng nó phải là UTF-8. Tôi mở tệp này trong TextEdit hoặc TextMate hoặc Dreamweaver và nó hiển thị đúng các ký tự UTF-8, nhưng nếu tôi mở nó trong Excel thì nó sẽ làm điều đó thật ngớ ngẩn. Đây là những gì tôi đã nhận được ở phần đầu của tài liệu của mình:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Tất cả điều này dường như có hiệu ứng mong muốn ngoại trừ Excel (Mac, 2008) không muốn nhập nó đúng cách. Không có tùy chọn nào trong Excel để tôi "mở dưới dạng UTF-8" hoặc bất cứ điều gì, vì vậy, tôi cảm thấy hơi khó chịu.

Tôi dường như không thể tìm thấy bất kỳ giải pháp rõ ràng nào cho vấn đề này ở bất cứ đâu, mặc dù có rất nhiều người có cùng một vấn đề. Điều tôi thấy nhiều nhất là bao gồm BOM, nhưng tôi không thể tìm ra chính xác làm thế nào để làm điều đó. Như bạn có thể thấy ở trên tôi chỉ lấy echodữ liệu này, tôi không viết bất kỳ tập tin nào. Tôi có thể làm điều đó nếu tôi cần, tôi chỉ không làm vậy vì dường như không cần nó vào thời điểm này. Có ai giúp đỡ không?

Cập nhật: Tôi đã thử lặp lại BOM echo pack("CCC", 0xef, 0xbb, 0xbf);mà tôi vừa lấy từ một trang đang cố gắng phát hiện BOM. Nhưng Excel chỉ thêm ba ký tự đó vào ô đầu tiên khi nó nhập và vẫn làm rối các ký tự đặc biệt.


2
Excel không cung cấp tùy chọn để điều chỉnh bộ ký tự của tệp đến? Bạn có chắc chắn 100% về điều đó? Tôi không có một bản sao tiện dụng vì vậy tôi không thể thử nhưng tôi tưởng tượng phải có một hộp thả xuống ở đâu đó.
Pekka

Đây là Excel trên máy Mac - có vẻ hạn chế hơn Excel trên PC. Không có danh sách thả xuống nào trong hộp thoại Mở, ngoài loại tệp nào có thể mở. Tôi đã nhìn khắp nơi. Nếu nó ở đó, nó tối nghĩa. Tôi muốn nói chắc chắn 98%.
Ben Saufley

Microsoft office hay openoffice?
ajreal

Microsoft tốt hơn về vấn đề này, không có cách nào (mà tôi đã tìm thấy) để làm cho OpenOffice phát hiện bộ ký tự, thậm chí cả BOM. Khỉ thật.
Ciantic

BOM cũng không có hiệu lực trên Microsoft Excel 2008 cho Mac.
Ben Saufley

Câu trả lời:


134

Để trích dẫn một kỹ sư hỗ trợ của Microsoft ,

Excel cho Mac hiện không hỗ trợ UTF-8

Cập nhật, 2017 : Điều này đúng với tất cả các phiên bản Microsoft Excel cho Mac trước Office 2016 . Các phiên bản mới hơn (từ Office 365) hiện hỗ trợ UTF-8.

Để xuất nội dung UTF-8 mà Excel cả trên Windows và OS X sẽ có thể đọc thành công, bạn sẽ cần thực hiện hai điều:

  1. Đảm bảo rằng bạn chuyển đổi văn bản CSV UTF-8 của mình thành UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Đảm bảo rằng bạn thêm dấu thứ tự byte UTF-16LE vào đầu tệp

    chr(255) . chr(254)

Vấn đề tiếp theo chỉ xuất hiện với Excel trên OS X (chứ không phải Windows) sẽ là khi xem tệp CSV có giá trị được phân tách bằng dấu phẩy, Excel sẽ chỉ hiển thị các hàng với một hàng và tất cả văn bản cùng với dấu phẩy ở hàng đầu tiên.

Cách để tránh điều này là sử dụng các tab làm giá trị tách biệt của bạn.

Tôi đã sử dụng chức năng này từ các bình luận PHP (sử dụng các tab "\ t" thay vì dấu phẩy) và nó hoạt động hoàn hảo trên OS X và Windows Excel.

Lưu ý rằng để khắc phục sự cố với một cột trống ở cuối hàng, tôi đã phải thay đổi dòng mã có nội dung:

    $field_cnt = count($fields);

đến

    $field_cnt = count($fields)-1;

Như một số ý kiến ​​khác trên trang này cho biết, các ứng dụng bảng tính khác như OpenOffice Calc, Số riêng của Apple và Bảng tính của Google Doc không có vấn đề gì với các tệp UTF-8 có dấu phẩy.

Xem bảng trong câu hỏi này để biết những gì hoạt động và không hoạt động đối với các tệp Unicode CSV trong Excel


Là một lưu ý phụ, tôi có thể thêm rằng nếu bạn đang sử dụng Trình soạn thảo , bạn nên xem qua việc thêm League\Csvvào yêu cầu của bạn. League\Csvmột API thực sự tốt để xây dựng các tệp CSV .

Để sử dụng League\Csvvới phương pháp tạo tệp CSV này, hãy xem ví dụ này


1
Gọi tôi là ngu ngốc, nhưng tôi không thể làm việc này. Tôi đã chuyển đổi dữ liệu của mình bằng hàm mb_convert_encoding và xuất BOM trước nội dung tệp, nhưng tôi chỉ nhận được một hàng ký tự tiếng Trung khi tôi mở tệp trong Excel. Hiện tại tôi vẫn đang sử dụng dấu phẩy chứ không phải các tab, nhưng có lẽ điều đó không gây ra những gì tôi đang thấy.
John Rix

@JohnRix thật lạ. Mã này đã giải quyết đúng mọi vấn đề tôi từng gặp phải với các tệp CSV được xuất - ngoại trừ các nhà nhập khẩu sẽ chỉ chấp nhận dấu phẩy. Bạn có thể vui lòng gửi cho tôi một pastebin của mã bạn đang sử dụng, cùng với một mảng mà bạn đang chuyển thành CSV và một bản sao của tệp đã xuất không?
Tim Groeneveld

2
Giải pháp này cũng đã giải quyết vấn đề UTF8 cho tôi trên Mac và Windows. Tôi cũng thấy rằng việc thêm một dòng bằng sep=;hoặc sep=,vào tệp CSV sẽ cho Excel biết cách CSV được phân tách và các cột sẽ được tạo lại một cách chính xác.
Luc Wollants

5
Tôi thấy rằng mọi thứ bị cắt xén nếu tôi bắt đầu chuỗi chỉ là BOM, sau đó trên một dòng khác được thêm vào "sep=,\n", sau đó trên một dòng khác đã thêm dữ liệu. Mọi thứ đều ổn nếu tôi làm tất cả trong một dòng ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Bây giờ mọi thứ đều tuyệt vời trên Mac. Tôi không có Windows để kiểm tra.
run rẩy

2
Chỉ có điều đó làm việc đầy đủ cho tôi. Sự không nhất quán của Microsoft không bao giờ hết làm tôi ngạc nhiên. Lưu tệp csv bình thường sử dụng "," làm dấu phân cách nhưng nếu có BOM, nó sẽ lưu bằng "\ t" vì một số lý do. Chữ C trong .csv là viết tắt của "COMMA" chết tiệt. Nó thực sự không khó để làm.
Phil

288

Tôi có cùng một vấn đề (hoặc tương tự).

Trong trường hợp của tôi, nếu tôi thêm BOM vào đầu ra, nó hoạt động:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

Tôi tin rằng đây là một hack khá xấu, nhưng nó hoạt động với tôi, ít nhất là cho Windows 2007 Windows. Không chắc chắn nó sẽ hoạt động trên Mac.


10
Xấu xí, nhưng siêu hữu ích. Cảm ơn bạn.
abelito

7
Tôi khá chắc chắn rằng điều này không hoạt động tốt trên OS X, thật không may. Tôi nghĩ rằng nó thực sự có thể hiển thị BOM khi bạn nhập (cảnh báo: ký ức mơ hồ.)
davidtbernal

2
Chính xác. Ít nhất, tôi đã thử chuẩn bị trước một BOM, như trong ví dụ trên, nhưng thực sự nó chỉ hiển thị một số ký tự ngộ nghĩnh lúc đầu và tiếp tục hiển thị các ký tự đặc biệt sai (đã thử nghiệm trong Excel 2011). Điều này dường như hoạt động tốt nhất đối với tôi trong tất cả các cài đặt: stackoverflow.com/a/1648671/1005334 (sử dụng PHP).
kasimir

4
Tôi tiếp tục nhận được thông báo về câu hỏi này vì rõ ràng có rất nhiều người khác vấp phải nó. Tôi ước tôi có thể đánh dấu điều này là chính xác, bởi vì nó đã được nâng cấp rất nhiều. Thật không may, cuối cùng tôi đã đưa ra giải pháp này (đã bỏ dự án đó từ lâu) và nó không hoạt động với tôi trong Excel 2008 cho Mac. Vui mừng vì nó làm việc cho bạn. Tôi đã đưa ra giải pháp. Nhưng nó không giải quyết được vấn đề Excel cho Mac 2008. Nếu bất cứ ai gặp may mắn trên Mac, chắc chắn cho tôi (và dường như tất cả mọi người ) biết.
Ben Saufley

Hoạt động tuyệt vời khi xuất tệp CSV sang MS Excel Starter 2010. Cảm ơn rất nhiều!
Jamie Dexter

32

Đây là cách tôi đã làm (đó là để nhắc trình duyệt tải xuống tệp csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Điều duy nhất nó đã khắc phục sự cố mã hóa UTF8 trong bản xem trước CSV khi bạn nhấn thanh không gian trên Mac .. nhưng không phải trong Excel Mac 2008 ... không biết tại sao


1
Dòng mã UTF-8 BOM tiết kiệm ngày của tôi với việc xuất sang xls
Mladen Janjetovic

6
Tôi đang tìm cách để xuất trực tiếp ra trình duyệt dưới dạng utf8, khi tôi bắt gặp bài đăng này, đây là giải pháp của tôi với các khoản tín dụng cho bài đăng này cho BOM và tiêu đề chuyển nhị phân. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye

Typo - loại bỏ gấp đôi )).
sitilge

22

Tôi chỉ giải quyết cùng một vấn đề, và đưa ra hai giải pháp.

  1. Sử dụng lớp PHPExcel theo đề xuất của bpeterson76 .

    • Sử dụng lớp này tạo ra tệp tương thích rộng rãi nhất, tôi có thể tạo tệp từ dữ liệu được mã hóa UTF-8 đã mở tốt trong Excel 2008 Mac, Excel 2007 Windows và Google Docs.
    • Vấn đề lớn nhất khi sử dụng PHPExcel là nó chậm và sử dụng nhiều bộ nhớ, đây không phải là vấn đề đối với các tệp có kích thước hợp lý, nhưng nếu tệp Excel / CSV của bạn có hàng trăm hoặc hàng nghìn hàng, thư viện này sẽ không sử dụng được .
    • Đây là một phương thức PHP sẽ lấy một số dữ liệu TSV và xuất tệp Excel ra trình duyệt, lưu ý rằng nó sử dụng Trình ghi Excel5, có nghĩa là tệp phải tương thích với các phiên bản Excel cũ hơn, nhưng tôi không còn có quyền truy cập vào bất kỳ, vì vậy tôi không thể kiểm tra chúng

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
  2. Do các vấn đề về hiệu quả với PHPExcel, tôi cũng đã phải tìm ra cách tạo tệp CSV hoặc TSV tương thích UTF-8 & Excel.

    • Điều tốt nhất tôi có thể đưa ra là một tệp tương thích với Excel 2008 Mac và Excel 2007 PC, nhưng không phải Google Docs, đủ tốt cho ứng dụng của tôi.
    • Tôi đã tìm thấy giải pháp ở đây , cụ thể, câu trả lời này , nhưng bạn cũng nên đọc câu trả lời được chấp nhận vì nó giải thích vấn đề.
    • Đây là mã PHP tôi đã sử dụng, lưu ý rằng tôi đang sử dụng dữ liệu tsv (các tab dưới dạng dấu phân cách thay vì dấu phẩy):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;

Tôi đang gặp vấn đề tương tự trên Windows-7 Excel 2007 và đã thử tất cả đề xuất nhưng không thành công :(
PHP Ferrari

Giải pháp UTF-16LE là giải pháp hiệu quả. Lưu ý rằng bạn phải định dạng tsv chính xác và nó phải là tsc, do đó, tab được phân cách, không được phân cách bằng dấu phẩy. Xem thêm bài viết của Marc tại đây: stackoverflow.com/a/1648671/1697370
Ellert van Koperen

16

Tôi đã có cùng một vấn đề và nó đã được giải quyết như dưới đây:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();

12

Excel không hỗ trợ UTF-8. Bạn phải mã hóa văn bản UTF-8 của mình thành UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
Sử dụng tốt hơn UTF-16LE như đề xuất ở trên, bao gồm mọi nhân vật tồn tại.
Ellert van Koperen

Tôi đã nhận thấy mb_convert_encoding này đang hoạt động tốt và hiển thị chính xác các dấu phụ trong tệp XLS đã xuất của tôi. Tôi có cấu hình mặc định của mysql và apache + php được thiết lập để hoạt động với utf-8
Junior Mayhé

10

Trong trường hợp của tôi, hoạt động sau rất hay để tạo tệp CSV có ký tự UTF-8 được hiển thị chính xác trong Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

Các 0xEF 0xBB 0xBFtiêu đề BOM sẽ cho Excel biết mã hóa chính xác.


1
lớn lên cho bạn bro <3
Adrien G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- đây chính xác là những gì tôi cần. Nó hoạt động như một say mê.
Alex

8

Để theo dõi về điều này:

Có vẻ như vấn đề chỉ đơn giản là với Excel trên Mac. Đó không phải là cách tôi tạo các tệp, bởi vì ngay cả việc tạo CSV từ Excel cũng phá vỡ chúng. Tôi lưu dưới dạng CSV và nhập lại, và tất cả các ký tự bị rối tung.

Vì vậy, có vẻ như không có câu trả lời chính xác cho vấn đề này. Cảm ơn tất cả những lời đề nghị.

Tôi muốn nói rằng từ tất cả những gì tôi đã đọc, đề xuất của @Daniel Magliola về BOM có lẽ sẽ là câu trả lời tốt nhất cho một số máy tính khác. Nhưng nó vẫn không giải quyết được vấn đề của tôi.


Vì hỗ trợ UTF8 không nhất quán trên Mac so với Windows, nên cách tốt nhất là sử dụng mã hóa hoàn toàn khác. Tôi đã tìm thấy cp1252 thường chơi tốt với các công cụ của Microsoft. vi.wikipedia.org/wiki/Windows-1252
s29

1
Ben, có một câu trả lời đúng cho câu hỏi này :) Xem của tôi!
Tim Groeneveld

7

Điều này hoạt động tốt trong excel cho cả Windows và Mac OS.

Khắc phục các sự cố trong excel không hiển thị các ký tự có chứa dấu phụ, chữ cái, chữ Hy Lạp và ký hiệu tiền tệ.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}

giải pháp này cho phép tôi thực hiện xuất khẩu cho Google Sheets (một số khác không thành công)
Cafn

6

Tập tin CSV bao gồm Dấu thứ tự Byte.

Hoặc như đã đề xuất và cách giải quyết, chỉ lặp lại nó với phần thân HTTP


4

Vì mã hóa UTF8 không chơi tốt với Excel. Bạn có thể chuyển đổi dữ liệu sang loại mã hóa khác bằng cách sử dụngiconv() .

ví dụ

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Đây là giải pháp duy nhất phù hợp với tôi với Excel Mac 2011
Christer Fernstrom

4

Thêm vào:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Hoặc là:

fprintf($file, "\xEF\xBB\xBF");

Trước khi viết bất kỳ nội dung nào vào tệp CSV.

Thí dụ:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);

3

Chuyển đổi văn bản đã được mã hóa utf-8 bằng cách sử dụng mb_convert_encodinglà không cần thiết. Chỉ cần thêm ba ký tự ở phía trước của nội dung gốc:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Đối với tôi điều này đã giải quyết vấn đề của các ký tự đặc biệt trong các tệp csv.


Không thể tin được; Tôi đã thử ít nhất 10 giải pháp khác và giải pháp duy nhất đối với tôi dường như là giải pháp này, khi kết hợp với UTF-8 BOM thông qua fputs.
kaarto

2

Khi tôi điều tra và tôi thấy rằng UTF-8 không hoạt động tốt trên MAC và Windows nên tôi đã thử với Windows-1252, nó hỗ trợ tốt cho cả hai nhưng bạn phải chọn loại mã hóa trên ubfox. Đây là mã của tôi$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}

2
Nói chung, câu trả lời sẽ hữu ích hơn nhiều nếu chúng bao gồm một lời giải thích về những gì mã được dự định làm và tại sao điều đó giải quyết vấn đề mà không giới thiệu người khác.
Tim Diekmann

1

Làm thế nào về việc chỉ xuất ra cho chính Excel? Đây là một lớp tuyệt vời cho phép bạn tạo các tệp máy chủ XLS phía máy chủ. Tôi sử dụng nó thường xuyên cho các khách hàng không thể "tìm ra" csv và cho đến nay chưa bao giờ có khiếu nại. Nó cũng cho phép một số định dạng bổ sung (tô bóng, xếp hàng, tính toán, v.v.) mà csv sẽ không bao giờ làm.


Xin lưu ý rằng phpexcel có vấn đề với số lượng dữ liệu.
Ellert van Koperen

1

bạn có thể chuyển đổi Chuỗi CSV của mình bằng iconv . ví dụ:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );

Các văn bản mẫu tuyệt vời;)
ngeek

1

Bạn phải sử dụng mã hóa "Windows-1252".

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Có lẽ bạn phải chuyển đổi chuỗi của mình:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}

1

Bạn có thể nối 3 byte vào tệp trước khi xuất, nó hoạt động với tôi. Trước khi làm hệ thống đó chỉ hoạt động trong Windows và HP -UX nhưng không thành công trong Linux.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

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

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ị


1

Tôi đang dùng Mac, trong trường hợp của tôi, tôi chỉ phải xác định dấu phân cách "sep=;\n"và mã hóa tệp trong UTF-16LE như thế này:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

1

Đối với tôi không có giải pháp nào ở trên làm việc. Dưới đây là những gì tôi đã làm để giải quyết vấn đề: sửa đổi giá trị bằng cách sử dụng hàm này trong mã PHP:

$value = utf8_encode($value);

Giá trị đầu ra này đúng trong một bảng excel.


0

Tôi gặp vấn đề tương tự khi tôi có thói quen VBA Excel nhập dữ liệu. Vì CSV là định dạng văn bản đơn giản, tôi đã xử lý vấn đề này bằng cách lập trình mở dữ liệu trong trình chỉnh sửa tệp đơn giản như wordpad và lưu lại dưới dạng văn bản unicode hoặc sao chép nó vào bảng tạm từ đó và dán nó vào Excel. Nếu excel không tự động phân tích CSV thành các ô, điều này có thể được khắc phục dễ dàng bằng tính năng "Chuyển văn bản thành cột" tích hợp.


Tôi đã thử nó! Nhưng nó đã được mã hóa thành văn bản unicode, lưu nó dưới dạng văn bản unicode không thay đổi bất cứ điều gì. Làm thế nào tôi có thể lưu nó dưới dạng văn bản đơn giản mà không diễn giải không chính xác tất cả các ký tự đặc biệt?
Ben Saufley

Tôi nghĩ bằng cách "lưu nó dưới dạng văn bản Unicode", Alain có thể có nghĩa là "UTF-16LE". Windows thường (đáng buồn) sử dụng "Unicode" để tham chiếu không chính xác đến UTF-16LE hoặc UTF-16LE với BOM hàng đầu. Tệp của Notepad -> Hộp thoại Lưu sử dụng "Unicode" theo cách này.
Thanatos

0

Có phải sự cố vẫn xảy ra khi bạn lưu nó dưới dạng tệp .txt và chúng mở nó trong excel với dấu phẩy là dấu phân cách?

Vấn đề có thể không phải là mã hóa, có thể là tệp không phải là một CSV hoàn hảo theo tiêu chuẩn excel.


Theo tôi biết, định dạng CSV là tốt. Tôi có thể tạo một CSV "hoàn hảo" trong TextEdit, không có vấn đề gì, hoặc thậm chí đổi tên một txt thành csv, vì vậy nó không thiếu bất cứ điều gì bí mật - CSV chỉ là các tệp văn bản. Thêm vào đó, định dạng hoàn hảo trong Excel, đó chỉ là các ký tự đặc biệt bị phá vỡ. Nhưng chỉ trong trường hợp, tôi đã thử đề xuất của bạn, và thật đáng buồn khi tạo ra những vấn đề tương tự.
Ben Saufley

Từ "WTF, họ đã nghĩ": lưu ý rằng theo Microsoft, bộ tách trường chính xác phụ thuộc vào miền địa phương. Tệp 'được phân tách bằng dấu phẩy' có thể yêu cầu các trường thực sự được phân tách bằng dấu chấm phẩy ở một số địa phương - và bạn không thể làm gì ngoài việc đề xuất OpenOffice
djn

điều đó thật điên rồ - thật không may, tôi không gặp khó khăn trong việc phân định các lĩnh vực. Tôi chỉ gặp rắc rối với những nhân vật đặc biệt này.
Ben Saufley

0

Bài đăng này khá cũ, nhưng sau nhiều giờ cố gắng, tôi muốn chia sẻ giải pháp của mình. Có lẽ nó giúp ai đó xử lý Excel và Mac và CSV và vấp phải mối đe dọa này. Tôi đang tạo một csv động như đầu ra từ Cơ sở dữ liệu với người dùng Excel. (UTF-8 với BOM)

Tôi đã thử rất nhiều iconv, nhưng không thể lấy được tiếng Đức làm việc trong Mac Excel 2004. Một giải pháp: PHPExcel. Nó là tuyệt vời nhưng đối với dự án của tôi một chút quá nhiều. Điều làm việc cho tôi là tạo tệp csv và chuyển đổi tệp csv này thành xls với PHPsnippet: csv2xls này . kết quả xls hoạt động với các ô tiếng Đức excel (ä, ö, Ü, ...).


0

Tôi vừa thử các tiêu đề này và nhận Excel 2013 trên PC Windows 7 để nhập tệp CSV với các ký tự đặc biệt chính xác. Dấu thứ tự Byte (BOM) là khóa cuối cùng làm cho nó hoạt động.

    tiêu đề ('Mã hóa nội dung: UTF-8');
    tiêu đề ('Kiểu nội dung: text / csv; charset = UTF-8');
    tiêu đề ("Bố trí nội dung: tệp đính kèm; filename = filename.csv");
    tiêu đề ("Thực dụng: công khai");
    tiêu đề ("Hết hạn: 0");
    tiếng vang "\ xEF \ xBB \ xBF"; // UTF-8 BOM


Vâng, đó là chính xác, nó sẽ hoạt động chính xác trong Excel cho Windows, nhưng như được giải thích trong câu trả lời của tôi, nó sẽ không hoạt động trên Excel cho OS X.
Tim Groeneveld

0

Nếu không, bạn có thể:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

0

Giải pháp EASY cho Mac Excel 2008: Tôi đã vật lộn với điều này rất nhiều lần, nhưng đây là cách khắc phục dễ dàng của tôi: Mở tệp .csv trong Textwrangler để mở chính xác các ký tự UTF-8 của bạn. Bây giờ trong thanh trạng thái dưới cùng, thay đổi định dạng tệp từ "Unicode (UTF-8)" thành "Western (ISO Latin 1)" và lưu tệp. Bây giờ, hãy truy cập Mac Excel 2008 của bạn và chọn Tệp> Nhập> Chọn csv> Tìm tệp của bạn> trong Nguồn gốc tệp, chọn "Windows (ANSI)" và voila các ký tự UTF-8 đang hiển thị chính xác. Ít nhất nó có nghĩa với tôi...


0

Tôi sử dụng nó và nó hoạt động

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;

0

#output một CSV UTF-8 trong PHP mà Excel sẽ đọc đúng.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

Một câu trả lời cho mỗi người là đủ. Trong tương lai hãy nhớ rằng bạn có thể thêm thông tin vào câu trả lời của mình bất cứ lúc nào, bạn không cần phải tạo 2
RiggsFolly

-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));

Câu hỏi này không hỏi làm thế nào để chuyển đổi, nó hỏi làm thế nào để đầu ra. Phần có liên quan của đóng góp này, xuất ra trong UTF-16, đã được đóng góp trong Câu trả lời được chọn .
Ben Saufley

@BenSaufley Vâng, nhưng nó giải quyết vấn đề của câu hỏi với 2 dòng mã đơn giản
b3wii

Câu hỏi đã được giải quyết, và cũng được giải thích kỹ lưỡng hơn.
Ben Saufley
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.