This is the filter interface that shows the correct way to call the
next filter in the chain.
The next attribute is set up by the process() function.
It can make a good base class for a new filter, but subclassing
BaseFilter is often a better idea!

This method is called once processing of all workbooks has
been completed.

A filter should call this method on the next filter in the
chain as an indication that no further calls will be made to
any methods or that, if they are, any new calls should be
treated as new batch of workbooks with no information retained
from the previous batch.

Once instantiated, a reader will be called and have the first
filter in the chain passed to its __call__() method.
The implementation of this method
should call the appropriate methods on the filter based on the
cells found in the Book objects returned from the
get_workbooks() method.

If the data to be processed is not stored in files or if
special parameters need to be passed to xlrd.open_workbook()
then this method must be overriden.
Any implementation must return an iterable sequence of tuples.
The first element of which must be an xlrd.Book object and the
second must be the filename of the file from which the book
object came.

This is the base writer that copies all data and formatting from
the specified sources.
It is designed for sequential use so when, for example, writing
two workbooks, the calls must be ordered as follows:

This is a base class that implements functionality for filters
that want to do a common task such as logging, printing or memory
usage recording on certain calls configured at filter instantiation
time.

A view on a sheet in a workbook. Should be created by indexing a
View.

These can be sliced to create smaller views.

Views can be iterated over to return a set of iterables, one for each row
in the view. Data is returned as in the cell values with the exception of
dates and times which are converted into datetime
instances.