문제

프로그래밍 방식으로 데이터 (PHP 5.2 사용)를 .CSV 테스트 파일로 내보내고 있습니다.
예제 : Numéro 1 (악센트 e). 데이터는입니다 utf-8 (선불 BOM 없음).

MS Excel 에서이 파일을 열면 표시됩니다. Numéro 1.

텍스트 편집기 (Ultraedit)에서 이것을 올바르게 표시 할 수 있습니다. UE는 캐릭터가 decimal 233.

내가 어떻게 할 수있는 내보내기 텍스트 .CSV 파일의 데이터 MS Excel이 올바르게 렌더링됩니다 그것은 바람직하게는 수입 마법사 또는 비 디폴트 마법사 설정의 사용을 강요하지 않습니까?

도움이 되었습니까?

해결책

올바르게 형식화 된 UTF8 파일은 다음에 가질 수 있습니다 바이트 주문 마크 처음 3 개의 옥제로. 이것들은 16 진수 값 0xef, 0xBB, 0xBF입니다. 이 옥팅은 파일을 UTF8로 표시하는 역할을합니다 ( "바이트 주문"정보와 관련이 없기 때문입니다).1 이 BOM이 존재하지 않으면 소비자/독자는 텍스트의 인코딩 유형을 추론하도록 남겨 둡니다. UTF8이 아닌 독자는 바이트를 Windows-1252와 같은 다른 인코딩으로 읽고 문자를 표시합니다.  파일의 시작시.

파일 연관을 통해 UTF8 CSV 파일을 열면 Excel이 단일 바이트 인코딩에 있다고 가정하는 알려진 버그가 있습니다. 무시 UTF8 BOM의 존재. 이것은 할 수 있습니다 ~ 아니다 모든 시스템 기본 코드 코드 또는 언어 설정에 의해 수정됩니다. BOM은 Excel에서 단서를 제공하지 않을 것입니다. 단지 작동하지 않습니다. (소수의 보고서는 BOM이 때때로 "텍스트 가져 오기"마법사를 유발한다고 주장합니다.)이 버그는 Excel 2003 이상에 존재하는 것으로 보입니다. 대부분의 보고서 (여기서 답변 중)는 이것이 Excel 2007과 새로 고정되어 있다고 말합니다.

당신은 주목하십시오 ~할 수 있다 항상* "텍스트 가져 오기"마법사를 사용하여 Excel에서 UTF8 CSV 파일을 올바르게 엽니 다. 물론 이것은 훨씬 덜 편리합니다.

이 답변의 독자들은 그들이 Excel <2007을 특별히 지원하지 않지만 Raw UTF8 텍스트를 Excel에 보내는 상황에 처할 가능성이 높습니다. Ã 그리고 다른 유사한 Windows-1252 문자. UTF8 BOM을 추가하는 것은 아마도 가장 빠르고 가장 빠른 수정 일 것입니다.

Old Excels의 사용자가 고집되고 Excel이 CSV의 유일한 소비자 인 경우 UTF8 대신 UTF16을 내보내어이를 해결할 수 있습니다. Excel 2000 및 2003은 올바르게 올바르게 개봉합니다. (다른 텍스트 편집기는 UTF16에 문제가있을 수 있으므로 옵션을 신중하게 평가해야 할 수도 있습니다.)


* 당신이 할 수없는 경우를 제외하고, (적어도) Mac의 수입 마법사에 대한 Excel 2011은 실제로 말하는 것에 관계없이 항상 모든 인코딩과 함께 작동하지는 않습니다.u003C/anecdotal-evidence> :)

다른 팁

BOM ( ufeff)을 선불로 선제하면서 Excel이 파일을 UTF-8으로 인식했다. 그렇지 않으면 저장하고 가져 오기 마법사를 사용하는 것은 작동하지만 덜 이상적입니다.

아래는 Microsoft Excel을 사용자에게 보낼 때 프로젝트에서 사용하는 PHP 코드입니다.

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

업데이트 : 파일 이름 개선 및 버그 수정 정확한 길이 계산. 감사합니다 삼각 그리고 @ivanhoe011

Excel 버전의 모든 조합 (2003 + 2007) 및 파일 유형에 대한 답변

여기서 대부분의 다른 답변은 그들의 Excel 버전에만 해당되며 반드시 당신을 도울 수는 없습니다. 그들의 대답은 Excel 버전에 해당되지 않을 수 있기 때문입니다.

예를 들어, BOM 문자를 추가하면 자동 열 분리기 인식에 문제가 있지만 모든 Excel 버전에는 문제가 발생하지 않습니다.

대부분의 Excel 버전에서 작동하는지 결정하는 3 가지 변수가 있습니다.

  • 부호화
  • Bom 캐릭터 존재
  • 세포 분리기

SAP의 누군가가 모든 조합을 시도하고 결과를보고했습니다. 최종 결과? BOM 및 탭 문자와 함께 UTF16LE를 사용하여 분리기로 사용하여 대부분의 Excel 버전에서 작동하도록하십시오.

당신은 나를 믿지 않습니까? 나도 아니지만 여기를 읽고 울었어요 : http://wiki.sdn.sap.com/wiki/display/abap/csv+tests+of+ omencoding+and+column+ separator

가져올 때 UTF-8 Enconding을 선택하십시오. Office 2007을 사용하는 경우 파일을 열 자마자 선택한 위치입니다.

CSV 데이터를 출력하기 전에 Echo UTF-8 BOM. 이것은 Windows의 모든 문자 문제를 해결하지만 Mac에서는 작동하지 않습니다.

echo "\xEF\xBB\xBF";

Windows PC에서만 사용될 파일을 생성해야하기 때문에 나에게 작동합니다.

UTF-8은 BOM (U+FFEF 또는 0XEF, 0XBB, 0XBF, 0XBF, FARK)이 있거나없는 서비스 팩없이 Office 2007에서 작동하지 않습니다. SP3 설치는 0xef, 0xBB, 0xBF BOM이 작동 할 때 UTF-8을 작동시킵니다. 선불.

UTF-16은 0xff 0xef BOM과 함께 "UTF-16-LE"를 사용하여 Python에서 인코딩 할 때 작동하고 탭을 분리기로 사용합니다. BOM을 수동으로 작성한 다음 "UTF-16-LE"를 사용하여 "UTF-16"을 사용해야했습니다. 그렇지 않으면 각 Encode ()는 BOM을 기록한 모든 행에 선불 한 모든 행에 BOM을 선정했습니다. 두 번째 줄과 후.

지금은 돌아갈 수 없기 때문에 UTF-16이 SP를 설치하지 않고 작동하는지 여부를 알 수 없습니다. 한숨을 쉬다

이것은 Windows, Mac 사무실에 관한 Dunno에 있습니다.

두 작업 사례의 경우 브라우저에서 직접 다운로드를 시작할 때 가져 오기가 작동하며 텍스트 가져 오기 마법사는 간격이 없으므로 예상대로 작동합니다.

Fregal이 말했듯이 ufeff는 갈 길입니다.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

또한이 질문이 얼마 전에 "답변"이라는 것을 알았지 만 텍스트 마법사를 사용하지 않고 Excel에서 UTF8 인코딩 된 CSV 파일을 성공적으로 열 수 없다는 이야기를 이해하지 못합니다.

내 재현 가능한 경험 : 타입 Old MacDonald had a farm,ÈÌÉÍØ 메모장으로 Enter를 누른 다음 AS (UTF-8 옵션 사용)로 저장하십시오.

Python을 사용하여 실제로 거기에 무엇이 있는지 보여줍니다.

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

좋은. 메모장은 전면에 폭을 두었습니다.

이제 Windows Explorer로 이동하거나 파일 이름을 두 번 클릭하거나 마우스 오른쪽 버튼을 클릭하여 "Open with ..."를 사용하고 예상대로 디스플레이를 사용하여 Pops Excel (2003)을 사용하십시오.

확장 'XLS'와 함께 HTML 파일을 저장할 수 있으며 악센트가 작동합니다 (최소 2007 년 이전).

예 : 이것을 저장 (메모장에서 UTF8로 저장) : test.xls로 :

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

이것은 단지 문자 인코딩의 문제입니다. UTF-8의 UTF-8 : é로 데이터를 내보내는 것은 2 바이트 시퀀스 0xc3 0xa9이며 Windows-1252에서 해석 될 때 e입니다. 데이터를 Excel로 가져 오면 사용중인 문자 인코딩이 UTF-8임을 알려주십시오.

CSV 형식은 Excel에서 유니 코드가 아닌 ASCII로 구현되므로 Diacritics를 관리합니다. 우리는 공식 CSV 표준이 Excel에서 ASCII 기반으로 정의되었다는 것과 같은 문제를 경험했습니다.

출력 CSV 파일에 BOM을 작성하면 실제로 Django에서 나에게 효과가있었습니다.

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

더 많은 정보를 위해서 http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html 감사합니다!

내가 찾은 또 다른 솔루션은 결과를 Windows 코드 1252 (Windows-1252 또는 CP1252)로 인코딩하는 것입니다. 예를 들어 설정에 의해 수행됩니다 Content-Type 적절하게 같은 것 text/csv; charset=Windows-1252 응답 스트림의 문자 인코딩을 비슷하게 설정합니다.

UTF -8 BOM을 포함시키는 것이 반드시 좋은 아이디어는 아닙니다. Excel의 MAC 버전은이를 무시하고 실제로 BOM을 ASCII로 표시합니다. 스프레드 시트의 첫 번째 필드의 시작 부분에서 3 개의 불쾌한 문자…

파일을 생성하는 인코딩을 확인하고 Excel이 파일을 올바르게 표시하려면 시스템 기본 코드를 사용해야합니다.

Wich 언어를 사용하고 있습니까? .NET 인 경우 파일을 생성하는 동안 encoding.default 만 사용하면됩니다.

Excel 2007은 BOM (EF BB BF) 인코딩 된 CSV로 UTF-8을 올바르게 읽습니다.

Excel 2003 (및 아마도 이전)은 BOM (FF FE)과 함께 UTF-16LE를 읽지 만 쉼표 나 세미콜론 대신 탭을 읽습니다.

적절한 바이트 주문 마크부터 TAB 분리 된 Little-Endian UTF-16으로 CSV가 Excel 2007에서 제대로 구문 분석 할 수 있습니다.

VB.NET에 저와 마찬가지로 레거시 코드가있는 경우 다음 코드가 저에게 효과적이었습니다.

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

문제를 해결하는 방법을 찾았습니다. 이것은 불쾌한 해킹이지만 작동합니다. 오픈 오피스, 그런 다음 Excel 형식으로 저장하십시오. 결과 .xls 또는 .xlsx 강조 된 문자를 표시합니다.

Ruby 1.8.7을 사용하면 모든 필드를 UTF-16으로 인코딩하고 BOM (아마도)을 폐기합니다.

다음 코드는 active_scaffold_export에서 추출됩니다.

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

중요한 선은 다음과 같습니다.

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

Notepad ++ CLIC로 CSV 파일을 열면 Encode에서 UTF-8으로 변환 (BOM없이 UTF-8으로 변환하지 않음)을 선택하십시오. Christophe Grison을 도와주는 Excel Hope와 함께 Double Clic에 의해 열기를 저장하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top