2011-05-10 4 views
8

나는 데이터 테이블에 저장된 일부 데이터를 내보내려고합니다. 이러한 값 중 일부에는 줄 바꿈이 있습니다. 이제 엑셀 (2010)에서 파일을 가져오고 가져올 때마다 실제 줄 바꿈 대신 새 줄로 인식됩니다.생성 된 CSV 파일에서 줄 바꿈이 나에게 미치게 함

몇 시간 동안 검색했지만 많은 해결책을 찾았지만 해결되지 않은 것 같습니다.

방법 I 출력 내 csv 파일 : 이 (가변 csvfile은 모두 StringBuilder입니다)

context.Response.Clear(); 
context.Response.ContentType = "text/csv"; 
context.Response.ContentEncoding = System.Text.Encoding.UTF8; 
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".csv"); 
context.Response.Write(csvfile.ToString()); 
context.Response.End(); 

내가 수동으로 엑셀로 열 때, 그것은 잘 표시됩니다. 그러나 Excel 2003은 파일 형식을 지원하지 않기 때문에 가져와야합니다. 가져 오기를 사용하면 줄 바꿈 (필드의 \ n)이 새 행으로 표시됩니다.

불행하게도 나는 (이 모든 개인 데이터의) 당신에게 내가 작업 실제 데이터의 예를 줄 수 없다,하지만 난 당신이 잘못 방법의 예를 제공 할 수 있습니다 : 그것은 간단

Header1,Header2,Header3 
"value1","value2","value 3 
and this is where its going wrong" 

을 CSV 파일을 가져 오면 가져올 때 잘못 된 부분을 볼 수 있습니다. 기본적으로 큰 따옴표로 필드를 캡슐화합니다. 또한 기본적으로 값에서 선행 공백을 제거합니다.

나는이 겉으로보기에는 간단한 문제에 적어도 2 일을 보냈지 만, 내 인생에서 나는 그것을 고칠 수있는 방법을 알 수 없다. 이 같은 문제에 대해 여러 주제를 봤지만 해결 된 솔루션은 없습니다.

+0

줄 바꿈을 유지해야합니까? –

+1

그래, 나는 linebreaks가 데이터에 아주 중요하다고 생각한다. –

+1

이 질문보기 http://stackoverflow.com/questions/1241220/generating-csv-file-for-excel-how-to-have-a-newline-inside-a-value –

답변

3

이이 파일을 가져 오기로 Excel을 속일 수 .csv에 파일 이름, 나를 위해 작동 :

A) Response.ContentEncoding = System.Text.Encoding.UTF8를 설정하지 않습니다 Excel에서 UTF-8 파일을 올바르게 열 수있을만큼 충분합니다. 대신 수동으로 엑셀 파일의 바이트 순서 마크 (BOM) 헤더를 작성해야 :

if (UseExcel2003Compatibility) 
    { 
     // write UTF-16 BOM, even though we export as utf-8. Wrong but *I think* the only thing Excel 2003 understands 
     response.Write('\uFEFF'); 
    } 
    else 
    { 
     // use the correct UTF-8 bom. Works in Excel 2008 and should be compatible to all other editors 
     // capable of reading UTF-8 files 
     byte[] bom = new byte[3]; 
     bom[0] = 0xEF; 
     bom[1] = 0xBB; 
     bom[2] = 0xBF; 
     response.BinaryWrite(bom); 
    } 

B)와 파일 이름을 사용, 진수 스트림으로 보냅니다.

response.ContentType = "application/octet-stream"; 
response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

C) 엑셀 필드를 포함, 올바르게 다음과 같이 다운로드 한 파일을 엽니 다

난 그냥 확인 모든 필드에 나를 위해 큰 따옴표를 사용하십시오 HTTP 스펙에서 요구하는대로 CSV 확장 및 파일 이름을 인용 할 줄 바꿈과 함께.

그러나 Excel에서는 여전히 ","와 다른 기본 구분 기호가있는 모든 시스템에서 해당 CSV를 올바르게 열지 않습니다. 예 : 사용자가 독일 국가 별 설정으로 설정된 Windows 시스템에서 Excel을 실행하는 경우 쉼표 대신 구분 기호로 세미콜론이 필요하기 때문에 Excel에서 파일을 올바르게 열지 않습니다. 나는 그것에 대해 할 수있는 일이 없다고 생각합니다.

+5

실제로는 있지만 매우 모호한 특징이 있습니다. 이것을 csv의 첫 번째 줄로 쓸 수 있습니다. sep =, 로켈에 관계없이 Excel에서 동일한 구분 기호를 사용하게합니다. –

+0

니스, 나는 이것을 몰랐다. 감사. –

1

개행이 새 레코드를 나타내므로 CSV 필드에 개행을 사용할 수 있다고 생각하지 않습니다. 문자열에 추가하기 전에 필드 값의 모든 뉴 라인을 바꿀 수 있습니까? 또는 엑셀 파일을 만들 수 있습니다. 필드에 개행을 허용해야합니다.

+5

CSV 파일에 줄이 허용됨 들판에서 부서진다. –

1

필드가 제대로 큰 따옴표로 묶여있는 한 CSV 파일에서 줄 바꿈을 사용할 수 있습니다. 여기서 문제는 Excel에서 레코드를 올바르게 가져 오는 것입니다.

이 몇 가지 가능한 솔루션으로, 사이트에서 이전에 요청되었습니다

  • 는 ASCII 또는 UTF-8로 출력 파일의 인코딩을 설정합니다. 질문에서 UTF-8로 설정 했으므로 ASCII를 다음에 시도하십시오. (link)

  • 변경 올바르게 (link)

+0

아스키도 시도해 보았지만 아무런 결과도 없었습니다. 나는 그 질문이 여러 번 전에 물어 보았다는 것을 안다. 나는 각각의 모든 솔루션을 읽고 시도해 보았습니다. 그러나 어떤 이유로 그것은 제대로 가져 오기를 원하지 않습니다. –

0

BOM이 포함 된 UTF 파일은 Excel이 따옴표로 묶인 경우에도 새 줄을 문자 그대로 처리합니다. (테스트 된 Excel 2008 Mac)

해결책은 줄 바꿈 대신 새 줄을 캐리지 리턴 (CHR 13)으로 만드는 것입니다.

0

나는 동일한 문제가있었습니다. 섹션에서 this blog을 탐색하는 동안 나는 솔루션에 도착했다 - "수출을 Excel로 적절한 서식 :"

string brstyle = @"<style>br { mso-data-placement:same-cell; }</style>"; 

Response.Write(brstyle); 

Response.Write(stringWriter.ToString()); 

그것은 나를 위해 일한

다음과 같이 내 코드를 수정했습니다. 이제 줄 바꿈이있는 텍스트는 각 줄 바꿈마다 새 셀 (행)이 아닌 단일 셀에 나타납니다.

관련 문제