使用Openpyxl条件解析和输出xlsx文件

时间:2013-05-31 06:38:09

标签: python csv python-3.x xlsx openpyxl

我正在研究一个研究项目的数据。输出采用.csv文件的形式,已转换为.xlsx文件。每个参与者都有一个单独的输出文件,每个文件包含大约40个不同测量值的数据,这些测量数据来自几十个(或左右)刺激。为了理解所收集的数据,我们需要分别用相关的相关测量来查看每个刺激。每个输出文件都很大(50列乘60000行)。我正在寻找使用openpyxl解析数据库来搜索具有特定字符串值的预先指定列中的单元格。找到这样的单元格后,然后将该单元格与同一行中的其他指定列一起写入新工作簿。

例如,解析下表,我正在尝试使用openpyxl在A列中搜索“幻灯片2”。当为特定行找到此值时,该单元格将与该行C和D中的值一起写入新工作簿。

    A          B       C       D

1   Slide      Data1   Data2   Data3

2   Slide 1    1       2       3

3   Slide 2    4       5       6

4   Slide 2    7       8       9

会写:

    A          B       C       D

2   Slide 2    5       6

3   

4   

......或某种类似的格式。

我还希望用下一个文件中的数据填充D列和E列,然后用文件中的数据填充F和G(依此类推),但我可能会想出那个部分。

我试过了:

from openpyxl import load_workbook

wb = load_workbook(filename = r'test108.xlsx')

ws = wb.worksheets[0]

dest_filename = r'output.xlsx'

for x in range (0, 100): #0-100 as proof of concept before parsing entire worksheet
    if ws.cell(row = x, column =26) == ‘some_image.jpg':
        print (ws.cell(row =x, column =26), ws.cell(row = x, column = 10), ws.cell(row = x, column = 17))

wb.save = dest_filename

还添加了以下内容,试图在内存中创建一个操作单元格的工作表:

for i in range (0, 30):
    for j in range (0, 100):
        print (ws.cell(row =i, column=j))

...两者都有微小的变化,但它们都输出了原始文件的副本。

我已阅读并重新阅读openpyxl的文档,但无济于事。这里的论坛似乎没有任何类似的问题。

非常感谢正确操作和编写数据的任何见解。我也希望这可以帮助其他人尝试理解庞大的数据集。提前谢谢!

我在Windows 7上使用openpyxl-1.6.2运行Python3.3.2(64位)。数据最初采用.csv格式,因此如果有帮助,可以导出为.xls或其他格式。我简要介绍了xlutils(使用xlwt和xlrd),但是openpyxl在xlsx文件中工作得更好。


修改

非常感谢@MikeMüller指出我需要两个工作簿来传输数据。这更有意义。

我现在有以下内容,但它仍然返回一个空的工作簿。原始单元格不是空白的。 (评论的行是为了简化 - 当然没有缩进 - 但代码不成功。)

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

#n = 1

#for x in range (0, 1000):
    #if ws.cell(row = x, column = 27) == '7.image2.jpg':
        ws_out.cell(row = n, column = 1) == ws.cell(row = x, column = 26) #x changed
        ws_out.cell(row = n, column = 2) == ws.cell(row = x, column = 10) #x changed
        ws_out.cell(row = n, column = 3) == ws.cell(row = x, column = 17) #x changed
        #n += 1

wb_out.save('output108.xlsx')

修改2

我已更新代码以包含单元格的.value,但它仍会返回空白工作簿。

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

n = 1

for x in range (0, 1000):
    if ws.cell(row=x, column=27).value == '7.Image001.jpg':
        ws_out.cell(row=n, column=1).value = ws.cell(row=x, column=27).value
        ws_out.cell(row=n, column=2).value = ws.cell(row=x, column=10).value
        ws_out.cell(row=n, column=3).value = ws.cell(row=x, column=17).value
        n += 1

wb_out.save('output108.xlsx')

下一个有问题的人

摘要

您需要在内存中创建两个工作表。一个用于导入文件,另一个用于写入新的工作簿文件。

使用cell.value调用函数将输入的文本提取到导入的工作簿的每个单元格中,并将其设置为导出的工作簿中的所需单元格。

确保从零开始计算行和列。

2 个答案:

答案 0 :(得分:3)

您需要打开第二个笔记本进行写作:

import openpyxl
wb_out = openpyxl.Workbook(dest_filename)
ws_out = wb_out.worksheets[0]

把它放在你的循环中:

ws_out.cell('cell indices here').value = desired_value

保存文件:

writer = openpyxl.ExelWriter(workbook=wb_out)
writer.save(dest_filename)

答案 1 :(得分:3)

您正在正确进行细胞分配。这是应该工作的:

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

n = 1

for x in range (0, 1000):
    if ws.cell(row=x, column=27).value == '7.image2.jpg':
        ws_out.cell(row=n, column=1).value = ws.cell(row=x, column=26).value #x changed
        ws_out.cell(row=n, column=2).value = ws.cell(row=x, column=10).value #x changed
        ws_out.cell(row=n, column=3).value = ws.cell(row=x, column=17).value #x changed
        n += 1

wb_out.save('output108.xlsx')