Проблемы преобразования xlsx в 2d массив openpyxl - PullRequest
1 голос
/ 07 октября 2019

У меня есть таблица Excel с 2 столбцами, которую я пытаюсь преобразовать в 2d массив со следующим кодом:

#!/usr/bin/python3

import openpyxl
import sys
import os

book = openpyxl.load_workbook('contact2019.xlsx')

sheet = book.active


first_sheet = book.get_sheet_names()[0]
worksheet = book.get_sheet_by_name(first_sheet)
excel_data = [[0 for x in range(2)] for y in range(1)]

print(len(excel_data))
first = 0
cell_num = 0
for row in range(2,worksheet.max_row+1):
    for column in "AB":  #Here you can add or reduce the columns
        cell_name = "{}{}".format(column, row)
        excel_data.append(worksheet[cell_name].value)



print(excel_data)

Моя проблема заключается в том, что данные просто добавляются в массив 1d последовательно, поэтому мой вывод этого выглядит следующим образом:

['Sam Adams', '*******@gmail.com']

Это не двумерный массив, который я инициализировал.

Входные данные выглядят следующим образом:

Sam Adams   **********@gmail.com
Sammy Adams **********@gmail.com
Samuel Adams    **********@gmail.com
Samantha Adams  **********@gmail.com
Sam Adams   **********@gmail.com

Почему это назначение данных последовательно вместо двух в строке?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

В качестве альтернативы: Используйте pandas:

import pandas as pd
import numpy as np

df = pd.read_excel('test.xlsx')  # change the name of the file as needed

# dataframe
           name                 email
      Sam Adams  **********@gmail.com
    Sammy Adams  **********@gmail.com
   Samuel Adams  **********@gmail.com
 Samantha Adams  **********@gmail.com
      Sam Adams  **********@gmail.com

Создать массив:

excel_data = df.to_numpy()
print(excel_data)

# Output
array([['Sam Adams', '**********@gmail.com'],
       ['Sammy Adams', '**********@gmail.com'],
       ['Samuel Adams', '**********@gmail.com'],
       ['Samantha Adams', '**********@gmail.com'],
       ['Sam Adams', '**********@gmail.com']], dtype=object)
0 голосов
/ 07 октября 2019

Добро пожаловать в SO!

Ваш код ниже перебирает и добавляет каждый элемент в качестве отдельного элемента, следовательно, вы получаете все в последовательном порядке.

for row in range(2,worksheet.max_row+1):
    for column in "AB":  #Here you can add or reduce the columns
        cell_name = "{}{}".format(column, row)
        excel_data.append(worksheet[cell_name].value)

Вместо того, чтобы перебиратьстроки, а затем все столбцы, вы можете заменить код, чтобы только цикл по строкам.

for row in range(2,worksheet.max_row+1):        
    excel_data.append([worksheet["A{}".format(row)].value,worksheet["B{}".format(row)].value])

Делая это, вы теперь создаете список из 2 списков элементов (или двумерного массива).

Если вы не настроены на это, вы также можетерассмотрим библиотеку python pandas, которая абстрагирует большую часть работы и позволяет работать с электронными таблицами, такими как DataFrames.

...