Автор: Шабанов Павел
E-mail: meteomail@yandex.ru
Довольно давно в блоге был пост про чтение данных из файла excel. Восполним пробел и научимся обратному действию - записывать данные в файл Excel.
Общая логика проста - нужно указать номера (столбца/строки) ячеек и данные. Для работы с форматом xls будем использовать модуль xlwt.
Про модуль xlwt подробнее можно почитать на сайте python-excel.org.
import numpy as np
from xlwt import Workbook
x = np.arange(27).reshape((9,3))*10.
# 1 Создаём экземпляр класса Workbook
book = Workbook()
# 2 Добавляем новый Лист в созданный экземпляр Workbook с помощью метода add_sheet()
sheet = book.add_sheet('Sheet 1')
# 3 Функция enumerate возвращает номер итерации (индекс) и значения
debug = False
for row, array in enumerate(x):
for col, value in enumerate(array):
# 4 Записываем значения в ячейку, указывая номера её строки/столбца и значение
if(debug): print(row, col, value)
sheet.write(row, col, value)
# 5 Сохраняем с помощью метода save() сформированный файл
book.save("test_wr_excel.xls")
Если есть необходимость выписать матрицы на разные листы файла Excel, то это можно сделать, например, так:
import numpy as np
from xlwt import Workbook
xx = np.arange(27).reshape((9,3))*10.
yy = np.random.random(100).reshape((10,10))
zz = np.ones(15).reshape((5,3))
# Объединияем массивы в список xyz
xyz = [xx, yy, zz]
xyz_name = ['xx', 'yy', 'zz']
book = Workbook()
i = -1
for x in xyz:
i += 1
s = xyz_name[i]
sheet = book.add_sheet(s)
for row, array in enumerate(x):
for col, value in enumerate(array):
sheet.write(row, col, value)
book.save("test_wr_excel2.xls")
Стоит отметить, что если необходимо выписать просто столбец, не матрицу, то приведённый выше код будет давать ошибку. Чтобы выписать в файл и матрицы и вектора, можно написать следующее:
import numpy as np
from xlwt import Workbook
xx = np.arange(27).reshape((9,3))*10.
yy = np.random.random(100).reshape((10,10))
zz = np.ones(15)
# Объединияем массивы в список xyz
xyz = [xx, yy, zz]
xyz_name = ['xx', 'yy', 'zz']
book = Workbook()
i = -1
for x in xyz:
i += 1
s = xyz_name[i]
sheet = book.add_sheet(s)
for row, array in enumerate(x):
# Проверка на вектор. Если да, то
if(np.size(array) == 1):
col = 0
sheet.write(row, col, array)
else:
for col, value in enumerate(array):
sheet.write(row, col, value)
book.save("test_wr_excel3.xls")
Можно оформить данный код в виде функции, например, такой:
import numpy as np
from xlwt import Workbook
def wr_xls(x, name, debug=False):
'''
Saves matrix 'X' in 'name.xls' file
Parameters
----------
x : (numpy.ndarray)
Input matrix (2D array)
name : (str)
The name of future xls file
debug: (bool), optional
Returns
-------
File : (xls)
Xls file with matrix values in it
'''
book = Workbook()
sheet = book.add_sheet('Sheet 1')
for row, array in enumerate(x):
if (debug):
print (row, array)
if(np.size(array) == 1):
col = 0
sheet.write(row, col, array)
else:
for col, value in enumerate(array):
sheet.write(row, col, value)
name = "%s.xls" % (name)
book.save(name)
N = 20
x = np.random.rand(N)
wr_xls(x, 'test_rand_excel')