- Обработка Excel файлов с использованием Python
- Чтение входного файла
- Создание нового файла и заполнение его
- Создание копии файла на основе входного файла
- Удаление строк по заданному условию
- Заключение
- Ссылки
- xlrd¶
- Indices and tables¶
- The xlrd Module – How To Handle Excel Files In Python?
- What is Microsoft Excel?
- Getting Started with the xlrd Module
- Working with Excel Files Using the xlrd Module
- Step 1: Load an Excel File
- Step 2: Access a Specific Worksheet
- Printing value of a cell
- Printing the Number of rows and columns
- Printing the Names of All the Columns
- Printing the first 10 rows of 5 columns
- Conclusion
Обработка Excel файлов с использованием Python
По работе пришлось столкнуться с задачей обработки xls файлов средствами python. Немного по гуглив, я натолкнулся на несколько библиотек, с помощью которых можно работать с файлами excel.
Библиотеки:
— xlrd – дает возможность читать файлы Excel
— xlwt – создание и заполнение файлов Excel
— xlutils – набор утилит для расширения возможности предыдущих двух библиотек
— pyExcelerator – также дает возможность работать с файлами Excel, но давно не обновлялась.
Для своей задачи я использовал первые три библиотеки.
Задача была разбита на несколько частей: чтение файла с расширением xls; создание нового и заполнение его; создание копии файла на основе входного файла; удаление необходимых строк в выходном файле.
Чтение входного файла
Эта задача не отличается высокой сложностью. Документация и примеры, идущие в комплекте с xlrd, помогли быстро решить ее.
Пример кода:
import xlrd
rb = xlrd . open_workbook( ‘d:/final.xls’ ,formatting_info = True )
sheet = rb . sheet_by_index( 0 )
for rownum in range (sheet . nrows):
row = sheet . row_values(rownum)
for c_el in row:
print c_el
Создание нового файла и заполнение его
import xlwt
from datetime import datetime
font0 = xlwt . Font()
font0 . name = ‘Times New Roman’
font0 . colour_index = 2
font0 . bold = True
style0 = xlwt . XFStyle()
style0 . font = font0
style1 = xlwt . XFStyle()
style1 . num_format_str = ‘D-MMM-YY’
wb = xlwt . Workbook()
ws = wb . add_sheet( ‘A Test Sheet’ )
ws . write( 0 , 0 , ‘Test’ , style0)
ws . write( 1 , 0 , datetime . now(), style1)
ws . write( 2 , 0 , 1 )
ws . write( 2 , 1 , 1 )
ws . write( 2 , 2 , xlwt . Formula( «A3+B3» ))
Создание копии файла на основе входного файла
Эта задача может решаться двумя путями. Вариант первый: открываем на чтение входной файл, создаем новый файл и по циклу переписываем все данные с одного файла в другой. Такое решение не сложно реализовать, поэтому пример кода выкладывать нет смысла. Вариант второй: воспользоваться библиотекой xlutils. В данной библиотеке есть много чего интересного и полезного, но для нашей задачи будет интересен именно xlutils.copy.
И так, пример кода по созданию файла на основании входного с использованием xlutils.copy:
import xlrd
import xlwt
from xlutils.copy import copy
rb = open_workbook( ‘final.xls’ ,on_demand = True ,formatting_info = True )
wb = copy(rb)
wb . save( «final_complete.xls» )
Вот такой вот небольшой код получился. Для того чтобы он работал, обязательно должен стоять флаг on_demand=True. Благодаря использованию флага formatting_info выходной файл получается с такими же стилями оформления, как и входной. Для моей задачи это оказалась нужная опция.
Удаление строк по заданному условию
Для решения данной задачи было решено использовать фильтр. Один из вариантов — это переписывание из одного файла в другой, исключая те варианты, которые не выполняют заданное условие. Но тут есть одна загвоздка, если необходимо сохранить стиль оформление документа, то этот подход не подойдет (Если конечно вы заранее не знаете стиль оформления и можете задать его программно). Решение поставленной задачи было достигнуто посредством использования xlutils.filter. Задача: оставить в выходном Excel файле только те записи, которые содержатся в передаваемом списке.
Код, который решает данную задачу:
from xlutils.filter import GlobReader,BaseFilter,DirectoryWriter,process
myfile = ‘final2.xls’
mydir = ‘d:/’
class MyFilter (BaseFilter):
def __init__ ( self ,elist):
self . goodlist = goodlist
self . wtw = 0
self . wtc = 0
def workbook ( self , rdbook, wtbook_name):
self . next . workbook(rdbook, ‘filtered_’ + wtbook_name)
def row ( self , rdrowx, wtrowx):
pass
def cell ( self , rdrowx, rdcolx, wtrowx, wtcolx):
value = self . rdsheet . cell(rdrowx,rdcolx) . value
if value in self . goodlist:
self . wtc = self . wtc +1
self . next . row(rdrowx,wtrowx)
else :
return
self . next . cell(rdrowx,rdcolx, self . wtc,wtcolx)
data = «»»somedata1
somedata2
somedata3
somedata4
somedata5
«»»
goodlist = data . split( » \n » )
process(GlobReader(os . path . join(mydir,myfile)),MyFilter(goodlist),DirectoryWriter(mydir))
Заключение
Используя набор из трех библиотек, поставленные задачи были решены. Было замечено следующее: при наличии во входном Excel файле графических элементов (картинки и т.д) в выходной файл они не переносятся. Возможно изучив эти библиотеки можно будет решить и эту часть задачи.
Ссылки
P.S. Думаю было бы неплохо перенести данный пост в тематический блог.
xlrd¶
xlrd is a library for reading data and formatting information from Excel files in the historical .xls format.
This library will no longer read anything other than .xls files. For alternatives that read newer file formats, please see http://www.python-excel.org/.
The following are also not supported but will safely and reliably be ignored:
- Charts, Macros, Pictures, any other embedded object, including embedded worksheets.
- VBA modules
- Formulas, but results of formula calculations are extracted.
- Comments
- Hyperlinks
- Autofilters, advanced filters, pivot tables, conditional formatting, data validation
Password-protected files are not supported and cannot be read by this library.
import xlrd book = xlrd.open_workbook("myfile.xls") print("The number of worksheets is ".format(book.nsheets)) print("Worksheet name(s): ".format(book.sheet_names())) sh = book.sheet_by_index(0) print(" ".format(sh.name, sh.nrows, sh.ncols)) print("Cell D30 is ".format(sh.cell_value(rowx=29, colx=3))) for rx in range(sh.nrows): print(sh.row(rx))
From the command line, this will show the first, second and last rows of each sheet in each file:
python PYDIR/scripts/runxlrd.py 3rows *blah*.xls
You may also wish to consult the tutorial.
For details of how to get involved in development of this package, and other meta-information, please see the sections below:
Indices and tables¶
© Copyright 2005-2019 Stephen John Machin, Lingfo Pty Ltd. 2019-2021 Chris Withers Revision 0c4e80b3 .
Versions latest stable Downloads On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.
The xlrd Module – How To Handle Excel Files In Python?
Microsoft Excel is one of the most widely used applications for data analysis and visualization. Nearly every organization works with Excel files in some form. As a Python programmer, a useful skill to have is the ability to read, parse, and manipulate Excel files using Python.
In this tutorial, you’ll learn how to explore Excel files using the xlrd module in Python. xlrd allows you to extract data from Excel files (.xlsx and .xls) without needing to install MS Office.
- Loading Excel files
- Accessing worksheets
- Reading cell values
- Getting sheet dimensions
- Printing column names
- Extracting rows and columns
Whether you want to automate Excel reports, parse spreadsheet data, or simply open Excel files in Python, the xlrd module has you covered. Mastering xlrd will allow you to tap into a vast amount of data locked away in Excel spreadsheets.
What is Microsoft Excel?
Microsoft Excel is the world’s most popular spreadsheet software. Used by over a billion people worldwide, it helps users organize, analyze, and visualize data from an intuitive user interface.
At its core, Excel is a table. It has the typical structure of a table including the rows and columns. But the formulas and functionality that you can integrate within each and every cell is what makes Excel an extremely powerful database/table.
With Excel, you can:
- Perform complex calculations and analyses on massive datasets
- Create stunning data visualizations like charts, graphs, and pivot tables
- Develop your own formulas and macros to automate repetitive tasks
- Share and collaborate on spreadsheets with colleagues
- Import and export data from various file formats
Excel has a simple yet powerful interface. While the basics are easy to pick up, Excel has many sophisticated features for handling large, complex datasets, creating advanced formulas, modeling data, and designing professional reports and dashboards.
Getting Started with the xlrd Module
The xlrd module allows you to extract data from Excel spreadsheets (.xls and .xlsx) without needing MS Office installed. With xlrd, you can read Excel files in Python and access sheets, rows, columns, and cells.
To get started, you first need to install xlrd. You can do this using pip:
Once installed, you can import the module into your Python script:
The primary objects in xlrd are:
- Book – Represents the Excel workbook (the file itself).
- Sheet – Represents one worksheet in a workbook.
- Cell – Represents one cell in a sheet. Contains row, column, and cell value.
- Row and Column – Represent a single row or column in a sheet.
Working with Excel Files Using the xlrd Module
We would be working on a few things with the help of the xlrd module one after another. Before doing anything let’s look at the dataset we would be using.
You can use any dataset you find suitable or create your own custom dataset. I downloaded a random finance dataset which can be downloaded here.
Step 1: Load an Excel File
Initially, we would be importing the xlrd module and then use the open_workbook function under the xlrd module in order to load the workbook whose path is mentioned inside the function.
# Importing Module import xlrd # Loading Excel file wb = xlrd.open_workbook('Financial Sample.xlsx')
Step 2: Access a Specific Worksheet
Now there can be multiple workbooks inside a single excel file but we want to work on the first workbook and for the same, we will make use of the sheet_by_index function and pass the index of the sheet we want to work on.
# Storing the first sheet into a variable sheet = wb.sheet_by_index(0)
Printing value of a cell
After loading a certain workbook, we would like to print the value of a certain cell using the cell_value function which would require the row and column number of the cell we want to read.
# Printing various cell values print("Value of 0-0 cell: ",sheet.cell_value(0, 0)) print("Value of 20-4 cell: ",sheet.cell_value(20, 4))
The output after execution is:
Value of 0-0 cell: Segment Value of 20-4 cell: 1006.0
Printing the Number of rows and columns
In order to print the number of rows and columns in the excel file, we would make use of the ‘nrows’ and ‘ncols’ function.
# Get max no of rows and columns print("Number of Rows: ", sheet.nrows) print("Number of Columns: ",sheet.ncols)
The output after execution is:
Number of Rows: 701 Number of Columns: 16
Printing the Names of All the Columns
This can be achieved using the code mentioned below. We just need to print the value of each column cell in the first row.
# Get all column names print("ALL COLUMN NAMES ARE: ") for i in range(sheet.ncols): print(sheet.cell_value(0,i))
The output after execution is shown below:
ALL COLUMN NAMES ARE: Segment Country Product Discount Band Units Sold Manufacturing Price Sale Price Gross Sales Discounts Sales COGS Profit Date Month Number Month Name Year
Printing the first 10 rows of 5 columns
This can be achieved using the code mentioned below. You can print multiple rows and columns if you wish to.
# Get first 10 rows for 5 columns for i in range(11): for j in range(5): print(sheet.cell_value(i,j), end="\t\t\t") print()
The output is mentioned below:
Segment Country Product Discount Band Units Sold Government Canada Carretera None 1618.5 Government Germany Carretera None 1321.0 Midmarket France Carretera None 2178.0 Midmarket Germany Carretera None 888.0 Midmarket Mexico Carretera None 2470.0 Government Germany Carretera None 1513.0 Midmarket Germany Montana None 921.0 Channel Partners Canada Montana None 2518.0 Government France Montana None 1899.0 Channel Partners Germany Montana None 1545.0
Conclusion
In this tutorial, you learned the basics of using xlrd to explore and extract data from Excel files in Python. We covered loading workbooks, accessing sheets, reading cell values, getting sheet dimensions, printing column names, and extracting rows and columns.
With these skills, you can now automate Excel reporting, parse spreadsheet data, and unlock insights trapped in Excel files. xlrd opens up a whole new world of data that you can analyze and visualize using the power of Python.
You now have a powerful tool to extract data from Excel files in Python. I hope you found this introduction to xlrd useful!
Liked the tutorial? Have a look at these tutorials: