我有一个非常简单的事情,只输出一些CSV格式的东西,但它必须是UTF-8.我在TextEdit或TextMate或Dreamweaver中打开这个文件,它正确地显示了UTF-8字符,但是如果我在Excel中打开它,它就是这样做的傻事.这是我在文档的头部所得到的:
header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");
Run Code Online (Sandbox Code Playgroud)
除了Excel(Mac,2008)不想正确导入它之外,这一切似乎都具有预期的效果.Excel中没有选项可以"以UTF-8打开"或其他任何东西,所以......我有点恼火.
尽管有很多人遇到同样的问题,我似乎无法在任何地方找到任何明确的解决方案.我最看重的是包含BOM,但我无法弄清楚如何做到这一点.正如你在上面看到的那样,我只是提供echo这些数据,我不会写任何文件.如果我需要,我可以这样做,我不是因为此时似乎不需要它.有帮助吗?
更新:我尝试回显echo pack("CCC", 0xef, 0xbb, 0xbf);我刚刚从试图检测BOM的网站上提取的BOM.但Excel只会在导入时将这三个字符附加到第一个单元格,并且仍会混淆特殊字符.
我正在尝试导出一些数据(存储在数据表中).其中一些值中包含换行符.现在,每当我尝试在excel(2010)中导入文件时,linbreaks都会被识别为新行,而不是实际的换行符.
我搜索了几个小时,看到了很多解决方案,但我似乎无法解决它.
我输出我的csv文件的方式:(变量csvfile是一个字符串构建器)
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();
Run Code Online (Sandbox Code Playgroud)
当我用excel手动打开它时,它显示正常.但是因为excel 2003不支持文件格式,所以我必须导入它.通过导入,它将换行符(字段中的\n)视为新行.
不幸的是,我不能给你一个我使用的真实数据的例子(它是所有的个人数据),但我可以给你一个如何出错的例子:
Header1,Header2,Header3
"value1","value2","value 3
and this is where its going wrong"
Run Code Online (Sandbox Code Playgroud)
这是一个简单的csv文件,当你导入它时,你会看到它出错的地方.我默认使用双引号封装字段.我也默认从值中删除前导空格.
我在这个看似简单的问题上花了至少2天,但对于我的生活,我无法弄清楚我是如何解决这个问题的.我在同一个问题上看过多个主题,但是那里提供的解决方案似乎都无法解决这个问题.
我正在编写一个函数来处理CSV输出fputcsv().我已经解决了\r\n许多人曾经遇到的可怕问题fputcsv()(见代码).
现在我想弄清楚如何处理\r或\n字段中包含的字符(不是行结束返回\r\n).是否应该在被传递之前以某种方式逃脱fputcsv()?
该函数可以很好地处理大多数字符的转义.但是,当a \n插入字段时,MS Excel和Google Docs都会出现问题,\n并且CSV无法正确加载.
/*
* Revised Get CSV Line using PHP's fputcsv()
*
* Used to correct an issue with fputcsv()
* http://stackoverflow.com/questions/4080456/fputcsv-and-newline-codes
* MS Excel needs the MS Windows newline format of \r\n
*
*/
if (!function_exists('get_csv_line'))
{
function get_csv_line($list, $seperator = ",", $enclosure = '"', $newline = "\r\n")
{
$fp = fopen('php://temp', 'r+');
fputcsv($fp, $list, $seperator, $enclosure ); …Run Code Online (Sandbox Code Playgroud) 使用PHP从SQL中提取数据,然后在服务器上创建.csv文件,以便通过fputcsv进行电子邮件发送/下载.除了尝试在Excel(2003)中的字段中获取新行之外,一切都很有效.
当我需要时,我在单元格中得到Product1Product2Product3
Product1
Product2
Product3
Run Code Online (Sandbox Code Playgroud)
我试过单引号,双引号,CR,LF,我正在迅速消除自己的背后.
所以问题是 - 为了达到这个目的,我需要在CSV文件中使用什么字符?
它必须在Excel中工作
[解决方案] - 问题在于通过PHP fputcsv将\ r \n传递给Excel - 我无法以任何方式实现这一点(大量将所需的\ r \n附加到我的实际单元格数据,例如Product1\r \n)建议使用$ lfcr = chr(10).CHR(13); 第一次工作.我想这更像是一个PHP而不是一个Excel问题 - 多亏了所有的共鸣.