使用python将文本文件添加到现有的Excel工作簿

时间:2014-04-16 21:54:51

标签: python excel formatting xlrd openpyxl

如果这是一个基本问题,请道歉,但让我们说我有一个名为file.txt的制表符分隔文件格式如下:

Label-A    [tab]    Value-1

Label-B    [tab]    Value-2

Label-C    [tab]    Value-3

[...]

Label-i    [tab]    Value-n

我希望xlrdopenpyxl将此数据添加到文件Worksheet中名为workbook.xlsx的Excel工作表中,以便单元格包含以下值。除了受影响的两列之外,我不想影响workbook.xlsx的任何其他部分的内容

A1=Label-A

B1=Value-1

A2=Label-B

B2=Value-2

[etc.]

编辑:解决方案

import sys
import csv
import openpyxl

tab_file = sys.stdin.readlines()

reader = csv.reader(tab_file, delimiter='\t')
first_row = next(reader)
num_cols = len(first_row)

try:
    workbook = sys.argv[1]
    write_sheet = sys.argv[2]
except Exception:
    raise sys.exit("ERROR")

try:   
    first_col = int(sys.argv[3])
except Exception:
    first_col = 0

tab_reader = csv.reader(tab_file, delimiter='\t')
xls_book = openpyxl.load_workbook(filename=workbook)
sheet_names = xls_book.get_sheet_names()
xls_sheet = xls_book.get_sheet_by_name(write_sheet)
for row_index, row in enumerate(tab_reader):
    number = 0
    col_number = first_col
    while number < num_cols:
        cell_tmp = xls_sheet.cell(row = row_index, column = col_number)
        cell_tmp.value = row[number]
        number += 1
        col_number += 1
xls_book.save(workbook)

3 个答案:

答案 0 :(得分:1)

既然你说你已经习惯了在Bash工作,我假设你正在使用某种Unix / Linux,所以这里有一些适用于Linux的东西。

在粘贴代码之前,我想指出一些事情:

在Unix(和Python)中使用Excel并不是那么简单。例如,您无法同时打开Excel工作表进行读写(至少,据我所知,尽管我必须认识到我从未使用过openpyxl模块) 。在处理Excel工作表时,Python有两个众所周知的模块(我习惯使用: - D ):一个用于读取Excel工作表(xlrd),第二个用于读取Excel工作表用于编写它们(xlwt)对于这两个模块,如果您想要修改现有工作表,正如我所理解的那样,您需要阅读现有工作表,将其复制到可写工作表并编辑该工作表。查看this other S.O. question中的问题/答案,更详细地解释一下。

通过csv模块(为逗号分隔文件做好准备,但可以轻松调整其他分隔符),

> - 分隔文件更容易。看看吧。

另外,如果选项卡分隔文件的内容以某种方式表示Excel工作表上的行索引或者它们纯粹是位置,那么我对您的示例并不十分肯定。当你在标签分隔文件中说Value-2时,我不确定2是否意味着Excel文件中的第二行,或者它只是某些文本的示例。我假设了最新的(更容易处理),因此无论对象分隔文件的第一行出现的标签值对将是Excel文件第一行的第一对。事实并非如此,请留言我们会处理它; - )

好的,让我们假设以下情况:

你有一个像这样的制表符分隔文件:

stack37.txt

Label-A Value-1
Label-B Value-2
Label-C Value-3

您要修改的Excel文件是 stack37.xls 。它只有一张(或更好说,你要修改的表是文件中的第一张),它最初看起来像这样(在LibreOffice Calc中):

enter image description here

现在,这是python代码(我将其存储在名为 stack37.py 的文件中,它位于制表符分隔文件和excel文件的同一目录中) :

import csv
import xlwt
import xlrd
from xlutils import copy as xl_copy

with open('stack37.txt') as tab_file:
    tab_reader = csv.reader(tab_file, delimiter='\t')
    xls_readable_book = xlrd.open_workbook('stack37.xls')
    xls_writeable_book = xl_copy.copy(xls_readable_book)
    xls_writeable_sheet = xls_writeable_book.get_sheet(0)
    for row_index, row in enumerate(tab_reader):
        xls_writeable_sheet.write(row_index, 0, row[0])
        xls_writeable_sheet.write(row_index, 1, row[1])
    xls_writeable_book.save('stack37.xls')

运行此代码后,文件 stack37.xls 将如下所示:

enter image description here

我的意思是不知道你对标签分隔文件中的值到底想要做什么,无论你在那里命名你的项目,它都会修改excel表的第一行,然后是第二行...(即使您的第一个Value被称为Value-2,上面的代码也不会将该值放在Excel工作表的第二行,而是放在第一行上。它只是假设第一行在制表符分隔文件中,对应于要在Excel工作表的第一行上设置的值。

让我们用略微修改的例子解释一下:

让我们假设您的原始Excel文件看起来像我的屏幕截图上的原始excel文件(| Hello-Ax | Bye-Bx |),但您的制表符分隔文件现在看起来像这样:

stack37.txt

foo bar
baz baz2

运行 stack37.py 之后,这就是Excel的外观:

enter image description here

(参见?选项卡分隔文件的第一行转到Excel文件的第一行)

更新1

我自己尝试openpyxl模块...从理论上讲(根据文档),以下内容应该有效(请注意,我已将扩展更改为Excel 2007/2010 {{1 }}):

.xlsx

但是,如果我这样做,我的LibreOffice拒绝打开新生成的文件import csv import openpyxl with open('stack37.txt') as tab_file: tab_reader = csv.reader(tab_file, delimiter='\t') xls_book = openpyxl.load_workbook(filename='stack37.xlsx') sheet_names = xls_book.get_sheet_names() xls_sheet = xls_book.get_sheet_by_name(sheet_names[0]) for row_index, row in enumerate(tab_reader): cell_tmp1 = xls_sheet.cell(row = row_index, column = 0) cell_tmp1.value = row[0] cell_tmp2 = xls_sheet.cell(row = row_index, column = 1) cell_tmp2.value = row[1] xls_book.save('stack37_new.xlsx') (也许是因为我的LibreOffice已经老了?我在Ubuntu 12.04,LibreOffice版本3.5.7.2 ...谁知道,也许只是那个)

答案 1 :(得分:0)

这是VBA的工作,但如果我不得不用Python做,我会做这样的事情:

import Excel
xl = Excel.ExcelApp(False)
wb = xl.app.Workbooks("MyWorkBook.xlsx")
wb.Sheets("Ass'y").Cells(1, 1).Value2 = "something"
wb.Save()

使用这样的帮助Excel.py类:

import win32com.client

class ExcelApp(object):
    def __init__(self, createNewInstance, visible = False):
        self._createNewInstance=createNewInstance

        if createNewInstance:
            self.app = win32com.client.Dispatch('Excel.Application')
            if visible:
                self.app.Visible = True
        else:
            self.app = win32com.client.GetActiveObject("Excel.Application")

    def __exit__(self):
        if self.app and self._createNewInstance:
            self.app.Quit()

    def __del__(self):
        if self.app and self._createNewInstance:
            self.app.Quit()

    def quit(self):
        if self.app:
            self.app.Quit()

答案 2 :(得分:0)

您应该使用标准库中的CSV模块来读取文件。

在openpyxl中你可以这样:

from openpyxl import load_workbook
wb = load_workbook('workbook.xlsx')
ws = wb[sheetname]
for idx, line in enumerate(csvfile):
    ws.cell(row=idx, column=0) = line[0]
    ws.cell(row=idx, column=1) = line[1]
wb.save("changed.xlsx")