使用UTF8编码的Excel到CSV

时间:2010-11-19 00:48:17

标签: excel encoding csv utf-8

我有一个Excel文件,其中包含一些西班牙语字符(波浪号等),我需要将其转换为CSV文件以用作导入文件。但是,当我另存为CSV时,它会破坏非特殊的西班牙语字符,而不是ASCII字符。它似乎使用左右引号和长划线来执行此操作,这些引号似乎来自在Mac中创建Excel文件的原始用户。

由于CSV只是一个文本文件,我确信它可以处理UTF8编码,所以我猜这是一个Excel限制,但我正在寻找一种从Excel到CSV并保持非-ASCII字符完整。

36 个答案:

答案 0 :(得分:384)

一个简单的解决方法是使用Google电子表格。粘贴(仅当您具有复杂公式时的值)或导入工作表然后下载CSV。我只是尝试了几个角色而且效果很好。

注意:Google表格在导入时确实存在限制。请参阅here

注意:请注意Google表格中的敏感数据。

编辑:Another alternative - 基本上他们使用VB宏或插件来强制保存为UTF8。我没有尝试过这些解决方案,但听起来很合理。

答案 1 :(得分:122)

我发现OpenOffice的电子表格应用程序Calc非常擅长处理CSV数据。

在“另存为...”对话框中,单击“格式选项”以获取CSV的不同编码。 LibreOffice与AFAIK的工作方式相同。

calc save dialog

答案 2 :(得分:105)

  1. 将Excel工作表另存为“Unicode文本(.txt)”。好消息是所有国际字符都是UTF16(注意,不是UTF8)。但是,新的“* .txt”文件是以TAB分隔的,而不是逗号分隔的,因此不是真正的CSV。

  2. (可选)除非您可以使用TAB分隔文件进行导入,否则请使用您喜欢的文本编辑器并用逗号“,”替换TAB字符。

  3. 在目标应用程序中导入* .txt文件。确保它可以接受UTF16格式。

  4. 如果UTF-16已正确实现且支持非BMP代码点,则可以将UTF-16文件转换为UTF-8而不会丢失信息。我留给你找到你最喜欢的方法。

    我使用此过程将数据从Excel导入Moodle。

答案 3 :(得分:41)

我知道这是一个古老的问题,但我碰巧遇到与OP相同的问题时遇到了这个问题。

没有找到任何提供的解决方案是可行的选择,我开始发现是否有办法只使用Excel。

幸运的是,我发现从xlsx格式保存到csv格式时,丢失的字符问题只发生(在我的情况下)。我尝试先将xlsx文件保存到xls,然后再保存到csv。它确实有效。

请试一试,看看它是否适合您。祝你好运。

答案 4 :(得分:35)

您可以在Unix下使用iconv命令(在Windows上也可以libiconv使用)。

在命令行中将Excel保存为Excel之后:

iconv -f cp1250 -t utf-8 file-encoded-cp1250.csv > file-encoded-utf8.csv

(记得用你的编码替换cp1250。)

对于大型文件(如邮政编码数据库)而言工作速度非常快,无法导入到GoogleDocs(400.000单元格限制)。

答案 5 :(得分:24)

唯一的"简单方式"这样做如下。首先,要意识到Excel .csv文件中显示的内容与隐藏的内容之间存在差异。

  1. 打开一个Excel文件,其中包含信息(.xls,.xlsx)
  2. 在Excel中,选择" CSV(逗号分隔)(* .csv)作为文件类型并保存为该类型。
  3. 在NOTEPAD中(位于"程序"然后在开始菜单中找到附件),在记事本中打开已保存的.csv文件
  4. 然后选择 - >另存为...并在"底部保存为"在框中,有一个标记为"编码"的选择框。选择UTF-8(不要使用ANSI或丢失所有重音等)。选择UTF-8后,将文件保存为与原始文件略有不同的文件名。
  5. 此文件采用UTF-8格式,并保留所有字符和重音符号,例如可以导入MySQL和其他数据库程序。

    此答案取自this forum

答案 6 :(得分:22)

您可以在没有第三方软件的现代Windows计算机上执行此操作。此方法可靠,它将处理包含引号,引用的制表符,CJK字符等的数据。

<强> 1。从Excel中保存

在Excel中,使用file.txt类型将数据保存到Unicode Text (*.txt)

<强> 2。启动PowerShell

从“开始”菜单运行powershell

第3。在PowerShell中加载文件

$data = Import-Csv C:\path\to\file.txt -Delimiter "`t" -Encoding BigEndianUnicode

<强> 4。将数据另存为CSV

$data | Export-Csv file.csv -Encoding UTF8 -NoTypeInformation

答案 7 :(得分:22)

另一个我发现有用的东西: 保存为CSV时,“数字”允许编码设置。

答案 8 :(得分:14)

“nevets1219”对于Google文档是正确的,但是如果您只是“导入”该文件,它通常不会将其转换为UTF-8。

但是,如果您将CSV导入现有的Google电子表格,则会转换为UTF-8。

这是一个食谱:

  • 在主文档(或云端硬盘)屏幕上,点击“创建”按钮,然后选择“电子表格”
  • 从“文件”菜单中选择“导入”
  • 点击“选择文件”
  • 选择“替换电子表格”
  • 选择您用作分隔符的任何字符
  • 点击“导入”
  • 从“文件”菜单中选择“下载为” - &gt; CSV(当前表)

生成的文件将采用UTF-8

答案 9 :(得分:8)

对于那些寻求完全程序化(或至少是服务器端)解决方案的人来说,使用catdoc的xls2csv工具取得了巨大的成功。

安装catdoc:

apt-get install catdoc

进行转换:

xls2csv -d utf-8 file.xls > file-utf-8.csv 

这很快。

请注意,包含-d utf-8标志非常重要,否则它会以默认的cp1252编码对输出进行编码,并且存在丢失信息的风险。

请注意,xls2csv也仅适用于.xls个文件,但不适用于.xlsx个文件。

答案 10 :(得分:8)

使用Notepad ++

这将修复Excel保存的损坏的CSV文件,并以正确的编码重新保存。

  • 从Excel导出CSV
  • 加载到Notepad ++
  • 修复编码
  • 保存

Excel保存在CP-1252 / Windows-1252中。在Notepad ++中打开CSV文件。选择

Encoding > Character Sets > Western European > Windows-1252

然后

Encoding > Convert to UTF-8
File > Save

首先告诉Notepad ++编码,然后转换。这些其他答案中的一些是在没有首先设置正确的编码的情况下进行转换,甚至更多地修改文件。他们会将改为。如果您的角色不适合CP-1252,那么当它保存为CSV时它已经丢失。请使用另一个答案。

答案 11 :(得分:7)

如何使用Powershell。

Get-Content 'C:\my.csv' | Out-File 'C:\my_utf8.csv' -Encoding UTF8

答案 12 :(得分:6)

最简单的方式: 无需开放式办公室和Google文档

  1. 将文件另存为&#34; Unicode文本文件&#34;;
  2. 现在你有一个unicode文本文件
  3. 打开&#34;记事本&#34;和&#34;另存为&#34;选择&#34; utf-8&#34;要么 您想要的其他代码页
  4. 重命名文件扩展名&#34; txt&#34;到&#34; csv&#34;。这将导致制表符分隔的UTF-8 csv文件。
  5. 如果您需要逗号 - 定界文件,请打开刚刚重命名的csv文件,并用逗号替换所有标签。要在Win 10上的记事本中执行此操作,只需选择一个选项卡字段,然后单击Ctrl+H。在打开的窗口中,在&#34;替换为&#34;中键入逗号,;然后单击&#34;全部替换&#34;。保存文件。结果将是逗号分隔的UTF-8 csv文件。
  6. 无论如何都不要用MS-Office打开它! 现在您有一个制表符分隔的CSV文件。 或者,如果您应用了第5步,则以逗号分隔。

答案 13 :(得分:5)

尽管看起来很有趣,但我发现将180MB电子表格保存为UTF8 CSV文件的最简单方法是将单元格选择到Excel中,复制它们并将剪贴板内容粘贴到SublimeText中。

答案 14 :(得分:4)

在Excel 2016中,我们有一个专用于UTF-8格式的CSV导出选项。

答案 15 :(得分:3)

我无法在Mac Excel上找到此问题的VBA解决方案。似乎没有办法输出UTF-8文本。

所以我最终不得不放弃VBA,咬紧牙关,学习AppleScript。这并不像我想象的那么糟糕。

此处描述了解决方案: http://talesoftech.blogspot.com/2011/05/excel-on-mac-goodbye-vba-hello.html

答案 16 :(得分:3)

简单方法:下载开放式办公室(here),加载电子表格并打开Excel文件(.xls.xlsx)。然后将其保存为文本CSV文件,并打开一个窗口,要求保留当前格式或保存为.ODF格式。选择“保持当前格式”,然后在新窗口中根据您的文件所使用的语言选择更适合您的选项。对于西班牙语,请选择西欧(Windows-1252/ WinLatin 1)并且文件工作正常。如果选择Unicode(UTF-8),则不能使用西班牙语字符。

答案 17 :(得分:3)

  1. 将xls文件(Excel文件)保存为Unicode text =&gt;文件将以文本格式保存(.txt)

  2. 将格式从.txt更改为.csv(将文件从XYX.txt重命名为XYX.csv

答案 18 :(得分:3)

我也遇到了同样的问题,但有一个简单的解决方案。

  1. 在Excel 2016或更高版本中打开xlsx文件。
  2. 在“另存为”中选择此选项:“(CSV UTF-8(逗号分隔)*。csv)”
  3. 它完美运行并生成一个可以在任何软件中导入的csv文件。我在我的SQLITE数据库中导入了这个csv文件,它可以完美地与所有unicode字符完美配合。

答案 19 :(得分:3)

假设有一个Windows环境,请像往常一样在Excel中保存和使用该文件,然后在Gnome Gnumeric(免费)中打开保存的Excel文件。将Gnome Gnumeric的电子表格保存为CSV,无论如何,将其保存为UTF-8 CSV。

答案 20 :(得分:2)

我编写了一个小型Python脚本,可以导出UTF-8中的工作表。

您只需提供Excel文件作为第一个参数,然后是要导出的工作表。如果您不提供工作表,脚本将导出Excel文件中存在的所有工作表。

#!/usr/bin/env python

# export data sheets from xlsx to csv

from openpyxl import load_workbook
import csv
from os import sys

reload(sys)
sys.setdefaultencoding('utf-8')

def get_all_sheets(excel_file):
    sheets = []
    workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
    all_worksheets = workbook.get_sheet_names()
    for worksheet_name in all_worksheets:
        sheets.append(worksheet_name)
    return sheets

def csv_from_excel(excel_file, sheets):
    workbook = load_workbook(excel_file,use_iterators=True,data_only=True)
    for worksheet_name in sheets:
        print("Export " + worksheet_name + " ...")

        try:
            worksheet = workbook.get_sheet_by_name(worksheet_name)
        except KeyError:
            print("Could not find " + worksheet_name)
            sys.exit(1)

        your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb')
        wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
        for row in worksheet.iter_rows():
            lrow = []
            for cell in row:
                lrow.append(cell.value)
            wr.writerow(lrow)
        print(" ... done")
    your_csv_file.close()

if not 2 <= len(sys.argv) <= 3:
    print("Call with " + sys.argv[0] + " <xlxs file> [comma separated list of sheets to export]")
    sys.exit(1)
else:
    sheets = []
    if len(sys.argv) == 3:
        sheets = list(sys.argv[2].split(','))
    else:
        sheets = get_all_sheets(sys.argv[1])
    assert(sheets != None and len(sheets) > 0)
    csv_from_excel(sys.argv[1], sheets)

答案 21 :(得分:2)

遇到同样的问题并搜索了这篇文章。以上都不适合我。最后我将我的Unicode .xls转换为.xml(选择另存为... XML Spreadsheet 2003)并生成了正确的字符。然后我编写了代码来解析xml并提取内容供我使用。

答案 22 :(得分:2)

Excel通常将csv文件保存为ANSI编码而不是utf8。

更正文件的一个选项是使用记事本或Notepad ++:

  1. 使用记事本或Notepad ++打开.csv。
  2. 将内容复制到计算机剪贴板。
  3. 删除文件中的内容。
  4. 将文件的编码更改为utf8。
  5. 将内容从剪贴板中粘贴回来。
  6. 保存文件。

答案 23 :(得分:1)

Microsoft Excel可以选择使用Unicode编码导出电子表格。请参见以下屏幕截图。

enter image description here

答案 24 :(得分:1)

保存对话框&gt;工具按钮&gt;网络选项&gt;编码标签

答案 25 :(得分:1)

编码 - &gt;转换为Ansi将以ANSI / UNICODE编码。 Utf8是Unicode的子集。也许在ANSI中会被正确编码,但在这里我们讨论的是UTF8,@ SequenceDigitale。

有更快的方法,例如导出为csv(逗号分隔),然后用Notepad ++(免费)打开csv,然后编码&gt;转换为UTF8。但是,只有每个文件必须执行一次此操作。如果您需要经常更改和导出,那么最好的是LibreOffice或GDocs解决方案。

答案 26 :(得分:1)

用记事本++打开.csv罚款。如果你看到你的编码是好​​的(你看到它们应该是所有字符)按下编码,然后转换为ANSI 否 - 找出你当前的编码是什么

答案 27 :(得分:1)

“nevets1219”的第二个选项是在Notepad ++中打开您的CSV文件并转换为ANSI。

在顶部菜单中选择: 编码 - &gt;转换为Ansi

答案 28 :(得分:1)

另一种解决方案是通过winword打开文件并将其保存为txt,然后通过excel重新打开它,它将工作ISA

答案 29 :(得分:0)

我遇到了同样的问题并遇到了this加入,并且它在excel 2013中与excel 2007和2010相比完全没问题。

答案 30 :(得分:0)

我需要在Mac上自动执行此过程。我最初尝试使用catdoc/xls2csv按照mpowered的建议,但是xls2csv无法检测文档的原始编码,并且并非所有文档都相同。我最终做的是将默认网页输出编码设置为UTF-8,然后将文件提供给Apple的Automator,应用Convert Format of Excel Files操作转换为Web Page (HTML)。然后使用PHPDOMDocumentXPath,我查询了文档并将其格式化为CSV

这是PHP脚本(process.php):

<?php
$pi = pathinfo($argv[1]);
$file = $pi['dirname'] . '/' . $pi['filename'] . '.csv';
$fp = fopen($file,'w+');
$doc = new DOMDocument;
$doc->loadHTMLFile($argv[1]);
$xpath = new DOMXPath($doc);
$table = [];
foreach($xpath->query('//tr') as $row){
    $_r = [];
    foreach($xpath->query('td',$row) as $col){
        $_r[] = trim($col->textContent);
    }
    fputcsv($fp,$_r);
}
fclose($fp);
?>

这是我用来将HTML文档转换为csv的shell命令:

find . -name '*.htm' | xargs -I{} php ./process.php {}

这是一种非常非常迂回的方式,但这是我找到的最可靠的方法。

答案 31 :(得分:-1)

(在Mac上)从Excel保存为CSV文件。在TextWrangler中打开CSV文件(它是免费的)并使用&#34;另存为&#34;。在保存对话框中选择Unicode(UTF-8)。完成

(我猜你也可以用TextEdit做 - 如果你玩打开和保存设置。尝试打开文件:自动,保存文件:UTF-8)

答案 32 :(得分:-1)

对于那些拥有崇高文本的人:使用BOM编写utf-16 LE应该这样做; - )

答案 33 :(得分:-1)

另一种方法是在记事本中打开UTF-8 CSV文件,以便正确显示。 然后替换所有&#34;,&#34;带标签。 将所有这些粘贴到一个新的Excel文件中。

答案 34 :(得分:-3)

我使用了以下解决方案:Mac Exel 2008&gt;档案&gt;另存为然后格式化使用MS_DOS逗号分隔(.csv)。工作得很完美。

答案 35 :(得分:-3)

您可以将excel保存为unicode文字,它以制表符分隔。