Excel için CSV dosyası oluşturma, bir değerin içinde yeni satırın olması


158

Excel için bir dosya oluşturmanız gerekiyor, bu dosyadaki bazı değerler birden çok satır içeriyor.

orada da İngilizce olmayan bir metin var, bu yüzden dosya Unicode olmalı.

Oluşturduğum dosya şu şekilde görünüyor: (UTF8'de, İngilizce olmayan metinler karışık ve çok satırlı)

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

Çok satırlı değerin, normal bir günlük satırsonu ile çift tırnak içine alındığını unutmayın.

Web'de bulduğum şeye göre bunun çalışması gerekiyordu, ancak en azından Excel 2007 ve UTF8 dosyalarını kazanmıyor, Excel 3. satırı ilk veri satırının ikinci satırı olarak değil, ikinci veri satırı olarak ele alıyor .

Bu benim müşteri makineleri üzerinde çalıştırmak zorunda ve ben onların Excel sürümü üzerinde hiçbir kontrol var, bu yüzden Excel 2000 ve üstü ile çalışacak bir çözüm gerekir.

Teşekkürler

DÜZENLEME: Biri Excel (Unicode, sekmeyle ayrılmış, alanlarda yeni satır yok) ve diğeri dünyanın geri kalanı için (UTF8, standart CSV) olmak üzere iki CSV seçeneğiyle "sorunumu" çözdüm.

Aradığım şey değil ama en azından işe yarıyor (şimdiye kadar)


1
Bilginize: Tüm bunlar LibreOffice'de mükemmel bir şekilde çalışıyor ve bir CSV'yi içe aktarmak ilk etapta çok daha kolay.
user2061057

9
Ekstra alanlarla ilgili kabul edilen cevap, sorularınızı düzenlediğiniz ve boşlukları kaldırdığınız için inanılmaz derecede kafa karıştırıcı ...
Matti Virkkunen

Yanıtlar:


70

SADECE boşluk karakterlerinin verilerin bir parçası olduğu alanların başında boşluk karakterleri olmalıdır. Excel önde gelen boşlukları çıkarmaz. Başlıklarınızda ve veri alanlarınızda istenmeyen boşluklar alacaksınız. Daha da kötüsü, alanın "başında olmadığı için üçüncü sütundaki satır sonunu "korumak" gerekir.

Dosyada ASCII olmayan karakterler (UTF-8 ile kodlanmış) varsa, dosyanın başında bir UTF-8 BOM (3 bayt hex EF BB BF) olmalıdır. Aksi takdirde Excel, verileri utf-8 yerine yerel ayarınızın varsayılan kodlamasına (örn. Cp1252) göre yorumlar ve ASCII olmayan karakterleriniz çöpe atılır.

Excel 2003, 2007 ve 2013 için aşağıdaki yorumlar geçerlidir; Excel 2000'de test edilmedi

Dosyayı Windows Gezgini'nde çift tıklatarak açarsanız, her şey yolunda gider.

Excel içinden açarsanız, sonuçlar değişir:

  1. Dosyada yalnızca ASCII karakterleri var (ve BOM yok): çalışıyor.
  2. Başlangıçta UTF-8 BOM ile dosyada ASCII olmayan karakterler (UTF-8 olarak kodlanmış) var: verilerinizin UTF-8 olarak kodlandığını fark eder, ancak csv uzantısını yok sayar ve sizi Metne bırakır Maalesef satır sonu problemi ile sonuçlanan Sihirbazı değil, içe aktarın .

Seçenekler şunları içerir:

  1. Kullanıcıların dosyaları Excel içinden açmamaları için eğitin :-(
  2. Doğrudan bir XLS dosyası yazmayı düşünün ... Python / Perl / PHP / .NET / etc'de bunu yapmak için mevcut paketler / kütüphaneler var.

1
Teşekkürler, sorudaki önde gelen boşluklar sorununu çözdüm, CSV örneğini manuel olarak yazdım ve gerçek bir dosyadan kopyalayıp yapıştırmadım, gerçek dosya bu boşlukları içermiyor, iyi yakalama.
Nir

@Nir: Şimdi asıl problemin hakkında konuşalım. Bu, UTF-8 ürün ağacına sahip olduğunuz ve dosyayı Excel'in içinden açtığınız ve Metin Alma Sihirbazı'nın Value3 satırsonunuzun "korunması" gerektiğini fark etmediği anlamına gelir - doğru mu? Ya da belki bir UTF-8 ürün ağacınız yoktu ve TIW'a verilerinizin UTF-8 kodlu olduğunu ve hala yeni satırı tıklattığını söylemelisiniz?
John Machin

Kullanmak istersem ne olur? alan ayırıcı olarak, yeni satır kayıt ayırıcı olarak "metin alanlarının içeriğini korumak için kullanın; metin alanları |," ve yeni satır içerebilir. Mümkün mü?
Giorgio

1
Bilginize: Redmine sisteminden Excel2007 ve CSV ihraç ettim. Başlangıçta UTF-8 BOM (EFBBBF) ekledikten sonra Excel dosyayı mükemmel bir şekilde açtı. "Sorun açıklaması" sütununa katıştırılan yeni satırlar doğru şekilde işlenir ve satır yapısı zarar görmez ve tüm ulusal karakterler düzgün okunur (UTF8 BOM olmadan okurken çöpe atıldı). Excel, metin alma sihirbazını bile görüntülememiştir. Şu anda, bu CSV'nin EFBBBFbaşlığı var, 0Asatır ayırıcı 0D0Aolarak ve metin hücrelerindeki dizelerin içinde yeni satır olarak kullanılıyor.
quetzalcoatl

1
Eğer doğru CSV, okumak için OS X için Excel almak çalışıyorsanız yanı sıra Windows için Excel burada büyük kaynak: stackoverflow.com/questions/4348802/...
Alexandre R. Janini

25

Birçok ince ayardan sonra, gömülü yeni satır biçimi standarda göre olmasa da, Windows + Excel'de okuma, Linux üzerinde dosya oluşturmaya çalışan bir yapılandırma :

  • Bir alandaki yeni satırların \ n (ve açıkçası çift tırnak işaretleri arasında olması gerekir)
  • Kayıt sonu: \ r \ n
  • Eşit bir alana başlamadığınızdan emin olun, aksi takdirde formül olarak kabul edilir ve kesilir

Perl'de bunu yapmak için Text :: CSV kullandım:

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
Evet, bunu yaptı. Bunun Windows + Excel, OSX + Numbers ve Google Dokümanlar ile çalıştığını onaylayabilirim.
Yorick Sijsling

3
\ N (ayrıca \ n) ile çevrili bir alanda "ve \ r \ n kullanarak satırları ayırmak için. Hala Excel 2010'da bu sorunu benim için çözmedi. ANSI ve UTF8-BOM ile denedim. Başarı yok
nl-x

1
Ama bunun nedeni | alan ayırıcı olarak. Eğer kullanırsam; alan ayırıcısı olarak, CSV verilerini içe aktarırken sorun devam eder, ancak CSV'yi Dosya Gezgini'nde çift tıklatarak açtığınızda sorun kaybolur.
nl-x

2
Ian'ın cevabı benim için Windows 7'de Excel 2003/2010'da çalışmıyor. UTF-8 BOM dosyamı düzenlemek için bir hex düzenleyici kullanmayı denedim ve '0D0A' bitlerinden (\ r \ n) 0D'yi (\ r) kaldırdım alanlar içindeki yeni satırlar için. Ama işe yaramıyor.
Dan W

Bu cevap Excel 2010 ve WIndows 7 kullanarak benim için (sıfır değişikliklerle!) Çalıştı; ayrıca cygwin ile birlikte gelen perl v5.14.2 kullanarak. Yerleşik satırlarım hepsi \n. Teşekkürler
ardnew

21

Son zamanlarda benzer bir sorun vardı, bir HTML dosyasını içe aktararak çözdüm , temel örnek şöyle olurdu:

<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>

Biliyorum, bir CSV değil ve Excel'in çeşitli sürümleri için farklı çalışabilir, ancak bence denemeye değer.

Umarım bu yardımcı olur ;-)


35
@GusDeCooL OP'nin ilk cümlesi "Excel için bir dosya oluşturmam gerekiyor, bu dosyadaki bazı değerler birden çok satır içeriyor." belki de bir CSV dosyası olması gerekmediğini gösterir. Ayrıca, Soru-Cevap formatı diğer okuyucular için de geçerlidir ve bazıları için uygun bir seçim olabilir (OP'nin CSV kullanması gerekse bile). Downvot'unuzu mantıksız buluyorum (yine de, nedenini açıkladığınız için teşekkür ederim).
dtldarek

1
Aslında bu benim için en iyi seçimdi; önerdiğiniz için teşekkürler!
Jordan Gray

8

Bir .CSV dosyası satır sonları içeren çift tırnak içine alınmış alanlar içerdiğinde, .CSV dosyası UTF-8 biçiminde yazılmışsa Excel'in .CSV dosyasını düzgün bir şekilde içe aktarmayacağını belirtmek gerekir. Excel, satır sonunu sanki CR / LF gibi davranır ve yeni bir satır başlatır. Elektronik tablo bozuk. Nokta virgülleri alan ayırıcıları olarak (virgül yerine) kullanılsa bile bu doğru gibi görünüyor.

Sorun, .CSV dosyasını düzenlemek için Windows Not Defteri kullanılarak, dosyayı kaydetmek için Dosya> Farklı Kaydet ... kullanılarak ve dosyayı kaydetmeden önce UTF-8'den ANSI'ye dosya kodlamasını değiştirerek çözülebilir. Dosya ANSI biçiminde kaydedildikten sonra, Windows 7 Professional üzerinde çalışan Microsoft Excel 2013'ün dosyayı düzgün şekilde alacağını görüyorum.


7

Virgül veya sekme yerine ayırıcı olarak noktalı virgül kullanırsanız ve tırnak işaretleri kullanırsanız, bir değer içindeki satırsonu işe yarar.

Bu benim için hem Excel 2010 hem de Excel 2000'de çalışır. Ancak, şaşırtıcı bir şekilde, dosyayı yeni bir e-tablo olarak açtığınızda çalışır, veri alma özelliğini kullanarak varolan bir e-tabloya içe aktardığınızda değil.


evet, ama sonra excel noktalı virgül ile bitiş çizgisi yapma seçeneği bulamadık
GusDeCooL

Gerçek metin verilerinden bazıları noktalı virgül içeriyorsa ne olur? Bu işe yaramaz.
htm11h

4

Bir bilgisayarda, ASCII karakteri # 10, bir değerin içine yeni satır yerleştirmek istediğiniz karakterdir.

Ancak Excel'e girdikten sonra, çok satırlı hücreler için sözcük kaydırmanın açık olduğundan emin olun, yoksa yeni satır kare bir kutu olarak görünür.


3

Dosyayı EXCEL'e aktarmaya çalışırsanız bu çalışmaz.

Csv dosyasını çift tıklatarak EXCEL'i çağırabilmeniz için csv dosya uzantısını EXCEL.EXE ile ilişkilendirin.

Buraya NewLine Char ve ardından biraz daha metin ekliyorum ve tüm dizeyi çift tırnak içine alıyorum.

EXCEL, dizenin bir kısmını sonraki hücreye yerleştireceğinden CR kullanmayın.

""text" + NL + "text""

EXCEL'i çağırdığınızda bunu göreceksiniz. Hepsini görmek için yüksekliği otomatik olarak boyutlandırmanız gerekebilir. Çizginin kesildiği yer hücrenin genişliğine bağlı olacaktır.

2

TARİH

Temel kod İşte

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

2

Bunu buldum ve benim için çalıştı

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

Öyleyse etrafınızdaki şeylerin kapalı olması gerekir

$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 );

Ardından, "" bunu yapabilirsiniz.

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

Yeni satırlar . PHP_EOL

Komut dosyasının sonu, kullanıcının dosyayı indirebilmesi için bir bağlantı yazdırır.

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

1

Malzeme listesi içeren UTF dosyaları Excel'in söz konusu alanda tırnak işaretleri içine alındığında bile yeni satırları tam anlamıyla işlemesine neden olur. (Excel 2008 Mac'te test edilmiştir)

Çözüm, yeni hatları bir hat beslemesinden ziyade bir satırbaşı (CHR 13) yapmaktır.


Excel 2016, bir UTF8 BOM olsa bile CSV dosyama doğru davranıyor gibi görünüyor. Ancak tüm farkı yaratan ';' alan ayırıcı olarak (ondalık ayırıcı olarak ',' olan tüm yerel ayarlar için Excel'in yaptığı şeydir).
Ale

1

Bunu test et: Tamamen benim için çalışıyor: Aşağıdaki satırları bir xxxx.csvdosyaya koy

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

Excel ile açın.

bazı durumlarda doğrudan açılacaktır aksi takdirde veri dönüşümü için sütun kullanmanız gerekecektir. sütun genişliğini genişletin ve metni kaydır düğmesine basın. veya hücreleri biçimlendirin ve kaydırma metnini etkinleştirin.

ve diğer öneriler için teşekkürler, ama onlar benim için çalışmadı. Ben saf bir pencere env içinde ve unicode veya başka komik bir şey ile oynamak istemiyordu.

Bu şekilde csv'den excel'e bir formül eklersiniz. Bu çalışma yöntemi için birçok kullanım olabilir. (tırnak işaretleri arasındaki = işaretine dikkat edin)

pd: Önerilerinize lütfen sadece kodun değil, verilerin bazı örneklerini de ekleyin.


1

her satırın sonuna "\ r" koyarak aslında excel satır sonları etkisi vardı, ama .csv ortadan kayboldu ve her satır boşluk ve satır sonları ile sonraki karşı ezilmiş bir çirkin karışıklık bıraktı


0

Bunu yapma şeklimiz (VB.Net'i kullanıyoruz), metni çift tırnakları temsil eden karakter olan Chr'de (34) yeni satırlarla kuşatmak ve LF için tüm CR-LF karakterlerini değiştirmek.


0

Normalde yeni bir satır "\ r \ n" olur. Benim CSV, ben "\ r" boş değeri ile değiştirildi. Javascript kodu:

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

MSV'de CSV'yi açtığımda iyi çalıştı. Bir değerin birden çok satırı varsa, Excel sayfasında 1 tek hücre içinde kalacaktır.


0

İçin Dosya Aç sadece, sözdizimi

 ,"one\n
 two",...

Kritik olan ilk "" den sonra boşluk olmaması . Normalde boşluklar iyidir ve dizgeden alıntı yapılmazsa kesilir. Ama aksi halde kötü. Bunu çözmem için biraz zamanımı aldı.

Satırın sonlandırılması önemli değil \ n veya \ c \ n.

Formül çubuğunu genişlettiğinizden emin olun, böylece metni gerçekten hücrede görebilirsiniz (uzun bir günden sonra beni yakaladı ...)

Tabii ki, Dosya Aç UTF-8 Düzgün desteklemeyecektir (biri hile kullanmadıkça).

Excel> Veri> Dış Veri Al > Metinden

İçine ayarlanabilir UTF-8 modunda (bu yazı listesinde aşağı yoludur). Ancak, bu durumda yeni hatlar işe yaramıyor ve bunu düzeltmenin bir yolunu bilmiyorum.

(30 yıl sonra MS'in bu şeyleri doğru yapacağı bir şey olabilir.)


0

Excel 365'te dosyayı alırken:

Veri -> Metinden / CSV'den -> Dosya Seç> Verileri Dönüştür -> Veri Kaynağı Yapılandırması -> Veri Kaynağını Seç -> Kaynağı Düzenle -> Satır sonu açılır listesinde Tırnakların içindeki satır sonlarını yoksay'ı seçin.

Yukarıdaki metin Portekizce'den çevrilmiştir, böylece İngilizce'de kelime farklı olabilir.


-1

bir sonrakini yapabilirsiniz "\"Value3 Line1 Value3 Line2\"". Java'da bir csv dosyası oluşturmak benim için çalışıyor


-2

İşte JavaScript kullanarak ilginç bir yaklaşım ...

  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

<br/>İçeriğe bir HTML satır sonu yazdırmak ve Excel'de açmak herhangi bir Excel'de iyi sonuç verir


-3

ALT + Enter klavye kısayolunu kullanabilirsiniz.

  1. Düzenlemek istediğiniz hücreyi seçin
  2. düzenleme moduna çift tıklayarak veya F2 tuşuna basarak girin 3. Alt + enter tuşlarına basın. Bu, hücrede yeni bir satır oluşturur

Bunu CVS dosya oluşturmaya nasıl entegre edersiniz?
jikuja
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.