将Excel转换为带有UTF8编码的CSV

644
我有一个Excel文件,其中包含一些西班牙语字符(如重音符等),我需要将其转换为CSV文件以用作导入文件。然而,当我选择“另存为CSV”时,它会破坏那些不是ASCII字符的“特殊”西班牙语字符。似乎它也会这样处理左右引号和长破折号,这些符号看起来是源文件的原始用户在Mac上创建的。
由于CSV只是一个文本文件,我相信它可以处理UTF8编码,所以我猜这是Excel的限制,但我正在寻找一种从Excel到CSV的方法,并保持非ASCII字符完整。

15
在我发布这个问题之前,我看到过那个问题,但是那个问题是关于已经有一个UTF8格式的CSV文件并在Excel中打开它,而不是相反的情况。 - Jeff Treuting
8
下面的答案似乎可行,但它们只是权宜之计。有没有人知道如何让Excel实现这个功能? - NielW
3
这是一个非常让人烦恼的Excel限制。我在uservoice上提出了一个功能请求:http://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10006149-support-saving-csv-in-utf-8-encoding,欢迎投票并实现它。 - Doron Yaacoby
3
在我的语言中,Excel会自动将每个“…”或“oe”或“ae”转换为Unicode等效项(…,œ,æ),但当到导出时,它会惊叫着说:“天哪,这些字符是什么?” 微软,你是认真的吗? - Martin
7
根据Excel用户反馈,微软上个月开始着手将UTF-8编码应用于.csv文件的保存 https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10006149-support-saving-csv-in-utf-8-encoding - moloko
显示剩余6条评论
36个回答

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)

我稍微更新了实现,并创建了一个代码片段 https://gist.github.com/julianthome/2d8546e7bed869079ab0f409ae0faa87 - Julian

2

我遇到了相同的问题,通过谷歌找到了这篇文章。但上述方法对我都不起作用。最后我将我的Unicode .xls文件转换成了.xml文件(选择“另存为”... XML电子表格2003),这样就可以正确显示字符了。然后我编写了代码来解析xml并提取我需要的内容。


2

Excel通常将CSV文件保存为ANSI编码,而不是UTF8编码。

纠正文件的一种方法是使用记事本或Notepad++:

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

不确定旧版本的NP ++,但在当前版本中,您只需选择“编码”>“转换为UTF-8”。替换步骤2-5。 - Felk

1

微软Excel有一个使用Unicode编码导出电子表格的选项。请参见以下屏幕截图。

enter image description here


14
“Unicode Text” 保存在UTF-16 LE(小端序)中,而不是由OP要求的UTF-8中。 - ax.
是的,但这是在Excel中获得Unicode支持的最佳方法。我曾经尝试过各种办法来让Excel使用UTF-8,但仍然会遇到各种问题![阅读更多](http://www.herongyang.com/Unicode/Excel-Using-Microsoft-Excel-as-Unicode-Text-Editor.html) - mcNux

1
另一个选项是打开你的CSV文件在Notepad++中,然后进行转换为ANSI编码。
在顶部菜单中选择: 编码 -> 转换为ANSI

不知道为什么你被踩了。Notepad++ 对我很有用。由于文件是机密的,无法将其存储在 Google 电子表格中。 - Zane
3
这个答案的问题在于如何首先生成CSV文件。如果您只是从Excel中另存为CSV,那么编码将是cp1252,这是一种每个代码点一个字节的编码方式,因此对于不适合该编码方式的字符会丢失信息。另外,在最后,如果您想做问题要求的事情,应该转换为UTF-8而不是ANSI。 - Flimm
在我看来,这绝对是更简单的答案。我正在使用Excel 2016,并发现默认情况下保存为ANSI编码,但我将其转换为了我想要的UTF-8编码。 - rovyko

1

保存对话框 > 工具按钮 > Web 选项 > 编码选项卡


1
这对我来说不起作用。据我理解,它只在保存为网页格式(HTML等)时生效,而不是保存为CSV格式时生效。 - jogojapan
适用于我 - Office 2007 - Elia Weiss
在选择任何CSV配置文件时,无法在Office 2010上工作。 - Hart

1
另一个解决方案是通过Winword打开文件并将其保存为txt,然后再通过Excel重新打开它,这样就可以解决ISA问题。

1

用Notepad++打开.csv文件。如果您的编码看起来正常(您可以看到所有字符都应该在位置上),则按编码,然后转换为ANSI。 否则,请找出您当前的编码是什么。


这对我很有用。当我将MySQL数据库导出为CSV并将其导入Excel时,希腊字符出现了问题。 - nikolas
1
问题在于如何首先生成CSV文件。如果您只是在Excel中另存为CSV文件,它将以cp1252格式保存,这是一种每个代码点一个字节的编码方式,因此会丢失信息。 - Flimm

1

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

有更快的方法,比如将其导出为 csv(逗号分隔符),然后使用 Notepad++(免费)打开该 csv,然后进行编码 > 转换为 UTF8。但仅当您需要对每个文件执行此操作一次时才有效。如果您需要频繁更改和导出,则最好使用 LibreOffice 或 GDocs 解决方案。


5
"Utf8是Unicode的子集"这个说法并没有意义。UTF-8是Unicode的一种编码方式。 - jameshfisher
我不确定我能否找到“编码->转换为Ansi”的选项。 - Flimm
在Notepad++中简单地将ANSI格式的csv文件更改为UTF-8编码,会导致原始的非ASCII西班牙语字符被转换成编码字符串,这些字符串与原始文本不匹配。 - Jason Williams

0

我遇到了同样的问题,并发现this插件,在Excel 2013中运行得非常完美,但在Excel 2007和2010中则不是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接