Skip to content

Commit 99b602d

Browse files
committed
excel configuration
1 parent fa343d1 commit 99b602d

File tree

2 files changed

+43
-39
lines changed

2 files changed

+43
-39
lines changed

pandas/core/config_init.py

+29-37
Original file line numberDiff line numberDiff line change
@@ -437,43 +437,35 @@ def use_inf_as_na_cb(key):
437437
writer_engine_doc = """
438438
: string
439439
The default Excel writer engine for '{ext}' files. Available options:
440-
'{default}' (the default){others}.
441-
"""
442-
443-
with cf.config_prefix('io.excel'):
444-
# going forward, will be additional writers
445-
for ext, options in [('xls', ['xlwt']), ('xlsm', ['openpyxl'])]:
446-
default = options.pop(0)
447-
if options:
448-
options = " " + ", ".join(options)
449-
else:
450-
options = ""
451-
doc = writer_engine_doc.format(ext=ext, default=default,
452-
others=options)
453-
cf.register_option(ext + '.writer', default, doc, validator=str)
454-
455-
def _register_xlsx(engine, other):
456-
cf.register_option('xlsx.writer', engine,
457-
writer_engine_doc.format(ext='xlsx', default=engine,
458-
others=", '%s'" % other),
459-
validator=str)
460-
461-
_excel_registered = False
462-
463-
464-
def _register_excel_engines():
465-
global _excel_registered
466-
467-
if not _excel_registered:
468-
with cf.config_prefix('io.excel'):
469-
try:
470-
# better memory footprint
471-
import xlsxwriter # noqa
472-
_register_xlsx('xlsxwriter', 'openpyxl')
473-
except ImportError:
474-
# fallback
475-
_register_xlsx('openpyxl', 'xlsxwriter')
476-
_excel_registered = True
440+
auto, {others}.
441+
"""
442+
443+
_xls_options = ['xlwt']
444+
_xlsm_options = ['openpyxl']
445+
_xlsx_options = ['openpyxl', 'xlsxwriter']
446+
447+
448+
with cf.config_prefix("io.excel.xls"):
449+
cf.register_option("writer", "auto",
450+
writer_engine_doc.format(
451+
ext='xls',
452+
others=', '.join(_xls_options)),
453+
validator=str)
454+
455+
with cf.config_prefix("io.excel.xlsm"):
456+
cf.register_option("writer", "auto",
457+
writer_engine_doc.format(
458+
ext='xlsm',
459+
others=', '.join(_xlsm_options)),
460+
validator=str)
461+
462+
463+
with cf.config_prefix("io.excel.xlsx"):
464+
cf.register_option("writer", "auto",
465+
writer_engine_doc.format(
466+
ext='xlsx',
467+
others=', '.join(_xlsx_options)),
468+
validator=str)
477469

478470

479471
# Set up the io.parquet specific configuration.

pandas/io/excel.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ def register_writer(klass):
170170
_writer_extensions.append(ext)
171171

172172

173+
def _get_default_writer(ext):
174+
_default_writers = {'xlsx': 'openpyxl', 'xlsm': 'openpyxl', 'xls': 'xlwt'}
175+
try:
176+
import xlsxwriter # noqa
177+
_default_writers['xlsx'] = 'xlsxwriter'
178+
except ImportError:
179+
pass
180+
return _default_writers[ext]
181+
182+
173183
def get_writer(engine_name):
174184
if engine_name == 'openpyxl':
175185
try:
@@ -690,10 +700,10 @@ class ExcelWriter(object):
690700
# ExcelWriter.
691701
def __new__(cls, path, engine=None, **kwargs):
692702
# only switch class if generic(ExcelWriter)
693-
config_init._register_excel_engines()
694703

695704
if issubclass(cls, ExcelWriter):
696-
if engine is None:
705+
if engine is None or (isinstance(engine, string_types) and
706+
engine == 'auto'):
697707
if isinstance(path, string_types):
698708
ext = os.path.splitext(path)[-1][1:]
699709
else:
@@ -702,6 +712,8 @@ def __new__(cls, path, engine=None, **kwargs):
702712
try:
703713
engine = config.get_option('io.excel.{ext}.writer'
704714
.format(ext=ext))
715+
if engine == 'auto':
716+
engine = _get_default_writer(ext)
705717
except KeyError:
706718
error = ValueError("No engine for filetype: '{ext}'"
707719
.format(ext=ext))

0 commit comments

Comments
 (0)