diff --git a/HISTORY.html b/HISTORY.html index 760599d..cfe6f18 100644 --- a/HISTORY.html +++ b/HISTORY.html @@ -2,74 +2,15 @@ -xlwt HISTORY +xlwt-future history +

Version 0.8.0: Fork of github.com/python-excel/xlwt that adds Python 3 support via python-future: 2013-11-01. Home of the fork: github.com/PythonCharmers/xlwt-future +

+

Version 0.7.5, released 2013-04 +

Version 0.7.2, released to the general public via PyPI -- 2009-06-01

-
Revision: 3844 -
Author: sjmachin -
Date: 11:02:54 AM, Wednesday, 20 May 2009 -
Message: -
Added function Utils.rowcol_pair_to_cellrange. (0, 0, 65535, 255) -> "A1:IV65536" -
---- -
Modified : /xlwt/trunk/xlwt/Utils.py -
-
Revision: 3843 -
Author: sjmachin -
Date: 1:46:05 AM, Tuesday, 19 May 2009 -
Message: -
Removed Worksheet property show_empty_as_zero, -
and added attribute show_zero_values (default: 1 == True). -
---- -
Modified : /xlwt/trunk/xlwt/Worksheet.py -
-
Revision: 3841 -
Author: sjmachin -
Date: 11:58:51 AM, Wednesday, 13 May 2009 -
Message: -
Fixed formula code generation problem with formulas -
including MAX/SUM/etc functions with arguments like A1+123. -
Updated version to 0.7.2alpha. -
---- -
Modified : /xlwt/trunk/README.html -
Modified : /xlwt/trunk/setup.py -
Modified : /xlwt/trunk/xlwt/ExcelFormulaParser.py -
Modified : /xlwt/trunk/xlwt/ExcelMagic.py -
Modified : /xlwt/trunk/xlwt/__init__.py -
Modified : /xlwt/trunk/xlwt/excel-formula.g -
-
Revision: 3816 -
Author: sjmachin -
Date: 8:31:39 PM, Tuesday, 24 March 2009 -
Message: -
Added .../doc/pattern_examples.xls and put a pointer to it -
in the easyxf part of Style.py. -
---- -
Modified : /xlwt/trunk/xlwt/Style.py -
Added : /xlwt/trunk/xlwt/doc/pattern_examples.xls -
-
Revision: 3815 -
Author: sjmachin -
Date: 7:54:52 PM, Tuesday, 24 March 2009 -
Message: -
Fixed Row.set_cell_formula() bug introduced in 0.7.1. -
Fixed bug(?) with SCL/magnification handling causing(?) Excel -
to raise a dialogue box if sheet is set to open in page preview mode -
and user then switches to normal view. -
Added color and colour as synonyms for font.colour_index in easyxf. -
Removed unused attribute Row.__has_default_format. -
---- -
Modified : /xlwt/trunk/xlwt/Row.py -
Modified : /xlwt/trunk/xlwt/Style.py -
Modified : /xlwt/trunk/xlwt/Worksheet.py -
- - - - - -

Version 0.7.1, released to the general public via PyPI -- 2009-03-04

Version 0.7.0, released to the general public via PyPI diff --git a/README.html b/README.html index d7c9bb9..4431018 100644 --- a/README.html +++ b/README.html @@ -14,15 +14,15 @@

Licence: BSD-style (see licences.py)

-

Version of xlwt: 0.7.2 +

Version of xlwt: 0.8.0

-

Version of Python required: 2.3 to 2.6 +

Version of Python required: 2.6/2.7 or 3.3

-

External modules required: None +

External modules required: future

-The package itself is pure Python with no dependencies on modules or packages -outside the standard Python distribution. +The package itself is pure Python with only one dependency outside the standard +Python distribution (the future package for Py2/3 compatibility).

Quick start:

diff --git a/README.md b/README.md new file mode 100644 index 0000000..f4ec003 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +xlwt-future +=========== + +Fork of https://github.com/python-excel/xlwt that supports both Python 3.3 and +Python 2.6/2.7. The original supports Python 2.3 to 2.6 only. + +Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 +XLS files, on any platform. diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3e14c5e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +future>=0.8.2 diff --git a/setup.py b/setup.py index 9d3f5fa..48efa3e 100644 --- a/setup.py +++ b/setup.py @@ -1,25 +1,35 @@ #!/usr/bin/env python -from distutils.core import setup -from xlwt import __VERSION__ +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + +__VERSION__ = '0.8.0' DESCRIPTION = ( 'Library to create spreadsheet files compatible with ' 'MS Excel 97/2000/XP/2003 XLS files, ' - 'on any platform, with Python 2.3 to 2.7' + 'on any platform, with Python 2.6 to 3.3' ) LONG_DESCRIPTION = """\ +Py2.6+ and Py3.3+ fork of xlwt. + xlwt is a library for generating spreadsheet files that are compatible with Excel 97/2000/XP/2003, OpenOffice.org Calc, and Gnumeric. xlwt has full support for Unicode. Excel spreadsheets can be generated on any platform without needing Excel or a COM server. The only requirement is -Python 2.3 to 2.7. +Python 2.6, 2.7, or 3.3. """ CLASSIFIERS = [ 'Operating System :: OS Independent', 'Programming Language :: Python', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', 'License :: OSI Approved :: BSD License', 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', @@ -34,12 +44,12 @@ ) setup( - name = 'xlwt', + name = 'xlwt-future', version = __VERSION__, maintainer = 'John Machin', maintainer_email = 'sjmachin@lexicon.net', url = 'http://www.python-excel.org/', - download_url = 'http://pypi.python.org/pypi/xlwt', + download_url = 'http://pypi.python.org/pypi/xlwt-future', description = DESCRIPTION, long_description = LONG_DESCRIPTION, license = 'BSD', @@ -54,4 +64,5 @@ 'tests/*.*', ], }, + install_requires=['future>=0.8.2'] ) diff --git a/tests/RKbug.py b/tests/RKbug.py index df2e85e..54aacd7 100644 --- a/tests/RKbug.py +++ b/tests/RKbug.py @@ -1,6 +1,13 @@ -from xlwt import * +from __future__ import print_function +from __future__ import absolute_import +from __future__ import division +from future.builtins import * + import sys -from struct import pack, unpack + +from xlwt import * +from xlwt.Utils import pack, unpack + def cellname(rowx, colx): # quick kludge, works up to 26 cols :-) @@ -8,13 +15,13 @@ def cellname(rowx, colx): def RK_pack_check(num, anint, case=None): if not(-0x7fffffff - 1 <= anint <= 0x7fffffff): - print "RK_pack_check: not a signed 32-bit int: %r (%r); case: %r" \ - % (anint, hex(anint), case) + print("RK_pack_check: not a signed 32-bit int: %r (%r); case: %r" \ + % (anint, hex(anint), case)) pstr = pack(" portion_counter: + if str_chunk_num != portion_counter: portion_counter = str_chunk_num abs_stream_pos += portions_len[portion_counter-1] #print hex(abs_stream_pos) @@ -1300,11 +1301,11 @@ def __init__(self, options, first_visible_row, first_visible_col, grid_colour, 0x00, preview_magn, normal_magn, - 0x00L) + 0x00) if scl_magn is not None: self._scl_rec = pack('<4H', 0x00A0, 4, scl_magn, 100) else: - self._scl_rec = '' + self._scl_rec = b'' def get(self): return self.get_rec_header() + self._rec_data + self._scl_rec @@ -1491,7 +1492,7 @@ def __init__(self, merged_list): i = len(merged_list) - 1 while i >= 0: j = 0 - merged = '' + merged = b'' while (i >= 0) and (j < 0x403): r1, r2, c1, c2 = merged_list[i] merged += pack('<4H', r1, r2, c1, c2) @@ -2378,7 +2379,7 @@ def __init__(self, refs): def get(self): res = [] nrefs = len(self.refs) - for idx in xrange(0, nrefs, _maxRefPerRecord): + for idx in range(0, nrefs, _maxRefPerRecord): chunk = self.refs[idx:idx+_maxRefPerRecord] krefs = len(chunk) if idx: # CONTINUE record @@ -2387,7 +2388,7 @@ def get(self): header = pack(" # Portions are Copyright (c) 2002-2004 John McNamara (Perl Spreadsheet::WriteExcel) -from BIFFRecords import BiffRecord -from struct import pack, unpack +from __future__ import (absolute_import, division, unicode_literals) +from .BIFFRecords import BiffRecord +from .Utils import pack, unpack +from future.builtins import * def _size_col(sheet, col): @@ -192,7 +194,7 @@ def _process_bitmap(bitmap): """ # Open file and binmode the data in case the platform needs it. - fh = file(bitmap, "rb") + fh = open(bitmap, "rb") try: # Slurp the file into a string. data = fh.read() diff --git a/xlwt/Cell.py b/xlwt/Cell.py index 23adf8a..fa518d9 100644 --- a/xlwt/Cell.py +++ b/xlwt/Cell.py @@ -1,7 +1,10 @@ # -*- coding: windows-1252 -*- +from __future__ import absolute_import +from __future__ import division from struct import unpack, pack -import BIFFRecords +from . import BIFFRecords +from future.builtins import * class StrCell(object): __slots__ = ["rowx", "colx", "xf_idx", "sst_idx"] @@ -193,8 +196,8 @@ def _get_cells_biff_data_mul(rowx, cell_items): continue lastcolx = icolx j = i - packed_record = '' - for j in xrange(i+1, nitems): + packed_record = b'' + for j in range(i+1, nitems): jcolx, jcell = cell_items[j] if jcolx != lastcolx + 1: nexti = j @@ -223,7 +226,7 @@ def _get_cells_biff_data_mul(rowx, cell_items): # MULRK record nc = lastcolx - icolx + 1 pieces.append(pack('<4H', 0x00BD, 6 * nc + 6, rowx, icolx)) - pieces.append(''.join([pack('> 9 dir_sect_count = len(self.dir_stream) >> 9 - + total_sect_count = book_sect_count + dir_sect_count SAT_sect_count = 0 MSAT_sect_count = 0 @@ -154,7 +156,7 @@ def __build_sat(self): sect += 1 while sect < book_sect_count + MSAT_sect_count + SAT_sect_count: - self.SAT_sect.append(sect) + self.SAT_sect.append(sect) SAT[sect] = self.SID_USED_BY_SAT sect += 1 @@ -205,17 +207,17 @@ def __build_sat(self): def __build_header(self): - doc_magic = '\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' - file_uid = '\x00'*16 - rev_num = '\x3E\x00' - ver_num = '\x03\x00' - byte_order = '\xFE\xFF' + doc_magic = b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1' + file_uid = b'\x00'*16 + rev_num = b'\x3E\x00' + ver_num = b'\x03\x00' + byte_order = b'\xFE\xFF' log_sect_size = struct.pack(' >= <= """): - print t - except TokenStreamException, e: - print "error:", e + print(t) + except TokenStreamException as e: + print("error:", e) diff --git a/xlwt/ExcelFormulaParser.py b/xlwt/ExcelFormulaParser.py index 2c261b4..c404dfa 100644 --- a/xlwt/ExcelFormulaParser.py +++ b/xlwt/ExcelFormulaParser.py @@ -1,18 +1,15 @@ ### $ANTLR 2.7.7 (20060930): "xlwt/excel-formula.g" -> "ExcelFormulaParser.py"$ ### import antlr and other modules .. +from __future__ import absolute_import +from future.builtins import * + import sys -import antlr - -version = sys.version.split()[0] -if version < '2.2.1': - False = 0 -if version < '2.3': - True = not False -### header action >>> import struct -import Utils -from UnicodeUtils import upack1 -from ExcelMagic import * + +from . import antlr +from . import Utils +from .UnicodeUtils import upack1 +from .ExcelMagic import * _RVAdelta = {"R": 0, "V": 0x20, "A": 0x40} _RVAdeltaRef = {"R": 0, "V": 0x20, "A": 0x40, "D": 0x20} @@ -76,7 +73,7 @@ def __init__(self, *args, **kwargs): antlr.LLkParser.__init__(self, *args, **kwargs) self.tokenNames = _tokenNames ### __init__ header action >>> - self.rpn = "" + self.rpn = b"" self.sheet_references = [] self.xcall_references = [] ### __init__ header action <<< @@ -388,21 +385,21 @@ def primary(self, chunklens = [len(chunk) for chunk in rpn_chunks] skiplens = [0] * nc skiplens[-1] = 3 - for ic in xrange(nc-1, 0, -1): + for ic in range(nc-1, 0, -1): skiplens[ic-1] = skiplens[ic] + chunklens[ic] + 4 jump_pos = [2 * nc + 2] - for ic in xrange(nc): + for ic in range(nc): jump_pos.append(jump_pos[-1] + chunklens[ic] + 4) chunk_shift = 2 * nc + 6 # size of tAttrChoose - for ic in xrange(nc): - for refx in xrange(ref_markers[ic], ref_markers[ic+1]): + for ic in range(nc): + for refx in range(ref_markers[ic], ref_markers[ic+1]): ref = self.sheet_references[refx] self.sheet_references[refx] = (ref[0], ref[1], ref[2] + chunk_shift) chunk_shift += 4 # size of tAttrSkip choose_rpn = [] choose_rpn.append(struct.pack(" max_argc or arg_count < min_argc: - raise Exception, "%d parameters for function: %s" % (arg_count, func_tok.text) + raise Exception("%d parameters for function: %s" % (arg_count, func_tok.text)) if xcall: func_ptg = ptgFuncVarR + _RVAdelta[func_type] self.rpn += struct.pack("<2BH", func_ptg, arg_count + 1, 255) # 255 is magic XCALL function @@ -669,7 +666,7 @@ def expr_list(self, ### generate bit set def mk_tokenSet_0(): ### var1 - data = [ 37681618946L, 0L] + data = [ 37681618946, 0] return data _tokenSet_0 = antlr.BitSet(mk_tokenSet_0()) diff --git a/xlwt/ExcelMagic.py b/xlwt/ExcelMagic.py index 2c29262..1643075 100644 --- a/xlwt/ExcelMagic.py +++ b/xlwt/ExcelMagic.py @@ -2,6 +2,8 @@ """ lots of Excel Magic Numbers """ +from __future__ import absolute_import, unicode_literals +from future.builtins import * # Boundaries BIFF8+ diff --git a/xlwt/Formatting.py b/xlwt/Formatting.py index 76b8e8f..6ae1946 100644 --- a/xlwt/Formatting.py +++ b/xlwt/Formatting.py @@ -28,7 +28,9 @@ ''' -import BIFFRecords +from __future__ import absolute_import + +from . import BIFFRecords class Font(object): diff --git a/xlwt/Row.py b/xlwt/Row.py index 5664e87..a3f16b5 100644 --- a/xlwt/Row.py +++ b/xlwt/Row.py @@ -1,12 +1,16 @@ # -*- coding: windows-1252 -*- -import BIFFRecords -import Style -from Cell import StrCell, BlankCell, NumberCell, FormulaCell, MulBlankCell, BooleanCell, ErrorCell, \ +from __future__ import absolute_import +from __future__ import division +from . import BIFFRecords +from . import Style +from .Cell import StrCell, BlankCell, NumberCell, FormulaCell, MulBlankCell, BooleanCell, ErrorCell, \ _get_cells_biff_data_mul -import ExcelFormula +from . import ExcelFormula import datetime as dt -from Formatting import Font +from .Formatting import Font + +from future.builtins import * try: from decimal import Decimal @@ -165,11 +169,11 @@ def insert_cell(self, col_index, cell_obj): def insert_mulcells(self, colx1, colx2, cell_obj): self.insert_cell(colx1, cell_obj) - for col_index in xrange(colx1+1, colx2+1): + for col_index in range(colx1+1, colx2+1): self.insert_cell(col_index, None) def get_cells_biff_data(self): - cell_items = [item for item in self.__cells.iteritems() if item[1] is not None] + cell_items = [item for item in self.__cells.items() if item[1] is not None] cell_items.sort() # in column order return _get_cells_biff_data_mul(self.__idx, cell_items) # previously: @@ -234,7 +238,7 @@ def write(self, col, label, style=Style.default_style): self.__adjust_height(style) self.__adjust_bound_col_idx(col) style_index = self.__parent_wb.add_style(style) - if isinstance(label, basestring): + if isinstance(label, bytes) or isinstance(label, str): if len(label) > 0: self.insert_cell(col, StrCell(self.__idx, col, style_index, self.__parent_wb.add_str(label)) @@ -243,7 +247,7 @@ def write(self, col, label, style=Style.default_style): self.insert_cell(col, BlankCell(self.__idx, col, style_index)) elif isinstance(label, bool): # bool is subclass of int; test bool first self.insert_cell(col, BooleanCell(self.__idx, col, style_index, label)) - elif isinstance(label, (float, int, long, Decimal)): + elif isinstance(label, (float, Decimal)) or isinstance(label, int): self.insert_cell(col, NumberCell(self.__idx, col, style_index, label)) elif isinstance(label, (dt.datetime, dt.date, dt.time)): date_number = self.__excel_date_dt(label) @@ -271,11 +275,12 @@ def __rich_text_helper(self, col, rich_text_list, style, style_index=None): default_font = None rt = [] for data in rich_text_list: - if isinstance(data, basestring): + if isinstance(data, str) or isinstance(data, bytes): s = data font = default_font elif isinstance(data, (list, tuple)): - if not isinstance(data[0], basestring) or not isinstance(data[1], Font): + if not (isinstance(data[0], str) or isinstance(data[0], bytes)) \ + or not isinstance(data[1], Font): raise Exception ("Unexpected data type %r, %r" % (type(data[0]), type(data[1]))) s = data[0] font = self.__parent_wb.add_font(data[1]) diff --git a/xlwt/Style.py b/xlwt/Style.py index 2ebcffd..039e3d6 100644 --- a/xlwt/Style.py +++ b/xlwt/Style.py @@ -1,7 +1,11 @@ # -*- coding: windows-1252 -*- -import Formatting -from BIFFRecords import NumberFormatRecord, XFRecord, StyleRecord +from __future__ import absolute_import, print_function, unicode_literals +# -*- coding: windows-1252 -*- + +from . import Formatting +from .BIFFRecords import NumberFormatRecord, XFRecord, StyleRecord +from future.builtins import * FIRST_USER_DEFINED_NUM_FORMAT_IDX = 164 @@ -178,7 +182,7 @@ def _add_font(self, font): def get_biff_data(self): - result = '' + result = b'' result += self._all_fonts() result += self._all_num_formats() result += self._all_cell_styles() @@ -186,9 +190,9 @@ def get_biff_data(self): return result def _all_fonts(self): - result = '' + result = b'' if self.style_compression: - alist = self._font_x2id.items() + alist = list(self._font_x2id.items()) else: alist = [(x, o) for o, x in self._font_id2x.items()] alist.sort() @@ -197,7 +201,7 @@ def _all_fonts(self): return result def _all_num_formats(self): - result = '' + result = b'' alist = [ (v, k) for k, v in self._num_formats.items() @@ -209,11 +213,11 @@ def _all_num_formats(self): return result def _all_cell_styles(self): - result = '' + result = b'' for i in range(0, 16): result += XFRecord(self._default_xf, 'style').get() if self.style_compression == 2: - alist = self._xf_x2id.items() + alist = list(self._xf_x2id.items()) else: alist = [(x, o) for o, x in self._xf_id2x.items()] alist.sort() @@ -658,11 +662,11 @@ def _parse_strg_to_obj(strg, obj, parse_dict, v = ' '.join(guff[1:]) if not v: raise EasyXFCallerError("no value supplied for %s.%s" % (section, k)) - for counter in xrange(2): + for counter in range(2): result = section_dict.get(k) if result is None: raise EasyXFCallerError('%s.%s is not a known attribute' % (section, k)) - if not isinstance(result, basestring): + if not (isinstance(result, bytes) or isinstance(result, str)): break # synonym old_k = k @@ -691,7 +695,7 @@ def _parse_strg_to_obj(strg, obj, parse_dict, orig = getattr(section_obj, k) except AttributeError: raise EasyXFAuthorError('%s.%s in dictionary but not in supplied object' % (section, k)) - if debug: print "+++ %s.%s = %r # %s; was %r" % (section, k, value, v, orig) + if debug: print("+++ %s.%s = %r # %s; was %r" % (section, k, value, v, orig)) setattr(section_obj, k, value) def easyxf(strg_to_parse="", num_format_str=None, diff --git a/xlwt/UnicodeUtils.py b/xlwt/UnicodeUtils.py index 9d5a266..9d0077f 100644 --- a/xlwt/UnicodeUtils.py +++ b/xlwt/UnicodeUtils.py @@ -40,14 +40,17 @@ ''' -from struct import pack +from __future__ import absolute_import, division, unicode_literals +from future.builtins import * + +from .Utils import pack, unpack def upack2(s, encoding='ascii'): # If not unicode, make it so. - if isinstance(s, unicode): + if isinstance(s, str): us = s else: - us = unicode(s, encoding) + us = str(s, encoding) # Limit is based on number of content characters # (not on number of bytes in packed result) len_us = len(us) @@ -77,8 +80,8 @@ def upack2rt(rt, encoding='ascii'): # convert rt strings to unicode if not already unicode # also generate the formatting run for the styles added for s, fontx in rt: - if not isinstance(s, unicode): - s = unicode(s, encoding) + if not isinstance(s, str): + s = str(s, encoding) us += s if fontx is not None: # code in Rows.py ensures that @@ -104,10 +107,10 @@ def upack2rt(rt, encoding='ascii'): def upack1(s, encoding='ascii'): # Same as upack2(), but with a one-byte length field. - if isinstance(s, unicode): + if isinstance(s, str): us = s else: - us = unicode(s, encoding) + us = str(s, encoding) len_us = len(us) if len_us > 255: raise Exception('String longer than 255 characters') diff --git a/xlwt/Utils.py b/xlwt/Utils.py index 4ef94da..3934dcc 100644 --- a/xlwt/Utils.py +++ b/xlwt/Utils.py @@ -2,8 +2,13 @@ # Utilities for work with reference to cells and with sheetnames +from __future__ import absolute_import, unicode_literals +from future.builtins import * +from future import utils + import re -from ExcelMagic import MAX_ROW, MAX_COL +import struct +from .ExcelMagic import MAX_ROW, MAX_COL _re_cell_ex = re.compile(r"(\$?)([A-I]?[A-Z])(\$?)(\d+)", re.IGNORECASE) _re_row_range = re.compile(r"\$?(\d+):\$?(\d+)") @@ -12,12 +17,30 @@ _re_cell_ref = re.compile(r"\$?([A-I]?[A-Z]\$?\d+)", re.IGNORECASE) +def pack(*args, **kwargs): + """struct.pack() must take a native string as its first argument. So we + wrap it: + """ + fmt = args[0] + rest = args[1:] + return struct.pack(utils.native_str(fmt), *rest, **kwargs) + + +def unpack(*args, **kwargs): + """struct.unpack() must take a native string as its first argument. So we + wrap it: + """ + fmt = args[0] + rest = args[1:] + return struct.unpack(utils.native_str(fmt), *rest, **kwargs) + + def col_by_name(colname): """'A' -> 0, 'Z' -> 25, 'AA' -> 26, etc """ col = 0 power = 1 - for i in xrange(len(colname)-1, -1, -1): + for i in range(len(colname)-1, -1, -1): ch = colname[i] col += (ord(ch) - ord('A') + 1) * power power *= 26 diff --git a/xlwt/Workbook.py b/xlwt/Workbook.py index fecb957..9163c9b 100644 --- a/xlwt/Workbook.py +++ b/xlwt/Workbook.py @@ -40,8 +40,11 @@ EOF ''' -import BIFFRecords -import Style +from __future__ import absolute_import, unicode_literals +from future.builtins import * + +from . import BIFFRecords +from . import Style class Workbook(object): @@ -338,8 +341,8 @@ def rt_index(self, rt): return self.__sst.rt_index(rt) def add_sheet(self, sheetname, cell_overwrite_ok=False): - import Worksheet, Utils - if not isinstance(sheetname, unicode): + from xlwt import Worksheet, Utils + if not isinstance(sheetname, str): sheetname = sheetname.decode(self.encoding) if not Utils.valid_sheet_name(sheetname): raise Exception("invalid worksheet name %r" % sheetname) @@ -347,7 +350,7 @@ def add_sheet(self, sheetname, cell_overwrite_ok=False): if lower_name in self.__worksheet_idx_from_name: raise Exception("duplicate worksheet name %r" % sheetname) self.__worksheet_idx_from_name[lower_name] = len(self.__worksheets) - self.__worksheets.append(Worksheet.Worksheet(sheetname, self, cell_overwrite_ok)) + self.__worksheets.append(Worksheet(sheetname, self, cell_overwrite_ok)) return self.__worksheets[-1] def get_sheet(self, sheetnum): @@ -430,7 +433,7 @@ def add_sheet_reference(self, formula): self.setup_xcall() # print funcname, self._supbook_xref patches.append((offset, self._xcall_supbook_ref)) - if not isinstance(funcname, unicode): + if not isinstance(funcname, str): funcname = funcname.decode(self.encoding) if funcname in self._xcall_xref: idx = self._xcall_xref[funcname] @@ -505,7 +508,7 @@ def __codepage_rec(self): def __country_rec(self): if not self.__country_code: - return '' + return b'' return BIFFRecords.CountryRecord(self.__country_code, self.__country_code).get() def __dsf_rec(self): @@ -534,7 +537,7 @@ def __all_fonts_num_formats_xf_styles_rec(self): def __palette_rec(self): if self.__custom_palette_b8 is None: - return '' + return b'' info = BIFFRecords.PaletteRecord(self.__custom_palette_b8).get() return info @@ -553,12 +556,12 @@ def __boundsheets_rec(self, data_len_before, data_len_after, sheet_biff_lens): boundsheets_len = 0 for sheet in self.__worksheets: boundsheets_len += len(BIFFRecords.BoundSheetRecord( - 0x00L, sheet.visibility, sheet.name, self.encoding + 0x00, sheet.visibility, sheet.name, self.encoding ).get()) start = data_len_before + boundsheets_len + data_len_after - result = '' + result = b'' for sheet_biff_len, sheet in zip(sheet_biff_lens, self.__worksheets): result += BIFFRecords.BoundSheetRecord( start, sheet.visibility, sheet.name, self.encoding @@ -588,23 +591,23 @@ def __all_links_rec(self): raise Exception('unknown supbook stype %r' % stype) if len(self.__sheet_refs) > 0: # get references in index order - temp = [(idx, ref) for ref, idx in self.__sheet_refs.items()] + temp = [(idx, ref) for ref, idx in list(self.__sheet_refs.items())] temp.sort() temp = [ref for idx, ref in temp] externsheet_record = BIFFRecords.ExternSheetRecord(temp).get() pieces.append(externsheet_record) - return ''.join(pieces) + return b''.join(pieces) def __sst_rec(self): return self.__sst.get_biff_record() def __ext_sst_rec(self, abs_stream_pos): - return '' + return b'' #return BIFFRecords.ExtSSTRecord(abs_stream_pos, self.sst_record.str_placement, #self.sst_record.portions_len).get() def get_biff_data(self): - before = '' + before = b'' before += self.__bof_rec() before += self.__intf_hdr_rec() before += self.__intf_mms_rec() @@ -641,7 +644,7 @@ def get_biff_data(self): eof = self.__eof_rec() self.__worksheets[self.__active_sheet].selected = True - sheets = '' + sheets = b'' sheet_biff_lens = [] for sheet in self.__worksheets: data = sheet.get_biff_data() @@ -656,7 +659,7 @@ def get_biff_data(self): return before + bundlesheets + after + ext_sst + eof + sheets def save(self, filename): - import CompoundDoc + from . import CompoundDoc doc = CompoundDoc.XlsDoc() doc.save(filename, self.get_biff_data()) diff --git a/xlwt/Worksheet.py b/xlwt/Worksheet.py index cd90ccd..acafc03 100644 --- a/xlwt/Worksheet.py +++ b/xlwt/Worksheet.py @@ -34,9 +34,12 @@ EOF ''' -import BIFFRecords -import Bitmap -import Style +from __future__ import absolute_import, unicode_literals +from future.builtins import * + +from . import BIFFRecords +from . import Bitmap +from . import Style import tempfile class Worksheet(object): @@ -48,11 +51,11 @@ class Worksheet(object): ## Constructor ################################################################# def __init__(self, sheetname, parent_book, cell_overwrite_ok=False): - import Row - self.Row = Row.Row + from xlwt import Row + self.Row = Row - import Column - self.Column = Column.Column + from xlwt import Column + self.Column = Column self.__name = sheetname self.__parent = parent_book @@ -61,7 +64,7 @@ def __init__(self, sheetname, parent_book, cell_overwrite_ok=False): self.__rows = {} self.__cols = {} self.__merged_ranges = [] - self.__bmp_rec = '' + self.__bmp_rec = b'' self.__show_formulas = 0 self.__show_grid = 1 @@ -187,7 +190,7 @@ def __init__(self, sheetname, parent_book, cell_overwrite_ok=False): self.__obj_protect = 0 self.__protect = 0 self.__scen_protect = 0 - self.__password = '' + self.__password = b'' self.last_used_row = 0 self.first_used_row = 65535 @@ -719,7 +722,7 @@ def get_horz_page_breaks(self): def set_header_str(self, value): if isinstance(value, str): - value = unicode(value, self.__parent.encoding) + value = str(value, self.__parent.encoding) self.__header_str = value def get_header_str(self): @@ -731,7 +734,7 @@ def get_header_str(self): def set_footer_str(self, value): if isinstance(value, str): - value = unicode(value, self.__parent.encoding) + value = str(value, self.__parent.encoding) self.__footer_str = value def get_footer_str(self): @@ -1143,7 +1146,7 @@ def __eof_rec(self): return BIFFRecords.EOFRecord().get() def __colinfo_rec(self): - result = '' + result = b'' for col in self.__cols: result += self.__cols[col].get_biff_record() return result @@ -1194,7 +1197,7 @@ def __window2_rec(self): def __panes_rec(self): if self.__vert_split_pos is None and self.__horz_split_pos is None: - return "" + return b"" if self.__vert_split_pos is None: self.__vert_split_pos = 0 @@ -1231,22 +1234,22 @@ def __panes_rec(self): # when split, the active pain can be set as required: active_pane = self.active_pane - result = BIFFRecords.PanesRecord(*map(int, ( + result = BIFFRecords.PanesRecord(*list(map(int, ( self.__vert_split_pos, self.__horz_split_pos, self.__horz_split_first_visible, self.__vert_split_first_visible, active_pane - ))).get() + )))).get() return result def __row_blocks_rec(self): result = [] - for row in self.__rows.itervalues(): + for row in self.__rows.values(): result.append(row.get_row_biff_data()) result.append(row.get_cells_biff_data()) - return ''.join(result) + return b''.join(result) def __merged_rec(self): return BIFFRecords.MergedCellsRecord(self.__merged_ranges).get() @@ -1255,7 +1258,7 @@ def __bitmaps_rec(self): return self.__bmp_rec def __calc_settings_rec(self): - result = '' + result = b'' result += BIFFRecords.CalcModeRecord(self.__calc_mode & 0x01).get() result += BIFFRecords.CalcCountRecord(self.__calc_count & 0xFFFF).get() result += BIFFRecords.RefModeRecord(self.__RC_ref_mode & 0x01).get() @@ -1265,7 +1268,7 @@ def __calc_settings_rec(self): return result def __print_settings_rec(self): - result = '' + result = b'' result += BIFFRecords.PrintHeadersRecord(self.__print_headers).get() result += BIFFRecords.PrintGridLinesRecord(self.__print_grid).get() result += BIFFRecords.GridSetRecord(self.__grid_set).get() @@ -1305,7 +1308,7 @@ def __print_settings_rec(self): return result def __protection_rec(self): - result = '' + result = b'' result += BIFFRecords.ProtectRecord(self.__protect).get() result += BIFFRecords.ScenProtectRecord(self.__scen_protect).get() result += BIFFRecords.WindowProtectRecord(self.__wnd_protect).get() @@ -1342,7 +1345,7 @@ def get_biff_data(self): self.__panes_rec(), self.__eof_rec(), ]) - return ''.join(result) + return b''.join(result) def flush_row_data(self): if self.row_tempfile is None: diff --git a/xlwt/__init__.py b/xlwt/__init__.py index a0fd772..6c3b5fe 100644 --- a/xlwt/__init__.py +++ b/xlwt/__init__.py @@ -1,9 +1,11 @@ -__VERSION__ = '0.7.5' +from __future__ import absolute_import -from Workbook import Workbook -from Worksheet import Worksheet -from Row import Row -from Column import Column -from Formatting import Font, Alignment, Borders, Pattern, Protection -from Style import XFStyle, easyxf, easyfont, add_palette_colour -from ExcelFormula import * +from .Workbook import Workbook +from .Worksheet import Worksheet +from .Row import Row +from .Column import Column +from .Formatting import Font, Alignment, Borders, Pattern, Protection +from .Style import XFStyle, easyxf, easyfont, add_palette_colour +from .ExcelFormula import * + +__VERSION__ = '0.8.0' diff --git a/xlwt/antlr.py b/xlwt/antlr.py index f77314f..1aaf269 100644 --- a/xlwt/antlr.py +++ b/xlwt/antlr.py @@ -41,13 +41,11 @@ ## End of contents of the ANTLR 2.7.7 LICENSE.txt ######################## ## get sys module +from __future__ import (absolute_import, division, print_function) +from future.builtins import * +from future.utils import PY2, PY3, implements_iterator import sys -version = sys.version.split()[0] -if version < '2.2.1': - False = 0 -if version < '2.3': - True = not False ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### ### global symbols ### @@ -84,7 +82,7 @@ def version(): def error(fmt,*args): if fmt: - print "error: ", fmt % tuple(args) + print("error: ", fmt % tuple(args)) def ifelse(cond,_then,_else): if cond : @@ -96,7 +94,9 @@ def ifelse(cond,_then,_else): def is_string_type(x): # return (isinstance(x,str) or isinstance(x,unicode)) # Simplify; xlwt doesn't support Python < 2.3 - return isinstance(basestring) + # return isinstance(x, basestring) + # Complicate again: xlwt does support Python 3.x + return isinstance(x, str) or isinstance(x, bytes) def assert_string_type(x): assert is_string_type(x) @@ -590,9 +590,9 @@ def toString(self): Token.badToken = Token( type=INVALID_TYPE, text="") if __name__ == "__main__": - print "testing .." + print("testing ..") T = Token.badToken - print T + print(T) ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### ### CommonToken ### @@ -663,16 +663,16 @@ def toString(self): if __name__ == '__main__' : T = CommonToken() - print T + print(T) T = CommonToken(col=15,line=1,text="some text", type=5) - print T + print(T) T = CommonToken() T.setLine(1).setColumn(15).setText("some text").setType(5) - print T - print T.getLine() - print T.getColumn() - print T.getText() - print T.getType() + print(T) + print(T.getLine()) + print(T.getColumn()) + print(T.getText()) + print(T.getType()) ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### ### CommonHiddenStreamToken ### @@ -852,7 +852,7 @@ def fill(self,amount): ### use unicode chars instead of ASCII .. self.queue.append(c) - except Exception,e: + except Exception as e: raise CharStreamIOException(e) ##except: # (mk) Cannot happen ... ##error ("unexpected exception caught ..") @@ -900,6 +900,7 @@ def __iter__(self): ### TokenStreamIterator ### ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### +@implements_iterator class TokenStreamIterator(object): def __init__(self,inst): if isinstance(inst,TokenStream): @@ -907,7 +908,7 @@ def __init__(self,inst): return raise TypeError("TokenStreamIterator requires TokenStream object") - def next(self): + def __next__(self): assert self.inst item = self.inst.nextToken() if not item or item.isEOF(): @@ -942,7 +943,7 @@ def nextToken(self): while 1: try: return self._input.nextToken() - except TokenStreamRetryException,r: + except TokenStreamRetryException as r: ### just retry "forever" pass @@ -1383,23 +1384,23 @@ def tab(self) : self.setColumn(nc) def panic(self,s='') : - print "CharScanner: panic: " + s + print("CharScanner: panic: " + s) sys.exit(1) def reportError(self,ex) : - print ex + print(ex) def reportError(self,s) : if not self.getFilename(): - print "error: " + str(s) + print("error: " + str(s)) else: - print self.getFilename() + ": error: " + str(s) + print(self.getFilename() + ": error: " + str(s)) def reportWarning(self,s) : if not self.getFilename(): - print "warning: " + str(s) + print("warning: " + str(s)) else: - print self.getFilename() + ": warning: " + str(s) + print(self.getFilename() + ": warning: " + str(s)) def resetText(self) : self.text.setLength(0) @@ -1459,16 +1460,16 @@ def toLower(self,c): return c.__class__.lower() def traceIndent(self): - print ' ' * self.traceDepth + print(' ' * self.traceDepth) def traceIn(self,rname): self.traceDepth += 1 self.traceIndent() - print "> lexer %s c== %s" % (rname,self.LA(1)) + print("> lexer %s c== %s" % (rname,self.LA(1))) def traceOut(self,rname): self.traceIndent() - print "< lexer %s c== %s" % (rname,self.LA(1)) + print("< lexer %s c== %s" % (rname,self.LA(1))) self.traceDepth -= 1 def uponEOF(self): @@ -1532,8 +1533,8 @@ def filterdefault(self,la1,*args): try: func=args[0] args=args[1:] - apply(func,args) - except RecognitionException, e: + func(*args) + except RecognitionException as e: ## catastrophic failure self.reportError(e); self.consume(); @@ -1558,6 +1559,7 @@ def set_return_token(self,_create,_token,_ttype,_offset): ### CharScannerIterator ### ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### +@implements_iterator class CharScannerIterator: def __init__(self,inst): @@ -1566,7 +1568,7 @@ def __init__(self,inst): return raise TypeError("CharScannerIterator requires CharScanner object") - def next(self): + def __next__(self): assert self.inst item = self.inst.nextToken() if not item or item.isEOF(): @@ -1581,6 +1583,17 @@ def next(self): ### a long is of any size. That means we can use a single long as the ### bitset (!), ie. Python would do almost all the work (TBD). +def longify(data): + """ + Turns data (a list or int or long) into a list of longs + """ + if not data: + return [int(0)] + if not isinstance(data,list): + return [int(data)] + return list(map(int, data)) # same as returning data, but safer (data must be int-like + + class BitSet(object): BITS = 64 NIBBLE = 4 @@ -1588,28 +1601,16 @@ class BitSet(object): MOD_MASK = BITS -1 def __init__(self,data=None): - if not data: - BitSet.__init__(self,[long(0)]) - return - if isinstance(data,int): - BitSet.__init__(self,[long(data)]) - return - if isinstance(data,long): - BitSet.__init__(self,[data]) - return - if not isinstance(data,list): + try: + self.data = longify(data) + except ValueError: raise TypeError("BitSet requires integer, long, or " + "list argument") - for x in data: - if not isinstance(x,long): - raise TypeError(self,"List argument item is " + - "not a long: %s" % (x)) - self.data = data def __str__(self): bits = len(self.data) * BitSet.BITS s = "" - for i in xrange(0,bits): + for i in range(0,bits): if self.at(i): s += "1" else: @@ -1648,7 +1649,7 @@ def wordNumber(self,bit): def bitMask(self,bit): pos = bit & BitSet.MOD_MASK ## bit mod BITS - return (1L << pos) + return (1 << pos) def set(self,bit,on=True): # grow bitset as required (use with care!) @@ -1656,8 +1657,8 @@ def set(self,bit,on=True): mask = self.bitMask(bit) if i>=len(self.data): d = i - len(self.data) + 1 - for x in xrange(0,d): - self.data.append(0L) + for x in range(0,d): + self.data.append(0) assert len(self.data) == i+1 if on: self.data[i] |= mask @@ -1684,12 +1685,12 @@ def at(self,bit): def illegalarg_ex(func): raise ValueError( "%s is only valid if parser is built for debugging" % - (func.func_name)) + (func.__name__)) def runtime_ex(func): raise RuntimeException( "%s is only valid if parser is built for debugging" % - (func.func_name)) + (func.__name__)) ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### ### TokenBuffer ### @@ -1949,16 +1950,16 @@ def reportError(self,x) : col = x.getLine() text = x.getText() fmt = fmt + 'unexpected symbol at line %s (column %s) : "%s"' - print >>sys.stderr, fmt % (line,col,text) + print(fmt % (line,col,text), file=sys.stderr) else: - print >>sys.stderr, fmt,str(x) + print(fmt,str(x), file=sys.stderr) def reportWarning(self,s): f = self.getFilename() if f: - print "%s:warning: %s" % (f,str(x)) + print("%s:warning: %s" % (f,str(x))) else: - print "warning: %s" % (str(x)) + print("warning: %s" % (str(x))) def rewind(self, pos) : self.inputState.input.rewind(pos) @@ -1986,7 +1987,7 @@ def setTokenBuffer(self, t) : self.inputState.input = t def traceIndent(self): - print " " * self.traceDepth + print(" " * self.traceDepth) def traceIn(self,rname): self.traceDepth += 1 @@ -2075,20 +2076,20 @@ def set_k(self,index,*args): self.k = 1 def trace(self,ee,rname): - print type(self) + print(type(self)) self.traceIndent() guess = "" if self.inputState.guessing > 0: guess = " [guessing]" - print(ee + rname + guess) - for i in xrange(1,self.k+1): + print((ee + rname + guess)) + for i in range(1,self.k+1): if i != 1: print(", ") if self.LT(i) : v = self.LT(i).getText() else: v = "null" - print "LA(%s) == %s" % (i,v) + print("LA(%s) == %s" % (i,v)) print("\n") def traceIn(self,rname): @@ -2149,10 +2150,10 @@ def matchNot(self,t, ttype) : raise MismatchedTokenException(getTokenNames(), t, ttype, True) def reportError(self,ex): - print >>sys.stderr,"error:",ex + print("error:",ex, file=sys.stderr) def reportWarning(self, s): - print "warning:",s + print("warning:",s) def setASTFactory(self,f): self.astFactory = f @@ -2164,20 +2165,20 @@ def setASTNodeClass(self,nodeType): self.astFactory.setASTNodeType(nodeType) def traceIndent(self): - print " " * self.traceDepth + print(" " * self.traceDepth) def traceIn(self,rname,t): self.traceDepth += 1 self.traceIndent() - print("> " + rname + "(" + + print(("> " + rname + "(" + ifelse(t,str(t),"null") + ")" + - ifelse(self.inputState.guessing>0,"[guessing]","")) + ifelse(self.inputState.guessing>0,"[guessing]",""))) def traceOut(self,rname,t): self.traceIndent() - print("< " + rname + "(" + + print(("< " + rname + "(" + ifelse(t,str(t),"null") + ")" + - ifelse(self.inputState.guessing>0,"[guessing]","")) + ifelse(self.inputState.guessing>0,"[guessing]",""))) self.traceDepth -= 1 ### wh: moved from ASTFactory to TreeParser @@ -2724,7 +2725,7 @@ def setTokenTypeToASTClassMap(self,amap): def error(self, e): import sys - print >> sys.stderr, e + print(e, file=sys.stderr) def setTokenTypeASTNodeType(self, tokenType, className): """ @@ -2811,7 +2812,7 @@ def make(*nodes): if not nodes: return None - for i in xrange(0,len(nodes)): + for i in range(0,len(nodes)): node = nodes[i] if node: assert isinstance(node,AST) @@ -2821,7 +2822,7 @@ def make(*nodes): if root: root.setFirstChild(None) - for i in xrange(1,len(nodes)): + for i in range(1,len(nodes)): if not nodes[i]: continue if not root: diff --git a/xlwt/examples/big-16Mb.py b/xlwt/examples/big-16Mb.py index 91db123..d4a7665 100644 --- a/xlwt/examples/big-16Mb.py +++ b/xlwt/examples/big-16Mb.py @@ -1,6 +1,8 @@ #!/usr/bin/env python # tries stress SST, SAT and MSAT +from __future__ import print_function +from __future__ import absolute_import from time import * from xlwt.Workbook import * from xlwt.Style import * @@ -14,22 +16,22 @@ rowcount = 6000 + 1 t0 = time() -print "\nstart: %s" % ctime(t0) +print("\nstart: %s" % ctime(t0)) -print "Filling..." -for col in xrange(colcount): - print "[%d]" % col, - for row in xrange(rowcount): +print("Filling...") +for col in range(colcount): + print("[%d]" % col, end=' ') + for row in range(rowcount): #ws0.write(row, col, "BIG(%d, %d)" % (row, col)) ws0.write(row, col, "BIG") t1 = time() - t0 -print "\nsince starting elapsed %.2f s" % (t1) +print("\nsince starting elapsed %.2f s" % (t1)) -print "Storing..." +print("Storing...") wb.save('big-16Mb.xls') t2 = time() - t0 -print "since starting elapsed %.2f s" % (t2) +print("since starting elapsed %.2f s" % (t2)) diff --git a/xlwt/examples/big-35Mb.py b/xlwt/examples/big-35Mb.py index 837a6df..dc5463d 100644 --- a/xlwt/examples/big-35Mb.py +++ b/xlwt/examples/big-35Mb.py @@ -1,6 +1,8 @@ #!/usr/bin/env python # tries stress SST, SAT and MSAT +from __future__ import print_function +from __future__ import absolute_import from time import * from xlwt import * @@ -14,17 +16,17 @@ t0 = time() -for col in xrange(colcount): - for row in xrange(rowcount): +for col in range(colcount): + for row in range(rowcount): ws0.write(row, col, "BIG(%d, %d)" % (row, col)) t1 = time() - t0 -print "\nsince starting elapsed %.2f s" % (t1) +print("\nsince starting elapsed %.2f s" % (t1)) -print "Storing..." +print("Storing...") wb.save('big-35Mb.xls') t2 = time() - t0 -print "since starting elapsed %.2f s" % (t2) +print("since starting elapsed %.2f s" % (t2)) diff --git a/xlwt/examples/formula_names.py b/xlwt/examples/formula_names.py index f0354bc..69a2292 100644 --- a/xlwt/examples/formula_names.py +++ b/xlwt/examples/formula_names.py @@ -2,6 +2,8 @@ # -*- coding: windows-1251 -*- # Copyright (C) 2005 Kiseliov Roman +from __future__ import print_function +from __future__ import absolute_import from xlwt import * from xlwt.ExcelFormulaParser import FormulaParseException @@ -21,8 +23,8 @@ text = n + "($A$1)" try: formula = Formula(text) - except FormulaParseException,e: - print "Could not parse %r: %s" % (text,e.args[0]) + except FormulaParseException as e: + print("Could not parse %r: %s" % (text,e.args[0])) fail_count += 1 else: ws.write(i, 3, formula) @@ -31,4 +33,4 @@ w.save('formula_names.xls') -print "succeeded with %i functions, failed with %i" % (succeed_count,fail_count) +print("succeeded with %i functions, failed with %i" % (succeed_count,fail_count)) diff --git a/xlwt/examples/panes.py b/xlwt/examples/panes.py index 9fd83b0..c086ae3 100644 --- a/xlwt/examples/panes.py +++ b/xlwt/examples/panes.py @@ -13,22 +13,22 @@ ws6 = w.add_sheet('sheet 6') for i in range(0x100): - ws1.write(i/0x10, i%0x10, i) + ws1.write(i//0x10, i%0x10, i) for i in range(0x100): - ws2.write(i/0x10, i%0x10, i) + ws2.write(i//0x10, i%0x10, i) for i in range(0x100): - ws3.write(i/0x10, i%0x10, i) + ws3.write(i//0x10, i%0x10, i) for i in range(0x100): - ws4.write(i/0x10, i%0x10, i) + ws4.write(i//0x10, i%0x10, i) for i in range(0x100): - ws5.write(i/0x10, i%0x10, i) + ws5.write(i//0x10, i%0x10, i) for i in range(0x100): - ws6.write(i/0x10, i%0x10, i) + ws6.write(i//0x10, i%0x10, i) ws1.panes_frozen = True ws1.horz_split_pos = 2 diff --git a/xlwt/examples/panes2.py b/xlwt/examples/panes2.py index 09f8719..26f2a1f 100644 --- a/xlwt/examples/panes2.py +++ b/xlwt/examples/panes2.py @@ -5,7 +5,7 @@ import xlwt w = xlwt.Workbook() -sheets = [w.add_sheet('sheet ' + str(sheetx+1)) for sheetx in xrange(7)] +sheets = [w.add_sheet('sheet ' + str(sheetx+1)) for sheetx in range(7)] ws1, ws2, ws3, ws4, ws5, ws6, ws7 = sheets for sheet in sheets: for i in range(0x100): diff --git a/xlwt/examples/parse-fmla.py b/xlwt/examples/parse-fmla.py index 06f68eb..ba6a72e 100644 --- a/xlwt/examples/parse-fmla.py +++ b/xlwt/examples/parse-fmla.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import from xlwt import ExcelFormulaParser, ExcelFormula import sys diff --git a/xlwt/examples/sst.py b/xlwt/examples/sst.py index b91c2f5..01960a4 100644 --- a/xlwt/examples/sst.py +++ b/xlwt/examples/sst.py @@ -44,7 +44,7 @@ wb.add_style(st3) ws0 = wb.add_sheet('0') -ws0.write(0, 0, 'Olya'*0x4000, st0) +ws0.write(0, 0, b'Olya'*0x1000, st0) #for i in range(0, 0x10): # ws0.write(i, 2, ('%d'%i)*0x4000, st1) diff --git a/xlwt/examples/unicode0.py b/xlwt/examples/unicode0.py index 3651ec9..dd0e79a 100644 --- a/xlwt/examples/unicode0.py +++ b/xlwt/examples/unicode0.py @@ -2,11 +2,11 @@ import xlwt # Strings passed to (for example) Worksheet.write can be unicode objects, -# or str (8-bit) objects, which are then decoded into unicode. +# or bytes (8-bit) objects, which are then decoded into unicode. # The encoding to be used defaults to 'ascii'. This can be overridden # when the Workbook instance is created: book = xlwt.Workbook(encoding='cp1251') sheet = book.add_sheet('cp1251-demo') -sheet.write(0, 0, '\xce\xeb\xff') +sheet.write(0, 0, b'\xce\xeb\xff') book.save('unicode0.xls') diff --git a/xlwt/examples/unicode2.py b/xlwt/examples/unicode2.py index 18904b0..cc31ba1 100644 --- a/xlwt/examples/unicode2.py +++ b/xlwt/examples/unicode2.py @@ -2,6 +2,10 @@ # -*- coding: windows-1251 -*- # Copyright (C) 2005 Kiseliov Roman +from __future__ import absolute_import +from __future__ import division +from future.builtins import * + from xlwt import * w = Workbook() @@ -13,7 +17,7 @@ style.font = fnt for i in range(0x10000): - ws1.write(i/0x10, i%0x10, unichr(i), style) + ws1.write(i//0x10, i%0x10, chr(i), style) w.save('unicode2.xls') diff --git a/xlwt/examples/wsprops.py b/xlwt/examples/wsprops.py index adc5a04..5601977 100644 --- a/xlwt/examples/wsprops.py +++ b/xlwt/examples/wsprops.py @@ -1,3 +1,5 @@ +from __future__ import print_function +from __future__ import absolute_import props = \ [ 'name', @@ -80,76 +82,76 @@ wb = Workbook() ws = wb.add_sheet('sheet') -print ws.name -print ws.parent -print ws.rows -print ws.cols -print ws.merged_ranges -print ws.bmp_rec -print ws.show_formulas -print ws.show_grid -print ws.show_headers -print ws.panes_frozen -print ws.show_empty_as_zero -print ws.auto_colour_grid -print ws.cols_right_to_left -print ws.show_outline -print ws.remove_splits -print ws.selected +print(ws.name) +print(ws.parent) +print(ws.rows) +print(ws.cols) +print(ws.merged_ranges) +print(ws.bmp_rec) +print(ws.show_formulas) +print(ws.show_grid) +print(ws.show_headers) +print(ws.panes_frozen) +print(ws.show_empty_as_zero) +print(ws.auto_colour_grid) +print(ws.cols_right_to_left) +print(ws.show_outline) +print(ws.remove_splits) +print(ws.selected) # print ws.hidden -print ws.page_preview -print ws.first_visible_row -print ws.first_visible_col -print ws.grid_colour -print ws.preview_magn -print ws.normal_magn +print(ws.page_preview) +print(ws.first_visible_row) +print(ws.first_visible_col) +print(ws.grid_colour) +print(ws.preview_magn) +print(ws.normal_magn) #print ws.row_gut_width #print ws.col_gut_height -print ws.show_auto_page_breaks -print ws.dialogue_sheet -print ws.auto_style_outline -print ws.outline_below -print ws.outline_right -print ws.fit_num_pages -print ws.show_row_outline -print ws.show_col_outline -print ws.alt_expr_eval -print ws.alt_formula_entries -print ws.row_default_height -print ws.col_default_width -print ws.calc_mode -print ws.calc_count -print ws.RC_ref_mode -print ws.iterations_on -print ws.delta -print ws.save_recalc -print ws.print_headers -print ws.print_grid +print(ws.show_auto_page_breaks) +print(ws.dialogue_sheet) +print(ws.auto_style_outline) +print(ws.outline_below) +print(ws.outline_right) +print(ws.fit_num_pages) +print(ws.show_row_outline) +print(ws.show_col_outline) +print(ws.alt_expr_eval) +print(ws.alt_formula_entries) +print(ws.row_default_height) +print(ws.col_default_width) +print(ws.calc_mode) +print(ws.calc_count) +print(ws.RC_ref_mode) +print(ws.iterations_on) +print(ws.delta) +print(ws.save_recalc) +print(ws.print_headers) +print(ws.print_grid) #print ws.grid_set -print ws.vert_page_breaks -print ws.horz_page_breaks -print ws.header_str -print ws.footer_str -print ws.print_centered_vert -print ws.print_centered_horz -print ws.left_margin -print ws.right_margin -print ws.top_margin -print ws.bottom_margin -print ws.paper_size_code -print ws.print_scaling -print ws.start_page_number -print ws.fit_width_to_pages -print ws.fit_height_to_pages -print ws.print_in_rows -print ws.portrait -print ws.print_colour -print ws.print_draft -print ws.print_notes -print ws.print_notes_at_end -print ws.print_omit_errors -print ws.print_hres -print ws.print_vres -print ws.header_margin -print ws.footer_margin -print ws.copies_num +print(ws.vert_page_breaks) +print(ws.horz_page_breaks) +print(ws.header_str) +print(ws.footer_str) +print(ws.print_centered_vert) +print(ws.print_centered_horz) +print(ws.left_margin) +print(ws.right_margin) +print(ws.top_margin) +print(ws.bottom_margin) +print(ws.paper_size_code) +print(ws.print_scaling) +print(ws.start_page_number) +print(ws.fit_width_to_pages) +print(ws.fit_height_to_pages) +print(ws.print_in_rows) +print(ws.portrait) +print(ws.print_colour) +print(ws.print_draft) +print(ws.print_notes) +print(ws.print_notes_at_end) +print(ws.print_omit_errors) +print(ws.print_hres) +print(ws.print_vres) +print(ws.header_margin) +print(ws.footer_margin) +print(ws.copies_num)