批量把 csv 转换为 xlsx,怎么解决 excel 打开后乱码问题?

由于工作性质,拿到的数据很多都是csv格式的,默认excel打开乱码,也找了一些方法去处理,结果都不行。
由于用wps出现过一次问题,导致一些数据丢失,暂时不考虑wps。
自己尝试用python写了1个,效果依旧不好。
然后自己找了一下其他的工具,都差强人意。

各位可还有其他的路子。

如果只是简单的乱码,用vscode之类的文本编辑器,另存编码为GB2312、GBK,然后excel再打开试试。

如果还要做分析,改数据,那还是python

1 Like

编码问题而已。你要处理成什么呢?csv在linux命令行工具集下是awk来处理的。
下面这段vba是用来csv转excel的
`
if WScript.Arguments.Count < 2 Then
WScript.Echo “Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> ”
Wscript.Quit
End If

csv_format = 6
xlsx_format = 56

Set objFSO = CreateObject(“Scripting.FileSystemObject”)

src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))

Dim oExcel
Set oExcel = CreateObject(“Excel.Application”)

Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)

oBook.SaveAs dest_file, xlsx_format

oBook.Close False
oExcel.Quit`

把你的csv文件样本脱敏以后放上来,可以帮你看看到底是怎么回事

另外,不知道你用过我的作品没有,fastcsviewer,一个非常小巧快速的csv文件查看器,可以到我的主页去下载试试。dangerace.ys168.com

1 Like

Python 效果不好指的是什么?试试 pandas.DataFrame.to_excel — pandas 1.4.1 documentation (pydata.org)
以及 Excel 如果是比较新的版本,默认应该也直接可以打开 UTF-8 编码的 CSV 文件了。实在不行的话可以上 LibreOffice Calc ?

盲猜是编码问题 其实直接用excel打开就行

数据-从文本/csv

csv本质上就是txt文件, 哪怕是系统自带的记事本也可以修改编码.

如果要大量处理csv, 可以试试 emeditor . 现在免费版开放的功能也很多, 完全够用.

谢谢,就是想直接CSV抓XLSX

嗯嗯,目前都是先改编码,再打开。
想一步到位,就是想直接CSV抓XLSX

嗯嗯 我去看了一下。

目前用的这个方法,都需要手动去导入一下

之前用过你的这个作品,记得只有查阅功能。
谢谢,就是想直接CSV转XLSX

pandas 我转换出来,少几行 :rofl:
能否告知具体是哪个版本可用呢 execl

我的是Microsoft Office Mondo 2016

如果系统关联没有被改动,windows会自动启用excel来打开csv文件,不需要用户自己去“转”

你现在反馈说用excel打开是乱码,通常情况下是编码问题造成的,但也可能是其他问题,所以才说,你可以把脱敏后的样本放上来,大家才方便帮你确认问题的真正原因是什么。
如果仅仅是编码问题,那确实不需要动用python什么的第三方工具,excel自己就能完美解决

可以试试这个Quicker动作

操作前备份好文件。
如果不行的话可以提供一个csv样例,帮你做一个试试,目前quicker有一个表格的操作可以读取csv和导出excel。

2 Likes
import codecs
import chardet

def convert(file, in_enc="GBK", out_enc="UTF-8"):
    in_enc = in_enc.upper()
    out_enc = out_enc.upper()
    try:
        print("convert [ " + file.split('\\')[-1] + " ].....From " + in_enc + " --> " + out_enc )
        f = codecs.open(file, 'r', in_enc)
        new_content = f.read()
        codecs.open(file, 'w', out_enc).write(new_content)
    # print (f.read())
    except IOError as err:
        print("I/O error: {0}".format(err))


try:
    with open(new_data_file, "rb") as f:
        data = f.read()
        codeType = chardet.detect(data)['encoding']
        convert(new_data_file, codeType, 'UTF-8')
except:
       pass

1 Like

谢谢 后面我参考一下