如何在使用Openpyxl进行循环时选择xlsx文件的多列(但相同行)?

时间:2018-02-17 07:02:14

标签: python excel pandas openpyxl xlrd

这里有python初学者。我有一个看起来像这样的excel文件(示例) Balance Sheet 我想提取此财务报表的所有项目并将其写入新的Excel表格。我想要的输出是一列下的所有帐户,以及另一列中的所有相应数字 Intended output 到目前为止我的代码是:

import openpyxl
fwb=openpyxl.load_workbook('wb.xlsx')
sheet=fwb['Sheet1']
sheet['A9']

for i in range(9,sheet.max_row,1):
    items=sheet.cell(row=i, column=1).value
    number1=sheet.cell(row=i, column=3).value
    number2=sheet.cell(row=i, column=4).value
    print(items, number1, number2)

我的问题是我希望项目列表位于一列之下,就像预期的输出一样。因此,我理想地希望 items = sheet.chell(row = i,column = 1 AND 2)。有没有办法实现这个目标?非常感谢adv

3 个答案:

答案 0 :(得分:0)

我将从代码中猜测工作表的结构,因为您没有指定哪些范围包含哪些数据。

这样的事可能适合你。 您可能需要使用+/- 1调整某些值,具体取决于标题等。

row_base1=len(sheet['A'])
nrows2=len(sheet['C'])-9
for i in range(1,nrows2):
    row1=row_base1+i
    row2=8+i
    number1=sheet.cell(row=row2, column=3).value
    number2=sheet.cell(row=row2, column=4).value
    sheet.cell(row=row1, column=1).value=number1
    sheet.cell(row=row1, column=2).value=number2
    print(items, number1, number2)

nrows2可能会提供比您实际需要的数字更大的数字,请参阅this。 在这种情况下,您将不得不在循环内添加一些检测方法。

答案 1 :(得分:0)

在openpyxl中,这非常简单:

ws1是您的源工作表 ws2是你的目标工作表

for row in ws1['A':'B']:
    ws2.append((c.value for c in row))

for row in ws1['C':'D']:
    ws2.append((c.value for c in row))

根据需要调整列

答案 2 :(得分:-1)

您可能会尝试使用pandas,如下所示。如果需要,可以将结果保存到excel文件中。首先运行#pip install xlrd。

import pandas as pd
book1 = pd.ExcelFile('book1.xlsx')
df = pd.read_excel(book1, 'Sheet1')
cols = ['Item', 'Value']
x = df.drop(df.columns[2:], axis=1)
y = df.drop(df.columns[:2], axis=1)
x.columns = cols
y.columns = cols
df2 = pd.concat([x, y], ignore_index=True)
df2.dropna(how='all', inplace=True)
print(df2)

Result1

也可以这样做

df2['Index'] = df2.loc[df2['Value'].isnull(), 'Item']
df2.Index.fillna(method='ffill', inplace=True)
df3 = df2.set_index(['Index', 'Item']).dropna()
print(df3)

Result2