openpyxl将CSV转换为EXCEL

12

我该如何使用openpyxl模块将带有冒号分隔符的CSV文件转换为XLS(Excel表格)?


我有一个csv文件,想要将其转换为Excel格式。由于我是Python的新手,所以不知道该怎么做。 - Satish
1
在Stackoverflow上,你的问题可以得到解答,但没有人会替你完成工作。 - dav1d
1
@Satish,我相信dav1d所说的是SO有这样一个不成文的规定,即给男人鱼,而不是教他们如何捕鱼。无论如何,https://dev59.com/eWgv5IYBdhLWcg3wKtrj。 - John
@Johnthexiii 谢谢!但是那个例子是从Excel到CSV的..我正在寻找相反的解决方案。 - Satish
4个回答

67

一种更简单、更极简的解决方案:

import csv
import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

with open('file.csv') as f:
    reader = csv.reader(f, delimiter=':')
    for row in reader:
        ws.append(row)

wb.save('file.xlsx')

这是更好的答案。在我看来,追加是比使用ws.cell()方法更好的方式。 - G4mo
许多CSV文件格式损坏并且无法正常读取。 - TomSawyer

18
import csv
from openpyxl import Workbook
from openpyxl.cell import get_column_letter

f = open(r'C:\Users\Asus\Desktop\herp.csv')

csv.register_dialect('colons', delimiter=':')

reader = csv.reader(f, dialect='colons')

wb = Workbook()
dest_filename = r"C:\Users\Asus\Desktop\herp.xlsx"

ws = wb.worksheets[0]
ws.title = "A Snazzy Title"

for row_index, row in enumerate(reader):
    for column_index, cell in enumerate(row):
        column_letter = get_column_letter((column_index + 1))
        ws.cell('%s%s'%(column_letter, (row_index + 1))).value = cell

wb.save(filename = dest_filename)

我收到了这个错误[spatel@mg0008 work]$ python26 c2x.py 回溯(最近的调用在最上面): 文件“c2x.py”,第17行,在<module>中 for row_index, row in enumerate(reader): _csv.Error:在未引用字段中看到换行符-您是否需要以通用换行模式打开文件? - Satish
不错,但生成的文件打开后所有数字字段都报告它们保存为文本而不是数字... - MrMobileMan
在这里找到了解决数字作为文本问题的方法:https://dev59.com/q4Hba4cB1Zd3GeqPXeZN - MrMobileMan
2
使用 enumerate(start=1) 是消除那些 + 1 的好方法。另外请注意,您可以直接指定 cell(row=row_index, column=column_index) 而不是构建一个字符串。 - John McGehee
3
为了使这个程序工作,我需要将第三行改为 from openpyxl.utils import get_column_letter,然后再将倒数第二行改为 ws['%s%s'%(column_letter, (row_index + 1))].value = cell - dingles
将导入语句更改为:from openpyxl.utils import get_column_letter - Ujjwal Roy

2

这里是Adam的解决方案,扩展了去除openpyxl认为非法并会引发异常的字符:

import re
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
...
##ws.append(row) - Replace with the code below
for i in row:
    ws.append([ILLEGAL_CHARACTERS_RE.sub('',i)])

ILLEGAL_CHARACTERS_RE是一个编译好的正则表达式,其中包含openpyxl认为“非法”的字符。代码只是用空字符串替换这些字符。

来源:Bitbucket openpyxl问题#873-删除非法字符而不是抛出异常


1
我认为你可能是想要这样写:ws.append([ILLEGAL_CHARACTERS_RE.sub('', _i) for _i in row]) - KyleKing

1
在John的建议之上,我稍微修改了我的脚本,使用函数来去除所有原始数据中字符串的撇号。这样,我就能够检查所有原始数据(字符串和数字),并将它们放置在各自的单元格中。最后,我从第20行开始将数字数据分配给浮点类型。这是因为所有的数字数据都存在于第20行及以后,而在此之上的所有数据都只是文本。
cell_value = cell.replace('"', '')
以下是我的脚本:
import csv
from openpyxl import Workbook

wb = Workbook()
ws = wb.active

with open(filepath1_csv) as f:
reader = csv.reader(f)
for row_index, row in enumerate(reader):
    for column_index, cell in enumerate(row):
        column_letter = column_index + 1
        cell_value = cell.replace('"', '')
        ws.cell(row = row_index + 1, column = column_letter).value = cell_value

for row in ws.iter_rows(min_row=20, min_col=1, max_col=5, 
max_row=ws.max_row):
for cell in row:
    if cell.value is None:
        break
    else:
        cell.value = float(cell.value)

wb.save(filename = filepath1_xlsx)   

你能否将注释以适当的格式粘贴呢?图片并不是展示代码的最佳方式。 - Alex Metsai
嗨,Alex Metsai,我会更改格式,谢谢你的建议! - Eureka JX

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