使用Python中的Openpyxl修改现有的Excel文件

27

我基本上是在试图使用Python从CSV文件中复制一些特定的列,并将这些列粘贴到一个现有的Excel文件[*.xlsx]中。例如,假设您有这样的CSV文件:

 col_1   col_2   col_3  col_4
  1        2       3     4
  5        6       7     8
  9       10      11    12 

所以,我想要复制col_3和col_4并将它们粘贴到现有的Excel文件(.XLSX格式)中的col_8和col_9中。 我已经尝试了多种方法来解决这个问题,但找不到确切的方法。 我尝试了类似于以下的内容:

with open( read_x_csv, 'rb') as f:
    reader = csv.reader(f)
    for row in reader: 
            list1 = row[13] 
            queue1.append(list1)
            list2 = row[14] 
            queue2.append(list2)
            list3 = row[15] 
            queue3.append(list3)
            list4 = row[16] 
            queue4.append(list4)

然后

 rb = open_workbook("Exact file path.....")
 wb = copy(rb)
 ws = wb.get_sheet(0) 

 row_no = 0

 for item in queue1:
    if(item != ""):
            ii = int(item)
            ws.write(row_no,12,ii) 
            row_no = row_no + 1
            #ws.write(item)
            print item
    else:

            ws.write(row_no,12,item) 
            row_no = row_no + 1

  wb.save("Output.xls") 

但是这种解决方案的问题在于它不允许我保存为*.XLSX格式,而这对我来说是必须的。

我尝试使用Openpyxl,因为它可以处理*.XLSX格式,但是找不到修改现有Excel文件的方法。请问有人可以帮忙吗?

疑问: 1) 我们真的能够使用Python从CSV文件中读取整列并存储到数组/列表中吗? 2) 我们能够使用openpyxl或其他任何包修改现有的.XLSX格式的Excel文件吗?

4个回答

32
你可以尝试以下实现。

你可以尝试以下实现

from openpyxl import load_workbook
import csv
def update_xlsx(src, dest):
    #Open an xlsx for reading
    wb = load_workbook(filename = dest)
    #Get the current Active Sheet
    ws = wb.get_active_sheet()
    #You can also select a particular sheet
    #based on sheet name
    #ws = wb.get_sheet_by_name("Sheet1")
    #Open the csv file
    with open(src) as fin:
        #read the csv
        reader = csv.reader(fin)
        #enumerate the rows, so that you can
        #get the row index for the xlsx
        for index,row in enumerate(reader):
            #Assuming space separated,
            #Split the row to cells (column)
            row = row[0].split()
            #Access the particular cell and assign
            #the value from the csv row
            ws.cell(row=index,column=7).value = row[2]
            ws.cell(row=index,column=8).value = row[3]
    #save the csb file
    wb.save(dest)
  • 我们能否使用Python从CSV文件中读取一整列并存储到数组/列表中?不行,因为文件是按顺序读取的,CSV读取器无法将一列数据读取到一行中。相反,您可以读取整个内容,并使用izip和islice获取特定列,也可以使用numpy.array。

  • 我们能否使用openpyxl或其他软件包修改已经存在且为 .XLSX 格式的Excel文件?能,参见上面的例子。


你在保存工作簿时是否遇到了年份低于1900的错误? - Jesse
为什么会有src和dest两个参数? - FabioSpaghetti

12

由于已经是2021年,get_sheet_by_name方法已被弃用并会引发以下DeprecationWarning警告:

Call to deprecated function get_sheet_by_name (Use wb[sheetname]).

为了避免产生警告,可以使用以下代码片段。

from openpyxl import load_workbook

file_path = 'test.xlsx'

wb = load_workbook(file_path)

ws = wb['SHEET_NAME']  # or wb.active

ws['G6'] = 123

wb.save(file_path)



3
from openpyxl import load_workbook
# Class to manage excel data with openpyxl.

class Copy_excel:
    def __init__(self,src):
        self.wb = load_workbook(src)
        #self.ws = self.wb.get_sheet_by_name("Sheet1") # Deprecated
        self.ws = self.wb["Sheet1"]
        self.dest="destination.xlsx"

    # Write the value in the cell defined by row_dest+column_dest         
    def write_workbook(self,row_dest,column_dest,value):
        c = self.ws.cell(row = row_dest, column = column_dest)
        c.value = value
    
    # Save excel file
    def save_excel(self) :  
        self.wb.save(self.dest)

2
我该如何使用这个类?您能否在回答中包含一个例子? - FabioSpaghetti

1

打开现有的Excel文件(使用load_workbook(...)

就这么简单!

from openpyxl import load_workbook
wb = load_workbook('test.xlsx')

请参阅文档: https://openpyxl.readthedocs.io/en/stable/tutorial.html#loading-from-a-file

在末尾添加数据(保留旧数据)

work_sheet = wb.active # Get active sheet
work_sheet.append(['John', 'Customer', 'He likes football'])

将修改后的工作簿保存为 test.xlsx

wb.save('test.xlsx')

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