我有一个Excel文件,其中有一些西班牙字符(波浪号等),我需要将其转换为CSV文件作为导入文件使用。然而,当我将另存为CSV时,它会破坏不是ASCII字符的“特殊”西班牙字符。它似乎也这样做的左右引号和长破折号,似乎是来自最初的用户在Mac中创建Excel文件。

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


当前回答

我知道这是一个老问题,但我碰巧在与OP同样的问题作斗争时遇到了这个问题。

没有发现任何提供的解决方案是可行的选择,我开始探索是否有一种方法可以只使用Excel来做到这一点。

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

请试一试,看看对你是否有用。祝你好运。

其他回答

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

在Excel下保存为CSV后,在命令行输入:

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

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

工作快速和伟大的大文件,如邮政编码数据库,不能导入到GoogleDocs(400.000单元格限制)。

对于那些有崇高的文本:保存编码utf-16 LE与BOM应该这样做;-)

我写了一个小的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)

我也遇到了同样的问题,于是谷歌了这篇文章。以上这些方法对我都没用。最后,我将我的Unicode .xls转换为.xml(选择另存为…XML电子表格2003),它产生了正确的字符。然后我编写代码来解析xml并提取内容供我使用。

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

安装catdoc:

apt-get install catdoc

进行转换:

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

这是非常快的。

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

注意,xls2csv也只适用于.xls文件,它不适用于.xlsx文件。