如果这是一个基本问题,请道歉,但让我们说我有一个名为file.txt
的制表符分隔文件格式如下:
Label-A [tab] Value-1
Label-B [tab] Value-2
Label-C [tab] Value-3
[...]
Label-i [tab] Value-n
我希望xlrd或openpyxl将此数据添加到文件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)
答案 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中):
现在,这是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 将如下所示:
我的意思是不知道你对标签分隔文件中的值到底想要做什么,无论你在那里命名你的项目,它都会修改excel表的第一行,然后是第二行...(即使您的第一个Value
被称为Value-2
,上面的代码也不会将该值放在Excel工作表的第二行,而是放在第一行上。它只是假设第一行在制表符分隔文件中,对应于要在Excel工作表的第一行上设置的值。
让我们用略微修改的例子解释一下:
让我们假设您的原始Excel文件看起来像我的屏幕截图上的原始excel文件(| Hello-Ax | Bye-Bx |
),但您的制表符分隔文件现在看起来像这样:
stack37.txt :
foo bar
baz baz2
运行 stack37.py 之后,这就是Excel的外观:
(参见?选项卡分隔文件的第一行转到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")