2016-01-12 8 views
11

Je souhaite extraire uniquement la colonne A de ma feuille de calcul. J'ai le code ci-dessous, mais il tire de toutes les colonnes.openpyxl - Lit une seule colonne du fichier Excel en python?

from openpyxl import Workbook, load_workbook 

wb=load_workbook("/home/ilissa/Documents/AnacondaFiles/AZ_Palmetto_MUSC_searchterms.xlsx", use_iterators=True) 
sheet_ranges=wb['PrivAlert Terms'] 

for row in sheet_ranges.iter_rows(row_offset=1): 
    for cell in row: 
     print(cell.value) 

Répondre

0

Je suggère d'utiliser la bibliothèque pandas.

import pandas as pd 
dataFrame = pd.read_excel("/home/ilissa/Documents/AnacondaFiles/AZ_Palmetto_MUSC_searchterms.xlsx", sheetname = "PrivAlert Terms", parse_cols = 0) 

Si vous ne vous sentez pas à l'aise en pandas géants, ou pour quelque raison que ce besoin de travailler avec openpyxl, l'erreur dans votre code est que vous ne choisissez pas seulement la première colonne. Vous appelez explicitement pour chaque cellule de chaque ligne. Si vous ne voulez que la première colonne, n'obtenez que la première colonne de chaque ligne.

for row in sheet_ranges.iter_rows(row_offset=1): 
    print(row[0].value) 
+0

Ceci renvoie encore une ligne à la fois . –

1

Utilisation ws.get_squared_range() pour contrôler avec précision la plage de cellules, comme une seule colonne, qui est retourné.

1

Voici une fonction simple:

import openpyxl 

def return_column_from_excel(file_name, sheet_name, column_num, first_data_row=1): 
    wb = openpyxl.load_workbook(filename=file_name) 
    ws = wb.get_sheet_by_name(sheet_name) 
    min_col, min_row, max_col, max_row = (column_num, first_data_row, column_num, ws.max_row) 
    return ws.get_squared_range(min_col, min_row, max_col, max_row) 
7

c'est une alternative aux réponses précédentes au cas où vous whish lire une ou plusieurs colonnes en utilisant openpyxl

import openpyxl 

wb = openpyxl.load_workbook('origin.xlsx') 
first_sheet = wb.get_sheet_names()[0] 
worksheet = wb.get_sheet_by_name(first_sheet) 

#here you iterate over the rows in the specific column 
for row in range(2,worksheet.max_row+1): 
    for column in "ADEF": #Here you can add or reduce the columns 
     cell_name = "{}{}".format(column, row) 
     worksheet[cell_name].value # the value of the specific cell 
     ... your tasks... 

Je souhaite que cela soit utile.

+0

vouliez-vous dire: 'pour row in range (2, worksheet.max_row + 1):' au lieu de 'pour row in range (2, worksheet.max_row):'? –

+0

Salut, non. Étant donné que worksheet.max_row renvoie l'index le plus élevé avec des éléments, si vous ajoutez +1, la dernière ligne sera une ligne vide. Il est possible de vérifier d'autres exemples ici: [openpyxl] (http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/worksheet/worksheet.html) – ZLNK

+0

ouais, mais pour la fonction 'range', le second param est exclusif. De cette façon, nous manquerions les données de la dernière rangée –

0

En utilisant une excellente réponse de ZLNK, j'ai créé cette fonction qui utilise la compréhension de la liste pour obtenir le même résultat en une seule ligne:

def read_column(ws, begin, columns): 
    return [ws["{}{}".format(column, row)].value for row in range(begin, len(ws.rows) + 1) for column in columns] 

Vous pouvez alors l'appeler en passant une feuille de calcul, une ligne pour commencer sur et la première lettre d'une colonne que vous souhaitez revenir:

column_a_values = read_column(worksheet, 2, 'A') 

pour retourner la colonne A et la colonne B, les changements d'appels à ceci:

column_ab_values = read_column(worksheet, 2, 'AB') 
1

En utilisant openpyxl

from openpyxl import load_workbook 
# The source xlsx file is named as source.xlsx 
wb=load_workbook("source.xlsx") 

ws = wb.active 
first_column = ws['A'] 

# Print the contents 
for x in xrange(len(first_column)): 
    print(first_column[x].value) 
0

En utilisant la bibliothèque openpyxl et liste de Python concept de compréhensions:

import openpyxl 

book = openpyxl.load_workbook('testfile.xlsx') 
user_data = book.get_sheet_by_name(str(sheet_name)) 
print([str(user_data[x][0].value) for x in range(1,user_data.max_row)]) 

Il est approche assez incroyable et la peine d'essayer