代码之家  ›  专栏  ›  技术社区  ›  Nir

为Excel生成csv文件,如何在值内换行

  •  142
  • Nir  · 技术社区  · 15 年前

    我需要为Excel生成一个文件,这个文件中的一些值包含多行。

    其中也有非英语文本,因此文件必须是Unicode。

    我现在生成的文件是这样的:(以utf8格式,非英语文本混合在一起,并且有很多行)

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

    注意,多行值用双引号括起来,其中包含一个正常的日常换行符。

    根据我在网络上发现的结果,这应该是可行的,但至少不能赢得Excel2007和UTF8文件,Excel将第三行数据视为第二行,而不是第一行数据的第二行。

    这必须在我客户的机器上运行,我无法控制他们的Excel版本,因此我需要一个可以与Excel2000及更高版本一起使用的解决方案。

    谢谢

    编辑:我通过两个csv选项“解决”了我的问题,一个用于Excel(Unicode,制表符分隔,字段中没有换行符),另一个用于世界其他地方(utf8,标准csv)。

    不是我要找的,但至少它起作用(到目前为止)

    17 回复  |  直到 7 年前
        1
  •  63
  •   Marcel Gosselin    10 年前

    只有当空格字符是数据的一部分时,才应该在字段的开头使用空格字符。Excel不会去掉前导空格。标题和数据字段中会出现不需要的空格。更糟的是 " 这应该是“保护”第三列中的换行符将被忽略,因为它不在字段的开头。

    如果文件中有非ASCII字符(以UTF-8编码),则应该有一个UTF-8 BOM(3个字节, hex EF BB BF )在文件的开头。否则,Excel将根据区域设置的默认编码(如CP1252)而不是UTF-8来解释数据,并且您的非ASCII字符将被丢弃。

    以下注释适用于Excel 2003、2007和2013;未在Excel 2000上测试

    如果在Windows资源管理器中双击文件名打开该文件,则一切正常。

    如果在Excel中打开它,结果会有所不同:

    1. 文件中只有ASCII字符(没有BOM):有效。
    2. 文件中有非ASCII字符(以UTF-8编码),开头有一个UTF-8 BOM:它识别出数据是以UTF-8编码的,但忽略了CSV扩展名,并将您放入 非向导文本导入 ,不幸的是,得到了换行问题。

    选项包括:

    1. 培训用户不要在Excel中打开文件:-(
    2. 考虑直接写一个XLS文件…在python/perl/php/.net/etc中有可用的包/库来实现这一点。
        2
  •  23
  •   Anirvan    13 年前

    经过大量的调整后,这里的配置可以在Linux上生成文件,在Windows+Excel上读取。

    • 字段中的换行符需要\n(并且明显用双引号引起来)
    • 记录结尾:\r\n
    • 请确保不以equals开头字段,否则它将被视为公式并截断

    在Perl中,我使用文本::csv执行以下操作:

    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
  •  15
  •   dtldarek    12 年前

    最近我遇到了类似的问题,我通过导入 HTML 文件,基线示例如下:

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

    我知道,它不是一个csv,可能在不同版本的Excel中工作不同,但我认为值得一试。

    我希望这有帮助;—)

        4
  •  8
  •   OneSkyWalker    10 年前

    值得注意的是,当.csv文件的字段用双引号括起来,并且包含换行符时,如果.csv文件是以utf-8格式写入的,则Excel将无法正确导入.csv文件。Excel将换行符视为CR/LF并开始新行。电子表格乱七八糟。即使使用分号作为字段分隔符(而不是逗号),这似乎也是正确的。

    该问题可以通过使用Windows记事本编辑.csv文件来解决,方法是使用文件>另存为…要保存文件,在保存文件之前,请将文件编码从utf-8更改为ansi。一旦文件以ANSI格式保存,我发现在Windows7Professional上运行的MicrosoftExcel2013将正确导入该文件。

        5
  •  5
  •   Esben    13 年前

    如果使用分号作为分隔符,而不是逗号或制表符,并使用引号,则值内的换行符似乎可以工作。

    这在Excel2010和Excel2000中都适用。但是,令人惊讶的是,只有当您将文件作为新的电子表格打开时,它才起作用,而不是当您使用数据导入功能将文件导入到现有的电子表格时。

        6
  •  4
  •   devuxer    15 年前

    在PC机上,ascii字符10是要在值中放置新行的字符。

    但是,一旦将其放入Excel,就需要确保多行单元格启用了自动换行,否则换行符将显示为方形框。

        7
  •  3
  •   Dror Bereznitsky    11 年前

    如果您试图将文件导入到Excel中,这将不起作用。

    将文件扩展名csv与excel.exe关联,这样您就可以通过双击csv文件来调用excel。

    在这里,我放置一些文本,然后是换行符,然后是更多的文本,并用双引号括住整个字符串。

    不要使用CR,因为Excel将在下一个单元格中放置部分字符串。

    ""text" + NL + "text""
    

    当您调用Excel时,您将看到这一点。你可能需要自动调整高度才能看到所有这些。换行符的位置将取决于单元格的宽度。

    日期

    这是基本的代码

    CHR$(34,"2", 10,"DATE", 34)
    
        8
  •  1
  •   Lisa Simpson    13 年前

    我找到了这个,它对我很有用

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

    那你需要把东西放在什么地方

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

    然后当你需要写一些东西的时候,比如HTML,其中包括“你可以这样做”

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

    新行以结尾 . PHP_EOL

    脚本的结尾打印出一个链接,以便用户可以下载该文件。

    echo 'Click <a href="myfile.csv">here</a> to download file';
    
        9
  •  1
  •   Stephen    13 年前

    包含物料清单的UTF文件将导致Excel逐字处理新行,即使在该字段中,新行也被引号包围。(测试Excel2008 Mac)

    解决方案是使任何新行成为回车(chr 13),而不是换行。

        10
  •  1
  •   Durgpal Singh    8 年前

    测试如下: 它完全适合我: 将以下行放入 xxxx.csv 文件

    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打开。

    在某些情况下,将直接打开,否则将需要使用列到数据的转换。 展开列宽并单击“自动换行”按钮。或设置单元格格式并激活换行。

    谢谢你的其他建议,但它们不适合我。我在纯Windows环境中,不想玩Unicode或其他有趣的东西。

    这样你就可以把一个从csv到excel的公式。这种工作方法可能有很多用途。 (注意引号前的=号)

    PD:在你的建议中,请放一些数据样本,而不仅仅是代码。

        11
  •  1
  •   Duncan Wallace    8 年前

    在每行末尾加上“\r”实际上在Excel中有换行的效果,但在.csv中,它消失了,留下了一个难看的混乱,每行都被压扁,没有空格,也没有换行。

        12
  •  0
  •   Sebastian    15 年前

    我们这样做(我们使用vb.net)的方法是在chr(34)中用新行括住文本,这是表示双引号的字符,并替换lf的所有cr-lf字符。

        13
  •  0
  •   Tam Tran    10 年前

    通常,新行是“\r\n”。在我的csv中,我用空值替换了“\r”。 以下是JavaScript中的代码:

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

    当我在MS Excel中打开csv时,它工作得很好。如果一个值有多行,它将停留在Excel工作表中的1个单元格内。

        14
  •  -1
  •   Fredy Chica    11 年前

    您可以执行下一个“值”3行1 值3行2“”。它为我在Java中生成CSV文件

        15
  •  -1
  •   Meghana Chamarthy    7 年前

    您可以使用键盘快捷键alt+enter。

    1. 选择要编辑的单元格
    2. 通过双击或按F2进入编辑模式 3.按Alt+Enter。这将在单元格中创建新行
        16
  •  -2
  •   Matt user129975    12 年前

    下面是一个使用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");                  
    
        17
  •  -3
  •   Shashi    11 年前

    打印HTML换行符 <br/> 在内容和Excel中打开可以在任何Excel上正常工作