openpyxl python - 将csv写入excel显示“数字格式为文本”

8 投票
3 回答
21093 浏览
提问于 2025-04-18 14:52

我写了一段代码,用来通过openpyxl把一个包含数字的.csv文件导入到Excel文件中。这个代码能正常工作,但所有的单元格里的数字都被当作文本写入了Excel。这就导致我需要在Excel里手动修正这个错误,因为它会显示“数字格式为文本”(单元格角落会有小绿三角)。

有没有办法防止这种情况发生?无论我用什么.csv文件,即使只是数字,也会出现这个问题。谢谢。

#!python2
# Add csv file to an xlsx

import os, csv, sys, openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.cell import get_column_letter


#Open an xlsx for reading
wb = load_workbook('Test.xlsx')
ws = wb.get_sheet_by_name("RUN")

dest_filename = "Test_NEW.xlsx"
csv_filename = "csvfile.csv"

#Copy in csv
f = open(csv_filename)
reader = csv.reader(f)
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)

print "new Cashflow created"

*****更新***

谢谢,这对我有帮助。我的问题是我的.csv文件里混合了文本和数字,而且没有任何定义的引号。所以我实现了下面的代码,把字符串转换为浮点数,只要没有错误就可以。

#Copy in csv
f = open(csv_filename,'rb')
reader = csv.reader(f)
for row_index, row in enumerate(reader):
for column_index, cell in enumerate(row):
    column_letter = get_column_letter((column_index + 1))
    s = cell
    try:
        s=float(s)
    except ValueError:
        pass

    ws.cell('%s%s'%(column_letter, (row_index + 1))).value = s

3 个回答

0

在Openpyxl这个库里,get_column_letter这个函数的位置发生了变化。现在它不在openpyxl.cell这个地方了,而是移到了openpyxl.utils里。

from openpyxl.utils import get_column_letter
2

这是谷歌搜索的第一个结果,我花了比我愿意承认的更多时间在这个问题上。希望这能在未来帮助到某个人。

def csvtoxlsx(csv_name, xlsx_name, directory, floats):
    """
    A function to convert a CSV file to XLSX so it can be used by openpyxl.
    csvname = file name of csv you want to convert (include .csv)
    xlsx_name = name you want to name the xlsx file (include .xlsx)
    cwd = directory to find csv file (can pass os.getcwd())
    floats = A list of column indexes in which floats appear
    """

    os.chdir(directory)

    f = open(csv_name, 'rt')
    csv.register_dialect('commas', delimiter=',')
    reader = csv.reader(f, dialect='commas')
    wb = Workbook()
    dest_filename = xlsx_name
    ws = wb.worksheets[0]
    ws.title = xlsx_name[:-5]

    for row_index, row in enumerate(reader):
        for column_index, cell in enumerate(row):

            column_letter = get_column_letter((column_index + 1))

            if column_index in floats:
                s = cell
                #Handles heading row or non floats
                try:
                    s = float(s)
                    ws[('%s%s'%(column_letter, (row_index + 1)))].value = s

                except ValueError:
                    ws[('%s%s'%(column_letter, (row_index + 1)))].value = s

            elif column_index not in floats:
                #Handles openpyxl 'illigal chars'
                try:
                    ws[('%s%s'%(column_letter, (row_index + 1)))].value = cell

                except:
                    ws[('%s%s'%(column_letter, (row_index + 1)))].value = 'illigal char'



    wb.save(filename = dest_filename)
9

你需要把CSV文件里的值转换成你想要的格式。CSV文件里的所有值都是字符串,也就是文本形式的。ws.cell('%s%s'%(column_letter, (row_index + 1))).value = int(cell) 这段代码应该可以帮你完成这个转换。

顺便提一下,你可能还想看看 ws.append() 这个方法。

撰写回答