From 96c93871cf1e8f047b6656912636cc638f2a1808 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Wed, 6 Oct 2010 13:42:52 -0400 Subject: [PATCH] Vendorized XLWT. --- tablib/packages/xlwt/BIFFRecords.py | 2393 ++++++++++++++ tablib/packages/xlwt/Bitmap.py | 262 ++ tablib/packages/xlwt/Cell.py | 243 ++ tablib/packages/xlwt/Column.py | 34 + tablib/packages/xlwt/CompoundDoc.py | 516 +++ tablib/packages/xlwt/ExcelFormula.py | 43 + tablib/packages/xlwt/ExcelFormulaLexer.py | 128 + tablib/packages/xlwt/ExcelFormulaParser.py | 677 ++++ tablib/packages/xlwt/ExcelMagic.py | 862 +++++ tablib/packages/xlwt/Formatting.py | 261 ++ tablib/packages/xlwt/Row.py | 253 ++ tablib/packages/xlwt/Style.py | 592 ++++ tablib/packages/xlwt/UnicodeUtils.py | 81 + tablib/packages/xlwt/Utils.py | 196 ++ tablib/packages/xlwt/Workbook.py | 636 ++++ tablib/packages/xlwt/Worksheet.py | 1297 ++++++++ tablib/packages/xlwt/__init__.py | 16 + tablib/packages/xlwt/antlr.py | 2874 +++++++++++++++++ tablib/packages/xlwt/doc/xlwt.html | 199 ++ tablib/packages/xlwt/examples/big-16Mb.py | 35 + tablib/packages/xlwt/examples/big-35Mb.py | 34 + tablib/packages/xlwt/examples/blanks.py | 36 + tablib/packages/xlwt/examples/col_width.py | 19 + tablib/packages/xlwt/examples/country.py | 10 + tablib/packages/xlwt/examples/dates.py | 37 + tablib/packages/xlwt/examples/format.py | 38 + .../packages/xlwt/examples/formula_names.py | 34 + tablib/packages/xlwt/examples/formulas.py | 47 + tablib/packages/xlwt/examples/hyperlinks.py | 28 + tablib/packages/xlwt/examples/image.py | 12 + tablib/packages/xlwt/examples/merged.py | 39 + tablib/packages/xlwt/examples/merged0.py | 30 + tablib/packages/xlwt/examples/merged1.py | 102 + tablib/packages/xlwt/examples/mini.py | 9 + tablib/packages/xlwt/examples/num_formats.py | 60 + tablib/packages/xlwt/examples/numbers.py | 25 + tablib/packages/xlwt/examples/outline.py | 113 + tablib/packages/xlwt/examples/panes.py | 58 + tablib/packages/xlwt/examples/parse-fmla.py | 12 + tablib/packages/xlwt/examples/protection.py | 122 + tablib/packages/xlwt/examples/python.bmp | Bin 0 -> 37446 bytes tablib/packages/xlwt/examples/row_styles.py | 17 + .../xlwt/examples/row_styles_empty.py | 18 + tablib/packages/xlwt/examples/simple.py | 24 + tablib/packages/xlwt/examples/sst.py | 52 + tablib/packages/xlwt/examples/unicode0.py | 12 + tablib/packages/xlwt/examples/unicode1.py | 28 + tablib/packages/xlwt/examples/unicode2.py | 19 + tablib/packages/xlwt/examples/wsprops.py | 155 + .../xlwt/examples/xlwt_easyxf_simple_demo.py | 46 + tablib/packages/xlwt/excel-formula.g | 374 +++ 51 files changed, 13208 insertions(+) create mode 100644 tablib/packages/xlwt/BIFFRecords.py create mode 100644 tablib/packages/xlwt/Bitmap.py create mode 100644 tablib/packages/xlwt/Cell.py create mode 100644 tablib/packages/xlwt/Column.py create mode 100644 tablib/packages/xlwt/CompoundDoc.py create mode 100644 tablib/packages/xlwt/ExcelFormula.py create mode 100644 tablib/packages/xlwt/ExcelFormulaLexer.py create mode 100644 tablib/packages/xlwt/ExcelFormulaParser.py create mode 100644 tablib/packages/xlwt/ExcelMagic.py create mode 100644 tablib/packages/xlwt/Formatting.py create mode 100644 tablib/packages/xlwt/Row.py create mode 100644 tablib/packages/xlwt/Style.py create mode 100644 tablib/packages/xlwt/UnicodeUtils.py create mode 100644 tablib/packages/xlwt/Utils.py create mode 100644 tablib/packages/xlwt/Workbook.py create mode 100644 tablib/packages/xlwt/Worksheet.py create mode 100644 tablib/packages/xlwt/__init__.py create mode 100644 tablib/packages/xlwt/antlr.py create mode 100644 tablib/packages/xlwt/doc/xlwt.html create mode 100644 tablib/packages/xlwt/examples/big-16Mb.py create mode 100644 tablib/packages/xlwt/examples/big-35Mb.py create mode 100644 tablib/packages/xlwt/examples/blanks.py create mode 100644 tablib/packages/xlwt/examples/col_width.py create mode 100644 tablib/packages/xlwt/examples/country.py create mode 100644 tablib/packages/xlwt/examples/dates.py create mode 100644 tablib/packages/xlwt/examples/format.py create mode 100644 tablib/packages/xlwt/examples/formula_names.py create mode 100644 tablib/packages/xlwt/examples/formulas.py create mode 100644 tablib/packages/xlwt/examples/hyperlinks.py create mode 100644 tablib/packages/xlwt/examples/image.py create mode 100644 tablib/packages/xlwt/examples/merged.py create mode 100644 tablib/packages/xlwt/examples/merged0.py create mode 100644 tablib/packages/xlwt/examples/merged1.py create mode 100644 tablib/packages/xlwt/examples/mini.py create mode 100644 tablib/packages/xlwt/examples/num_formats.py create mode 100644 tablib/packages/xlwt/examples/numbers.py create mode 100644 tablib/packages/xlwt/examples/outline.py create mode 100644 tablib/packages/xlwt/examples/panes.py create mode 100644 tablib/packages/xlwt/examples/parse-fmla.py create mode 100644 tablib/packages/xlwt/examples/protection.py create mode 100644 tablib/packages/xlwt/examples/python.bmp create mode 100644 tablib/packages/xlwt/examples/row_styles.py create mode 100644 tablib/packages/xlwt/examples/row_styles_empty.py create mode 100644 tablib/packages/xlwt/examples/simple.py create mode 100644 tablib/packages/xlwt/examples/sst.py create mode 100644 tablib/packages/xlwt/examples/unicode0.py create mode 100644 tablib/packages/xlwt/examples/unicode1.py create mode 100644 tablib/packages/xlwt/examples/unicode2.py create mode 100644 tablib/packages/xlwt/examples/wsprops.py create mode 100644 tablib/packages/xlwt/examples/xlwt_easyxf_simple_demo.py create mode 100644 tablib/packages/xlwt/excel-formula.g diff --git a/tablib/packages/xlwt/BIFFRecords.py b/tablib/packages/xlwt/BIFFRecords.py new file mode 100644 index 0000000..4660c03 --- /dev/null +++ b/tablib/packages/xlwt/BIFFRecords.py @@ -0,0 +1,2393 @@ +# -*- coding: cp1252 -*- +from struct import pack +from UnicodeUtils import upack1, upack2 +import sys + +class SharedStringTable(object): + _SST_ID = 0x00FC + _CONTINUE_ID = 0x003C + + def __init__(self, encoding): + self.encoding = encoding + self._str_indexes = {} + self._tally = [] + self._add_calls = 0 + # Following 3 attrs are used for temporary storage in the + # get_biff_record() method and methods called by it. The pseudo- + # initialisation here is for documentation purposes only. + self._sst_record = None + self._continues = None + self._current_piece = None + + def add_str(self, s): + if self.encoding != 'ascii' and not isinstance(s, unicode): + s = unicode(s, self.encoding) + self._add_calls += 1 + if s not in self._str_indexes: + idx = len(self._str_indexes) + self._str_indexes[s] = idx + self._tally.append(1) + else: + idx = self._str_indexes[s] + self._tally[idx] += 1 + return idx + + def del_str(self, idx): + # This is called when we are replacing the contents of a string cell. + assert self._tally[idx] > 0 + self._tally[idx] -= 1 + self._add_calls -= 1 + + def str_index(self, s): + return self._str_indexes[s] + + def get_biff_record(self): + self._sst_record = '' + self._continues = [None, None] + self._current_piece = pack(' 0x2020: # limit for BIFF7/8 + chunks = [] + pos = 0 + while pos < len(data): + chunk_pos = pos + 0x2020 + chunk = data[pos:chunk_pos] + chunks.append(chunk) + pos = chunk_pos + continues = pack('<2H', self._REC_ID, len(chunks[0])) + chunks[0] + for chunk in chunks[1:]: + continues += pack('<2H%ds'%len(chunk), 0x003C, len(chunk), chunk) + # 0x003C -- CONTINUE record id + return continues + else: + return self.get_rec_header() + data + + +class Biff8BOFRecord(BiffRecord): + """ + Offset Size Contents + 0 2 Version, contains 0600H for BIFF8 and BIFF8X + 2 2 Type of the following data: + 0005H = Workbook globals + 0006H = Visual Basic module + 0010H = Worksheet + 0020H = Chart + 0040H = Macro sheet + 0100H = Workspace file + 4 2 Build identifier + 6 2 Build year + 8 4 File history flags + 12 4 Lowest Excel version that can read all records in this file + """ + _REC_ID = 0x0809 + # stream types + BOOK_GLOBAL = 0x0005 + VB_MODULE = 0x0006 + WORKSHEET = 0x0010 + CHART = 0x0020 + MACROSHEET = 0x0040 + WORKSPACE = 0x0100 + + def __init__(self, rec_type): + version = 0x0600 + build = 0x0DBB + year = 0x07CC + file_hist_flags = 0x00L + ver_can_read = 0x06L + + self._rec_data = pack('<4H2I', version, rec_type, build, year, file_hist_flags, ver_can_read) + + +class InteraceHdrRecord(BiffRecord): + _REC_ID = 0x00E1 + + def __init__(self): + self._rec_data = pack('BB', 0xB0, 0x04) + + +class InteraceEndRecord(BiffRecord): + _REC_ID = 0x00E2 + + def __init__(self): + self._rec_data = '' + + +class MMSRecord(BiffRecord): + _REC_ID = 0x00C1 + + def __init__(self): + self._rec_data = pack('> 15 + c = low_15 | high_15 + passwd_hash ^= c + passwd_hash ^= len(plaintext) + passwd_hash ^= 0xCE4B + return passwd_hash + + def __init__(self, passwd = ""): + self._rec_data = pack('