mirror of
https://github.com/kennethreitz/tablib.git
synced 2026-06-05 23:10:17 +00:00
no vendored tests
This commit is contained in:
@@ -1,24 +0,0 @@
|
||||
# file openpyxl/tests/__init__.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
@@ -1,94 +0,0 @@
|
||||
# file openpyxl/tests/helper.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os
|
||||
import os.path
|
||||
import shutil
|
||||
import difflib
|
||||
from StringIO import StringIO
|
||||
from pprint import pprint
|
||||
from tempfile import gettempdir
|
||||
|
||||
# package imports
|
||||
from openpyxl.shared.xmltools import fromstring, ElementTree
|
||||
from openpyxl.shared.xmltools import pretty_indent
|
||||
|
||||
# constants
|
||||
DATADIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test_data'))
|
||||
TMPDIR = os.path.join(gettempdir(), 'openpyxl_test_temp')
|
||||
|
||||
|
||||
def make_tmpdir():
|
||||
try:
|
||||
os.makedirs(TMPDIR)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def clean_tmpdir():
|
||||
if os.path.isdir(TMPDIR):
|
||||
shutil.rmtree(TMPDIR, ignore_errors = True)
|
||||
|
||||
|
||||
def assert_equals_file_content(reference_file, fixture, filetype = 'xml'):
|
||||
if os.path.isfile(fixture):
|
||||
with open(fixture) as fixture_file:
|
||||
fixture_content = fixture_file.read()
|
||||
else:
|
||||
fixture_content = fixture
|
||||
|
||||
with open(reference_file) as expected_file:
|
||||
expected_content = expected_file.read()
|
||||
|
||||
if filetype == 'xml':
|
||||
fixture_content = fromstring(fixture_content)
|
||||
pretty_indent(fixture_content)
|
||||
temp = StringIO()
|
||||
ElementTree(fixture_content).write(temp)
|
||||
fixture_content = temp.getvalue()
|
||||
|
||||
expected_content = fromstring(expected_content)
|
||||
pretty_indent(expected_content)
|
||||
temp = StringIO()
|
||||
ElementTree(expected_content).write(temp)
|
||||
expected_content = temp.getvalue()
|
||||
|
||||
fixture_lines = fixture_content.split('\n')
|
||||
expected_lines = expected_content.split('\n')
|
||||
differences = list(difflib.unified_diff(expected_lines, fixture_lines))
|
||||
if differences:
|
||||
temp = StringIO()
|
||||
pprint(differences, stream = temp)
|
||||
assert False, 'Differences found : %s' % temp.getvalue()
|
||||
|
||||
def get_xml(xml_node):
|
||||
|
||||
io = StringIO()
|
||||
ElementTree(xml_node).write(io, encoding = 'UTF-8')
|
||||
ret = io.getvalue()
|
||||
io.close()
|
||||
return ret.replace('\n', '')
|
||||
@@ -1,200 +0,0 @@
|
||||
# file openpyxl/tests/test_cell.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from datetime import time, datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.shared.exc import ColumnStringIndexException, \
|
||||
CellCoordinatesException, DataTypeException
|
||||
from openpyxl.cell import column_index_from_string, \
|
||||
coordinate_from_string, get_column_letter, Cell, absolute_coordinate
|
||||
|
||||
|
||||
def test_coordinates():
|
||||
column, row = coordinate_from_string('ZF46')
|
||||
eq_("ZF", column)
|
||||
eq_(46, row)
|
||||
|
||||
|
||||
@raises(CellCoordinatesException)
|
||||
def test_invalid_coordinate():
|
||||
coordinate_from_string('AAA')
|
||||
|
||||
|
||||
def test_absolute():
|
||||
eq_('$ZF$51', absolute_coordinate('ZF51'))
|
||||
|
||||
def test_absolute_multiple():
|
||||
|
||||
eq_('$ZF$51:$ZF$53', absolute_coordinate('ZF51:ZF$53'))
|
||||
|
||||
|
||||
def test_column_index():
|
||||
eq_(10, column_index_from_string('J'))
|
||||
eq_(270, column_index_from_string('jJ'))
|
||||
eq_(7030, column_index_from_string('jjj'))
|
||||
|
||||
|
||||
def test_bad_column_index():
|
||||
|
||||
@raises(ColumnStringIndexException)
|
||||
def _check(bad_string):
|
||||
column_index_from_string(bad_string)
|
||||
|
||||
bad_strings = ('JJJJ', '', '$', '1',)
|
||||
for bad_string in bad_strings:
|
||||
yield _check, bad_string
|
||||
|
||||
|
||||
def test_column_letter_boundries():
|
||||
assert_raises(ColumnStringIndexException, get_column_letter, 0)
|
||||
assert_raises(ColumnStringIndexException, get_column_letter, 18279)
|
||||
|
||||
|
||||
def test_column_letter():
|
||||
eq_('ZZZ', get_column_letter(18278))
|
||||
eq_('JJJ', get_column_letter(7030))
|
||||
eq_('AB', get_column_letter(28))
|
||||
eq_('AA', get_column_letter(27))
|
||||
eq_('Z', get_column_letter(26))
|
||||
|
||||
|
||||
def test_initial_value():
|
||||
cell = Cell(None, 'A', 1, value = '17.5')
|
||||
eq_(cell.TYPE_NUMERIC, cell.data_type)
|
||||
|
||||
|
||||
class TestCellValueTypes():
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.cell = Cell(None, 'A', 1)
|
||||
|
||||
def test_1st(self):
|
||||
eq_(self.cell.TYPE_NULL, self.cell.data_type)
|
||||
|
||||
def test_null(self):
|
||||
self.cell.value = None
|
||||
eq_(self.cell.TYPE_NULL, self.cell.data_type)
|
||||
|
||||
def test_numeric(self):
|
||||
|
||||
def check_numeric(value):
|
||||
self.cell.value = value
|
||||
eq_(self.cell.TYPE_NUMERIC, self.cell.data_type)
|
||||
|
||||
values = (42, '4.2', '-42.000', '0', 0, 0.0001, '0.9999', '99E-02')
|
||||
for value in values:
|
||||
yield check_numeric, value
|
||||
|
||||
def test_string(self):
|
||||
self.cell.value = 'hello'
|
||||
eq_(self.cell.TYPE_STRING, self.cell.data_type)
|
||||
|
||||
def test_formula(self):
|
||||
self.cell.value = '=42'
|
||||
eq_(self.cell.TYPE_FORMULA, self.cell.data_type)
|
||||
|
||||
def test_boolean(self):
|
||||
self.cell.value = True
|
||||
eq_(self.cell.TYPE_BOOL, self.cell.data_type)
|
||||
self.cell.value = False
|
||||
eq_(self.cell.TYPE_BOOL, self.cell.data_type)
|
||||
|
||||
def test_error_codes(self):
|
||||
|
||||
def check_error():
|
||||
eq_(self.cell.TYPE_ERROR, self.cell.data_type)
|
||||
|
||||
for error_string in self.cell.ERROR_CODES.keys():
|
||||
self.cell.value = error_string
|
||||
yield check_error
|
||||
|
||||
|
||||
def test_data_type_check():
|
||||
cell = Cell(None, 'A', 1)
|
||||
cell.bind_value(None)
|
||||
eq_(Cell.TYPE_NULL, cell._data_type)
|
||||
|
||||
cell.bind_value('.0e000')
|
||||
eq_(Cell.TYPE_NUMERIC, cell._data_type)
|
||||
|
||||
cell.bind_value('-0.e-0')
|
||||
eq_(Cell.TYPE_NUMERIC, cell._data_type)
|
||||
|
||||
cell.bind_value('1E')
|
||||
eq_(Cell.TYPE_STRING, cell._data_type)
|
||||
|
||||
@raises(DataTypeException)
|
||||
def test_set_bad_type():
|
||||
cell = Cell(None, 'A', 1)
|
||||
cell.set_value_explicit(1, 'q')
|
||||
|
||||
|
||||
def test_time():
|
||||
|
||||
def check_time(raw_value, coerced_value):
|
||||
cell.value = raw_value
|
||||
eq_(cell.value, coerced_value)
|
||||
eq_(cell.TYPE_NUMERIC, cell.data_type)
|
||||
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
values = (('03:40:16', time(3, 40, 16)), ('03:40', time(3, 40)),)
|
||||
for raw_value, coerced_value in values:
|
||||
yield check_time, raw_value, coerced_value
|
||||
|
||||
|
||||
def test_date_format_on_non_date():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
cell.value = datetime.now()
|
||||
cell.value = 'testme'
|
||||
eq_('testme', cell.value)
|
||||
|
||||
|
||||
def test_repr():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
eq_(repr(cell), '<Cell Sheet1.A1>', 'Got bad repr: %s' % repr(cell))
|
||||
|
||||
def test_is_date():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
cell.value = datetime.now()
|
||||
eq_(cell.is_date(), True)
|
||||
cell.value = 'testme'
|
||||
eq_('testme', cell.value)
|
||||
eq_(cell.is_date(), False)
|
||||
@@ -1,131 +0,0 @@
|
||||
# file openpyxl/tests/test_chart.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
from nose.tools import eq_
|
||||
|
||||
from openpyxl.tests.helper import get_xml
|
||||
from openpyxl.shared.xmltools import Element
|
||||
from openpyxl.writer.charts import ChartWriter
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.chart import BarChart, ScatterChart, Serie, Reference
|
||||
from openpyxl.style import Color
|
||||
|
||||
class TestChartWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.get_active_sheet()
|
||||
ws.title = u'data'
|
||||
for i in range(10):
|
||||
ws.cell(row = i, column = 0).value = i
|
||||
self.chart = BarChart()
|
||||
self.chart.title = 'TITLE'
|
||||
self.chart.add_serie(Serie(Reference(ws, (0, 0), (10, 0))))
|
||||
self.chart._series[-1].color = Color.GREEN
|
||||
self.cw = ChartWriter(self.chart)
|
||||
self.root = Element('test')
|
||||
|
||||
def test_write_title(self):
|
||||
self.cw._write_title(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:title><c:tx><c:rich><a:bodyPr /><a:lstStyle /><a:p><a:pPr><a:defRPr /></a:pPr><a:r><a:rPr lang="fr-FR" /><a:t>TITLE</a:t></a:r></a:p></c:rich></c:tx><c:layout /></c:title></test>')
|
||||
|
||||
def test_write_xaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.chart.x_axis, 'c:catAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:catAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /></c:scaling><c:axPos val="b" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /></c:catAx></test>')
|
||||
|
||||
def test_write_yaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.chart.y_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="between" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
def test_write_series(self):
|
||||
|
||||
self.cw._write_series(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:ser><c:idx val="0" /><c:order val="0" /><c:spPr><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill><a:ln><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill></a:ln></c:spPr><c:marker><c:symbol val="none" /></c:marker><c:val><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:val></c:ser></test>')
|
||||
|
||||
def test_write_legend(self):
|
||||
|
||||
self.cw._write_legend(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:legend><c:legendPos val="r" /><c:layout /></c:legend></test>')
|
||||
|
||||
def test_write_print_settings(self):
|
||||
|
||||
self.cw._write_print_settings(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:printSettings><c:headerFooter /><c:pageMargins b="0.75" footer="0.3" header="0.3" l="0.7" r="0.7" t="0.75" /><c:pageSetup /></c:printSettings></test>')
|
||||
|
||||
def test_write_chart(self):
|
||||
|
||||
self.cw._write_chart(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:chart><c:title><c:tx><c:rich><a:bodyPr /><a:lstStyle /><a:p><a:pPr><a:defRPr /></a:pPr><a:r><a:rPr lang="fr-FR" /><a:t>TITLE</a:t></a:r></a:p></c:rich></c:tx><c:layout /></c:title><c:plotArea><c:layout><c:manualLayout><c:layoutTarget val="inner" /><c:xMode val="edge" /><c:yMode val="edge" /><c:x val="1.28571428571" /><c:y val="0.2125" /><c:w val="0.6" /><c:h val="0.6" /></c:manualLayout></c:layout><c:barChart><c:barDir val="col" /><c:grouping val="clustered" /><c:ser><c:idx val="0" /><c:order val="0" /><c:spPr><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill><a:ln><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill></a:ln></c:spPr><c:marker><c:symbol val="none" /></c:marker><c:val><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:val></c:ser><c:marker val="1" /><c:axId val="60871424" /><c:axId val="60873344" /></c:barChart><c:catAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /></c:scaling><c:axPos val="b" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /></c:catAx><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="between" /><c:majorUnit val="2.0" /></c:valAx></c:plotArea><c:legend><c:legendPos val="r" /><c:layout /></c:legend><c:plotVisOnly val="1" /></c:chart></test>')
|
||||
|
||||
|
||||
class TestScatterChartWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.get_active_sheet()
|
||||
ws.title = u'data'
|
||||
for i in range(10):
|
||||
ws.cell(row = i, column = 0).value = i
|
||||
ws.cell(row = i, column = 1).value = i
|
||||
self.scatterchart = ScatterChart()
|
||||
self.scatterchart.add_serie(Serie(Reference(ws, (0, 0), (10, 0)),
|
||||
xvalues = Reference(ws, (0, 1), (10, 1))))
|
||||
self.cw = ChartWriter(self.scatterchart)
|
||||
self.root = Element('test')
|
||||
|
||||
def test_write_xaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.scatterchart.x_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="b" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
|
||||
def test_write_yaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.scatterchart.y_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
def test_write_series(self):
|
||||
|
||||
self.cw._write_series(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:ser><c:idx val="0" /><c:order val="0" /><c:marker><c:symbol val="none" /></c:marker><c:xVal><c:numRef><c:f>data!$B$1:$B$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:xVal><c:yVal><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:yVal></c:ser></test>')
|
||||
|
||||
def test_write_legend(self):
|
||||
|
||||
self.cw._write_legend(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:legend><c:legendPos val="r" /><c:layout /></c:legend></test>')
|
||||
|
||||
def test_write_print_settings(self):
|
||||
|
||||
self.cw._write_print_settings(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:printSettings><c:headerFooter /><c:pageMargins b="0.75" footer="0.3" header="0.3" l="0.7" r="0.7" t="0.75" /><c:pageSetup /></c:printSettings></test>')
|
||||
|
||||
def test_write_chart(self):
|
||||
|
||||
self.cw._write_chart(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:chart><c:plotArea><c:layout><c:manualLayout><c:layoutTarget val="inner" /><c:xMode val="edge" /><c:yMode val="edge" /><c:x val="1.28571428571" /><c:y val="0.2125" /><c:w val="0.6" /><c:h val="0.6" /></c:manualLayout></c:layout><c:scatterChart><c:scatterStyle val="lineMarker" /><c:ser><c:idx val="0" /><c:order val="0" /><c:marker><c:symbol val="none" /></c:marker><c:xVal><c:numRef><c:f>data!$B$1:$B$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:xVal><c:yVal><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:yVal></c:ser><c:marker val="1" /><c:axId val="60871424" /><c:axId val="60873344" /></c:scatterChart><c:valAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="b" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></c:plotArea><c:legend><c:legendPos val="r" /><c:layout /></c:legend><c:plotVisOnly val="1" /></c:chart></test>')
|
||||
@@ -1,109 +0,0 @@
|
||||
|
||||
# file openpyxl/tests/test_dump.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from datetime import time, datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.cell import get_column_letter
|
||||
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
|
||||
from openpyxl.writer.strings import StringTableBuilder
|
||||
|
||||
from tempfile import NamedTemporaryFile
|
||||
import os
|
||||
import shutil
|
||||
|
||||
def test_dump_sheet():
|
||||
|
||||
test_file = NamedTemporaryFile(prefix='openpyxl.', suffix='.xlsx', delete=False)
|
||||
test_file.close()
|
||||
test_filename = test_file.name
|
||||
|
||||
wb = Workbook(optimized_write = True)
|
||||
|
||||
ws = wb.create_sheet()
|
||||
|
||||
letters = [get_column_letter(x+1) for x in xrange(20)]
|
||||
|
||||
expected_rows = []
|
||||
|
||||
for row in xrange(20):
|
||||
|
||||
expected_rows.append(['%s%d' % (letter, row+1) for letter in letters])
|
||||
|
||||
for row in xrange(20):
|
||||
|
||||
expected_rows.append([(row+1) for letter in letters])
|
||||
|
||||
for row in xrange(10):
|
||||
|
||||
expected_rows.append([datetime(2010, ((x % 12)+1), row+1) for x in range(len(letters))])
|
||||
|
||||
for row in xrange(20):
|
||||
|
||||
expected_rows.append(['=%s%d' % (letter, row+1) for letter in letters])
|
||||
|
||||
for row in expected_rows:
|
||||
|
||||
ws.append(row)
|
||||
|
||||
wb.save(test_filename)
|
||||
|
||||
wb2 = load_workbook(test_filename, True)
|
||||
|
||||
ws = wb2.worksheets[0]
|
||||
|
||||
|
||||
for ex_row, ws_row in zip(expected_rows[:-20], ws.iter_rows()):
|
||||
|
||||
for ex_cell, ws_cell in zip(ex_row, ws_row):
|
||||
|
||||
eq_(ex_cell, ws_cell.internal_value)
|
||||
|
||||
os.remove(test_filename)
|
||||
|
||||
|
||||
def test_table_builder():
|
||||
|
||||
sb = StringTableBuilder()
|
||||
|
||||
result = {'a':0, 'b':1, 'c':2, 'd':3}
|
||||
|
||||
for letter in sorted(result.keys()):
|
||||
|
||||
for x in range(5):
|
||||
|
||||
sb.add(letter)
|
||||
|
||||
table = dict(sb.get_table())
|
||||
|
||||
for key,idx in result.items():
|
||||
eq_(idx, table[key])
|
||||
@@ -1,112 +0,0 @@
|
||||
# file openpyxl/tests/test_iter.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
import os.path as osp
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.reader.iter_worksheet import get_range_boundaries
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
import datetime
|
||||
|
||||
class TestWorksheet(object):
|
||||
|
||||
workbook_name = osp.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
|
||||
class TestText(TestWorksheet):
|
||||
sheet_name = 'Sheet1 - Text'
|
||||
|
||||
expected = [['This is cell A1 in Sheet 1', None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, 'This is cell G5'], ]
|
||||
|
||||
def test_read_fast_integrated(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
for row, expected_row in zip(ws.iter_rows(), self.expected):
|
||||
|
||||
row_values = [x.internal_value for x in row]
|
||||
|
||||
eq_(row_values, expected_row)
|
||||
|
||||
|
||||
def test_get_boundaries_range(self):
|
||||
|
||||
eq_(get_range_boundaries('C1:C4'), (3, 1, 3, 4))
|
||||
|
||||
def test_get_boundaries_one(self):
|
||||
|
||||
|
||||
eq_(get_range_boundaries('C1'), (3, 1, 4, 1))
|
||||
|
||||
def test_read_single_cell_range(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
eq_('This is cell A1 in Sheet 1', list(ws.iter_rows('A1'))[0][0].internal_value)
|
||||
|
||||
class TestIntegers(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet2 - Numbers'
|
||||
|
||||
expected = [[x + 1] for x in xrange(30)]
|
||||
|
||||
query_range = 'D1:E30'
|
||||
|
||||
def test_read_fast_integrated(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
for row, expected_row in zip(ws.iter_rows(self.query_range), self.expected):
|
||||
|
||||
row_values = [x.internal_value for x in row]
|
||||
|
||||
eq_(row_values, expected_row)
|
||||
|
||||
class TestFloats(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet2 - Numbers'
|
||||
query_range = 'K1:L30'
|
||||
expected = expected = [[(x + 1) / 100.0] for x in xrange(30)]
|
||||
|
||||
class TestDates(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet4 - Dates'
|
||||
|
||||
def test_read_single_cell_date(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
eq_(datetime.datetime(1973, 5, 20), list(ws.iter_rows('A1'))[0][0].internal_value)
|
||||
eq_(datetime.datetime(1973, 5, 20, 9, 15, 2), list(ws.iter_rows('C1'))[0][0].internal_value)
|
||||
|
||||
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# file openpyxl/tests/test_meta.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os.path
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content
|
||||
from openpyxl.writer.workbook import write_content_types, write_root_rels
|
||||
from openpyxl.workbook import Workbook
|
||||
|
||||
|
||||
def test_write_content_types():
|
||||
wb = Workbook()
|
||||
wb.create_sheet()
|
||||
wb.create_sheet()
|
||||
content = write_content_types(wb)
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected',
|
||||
'[Content_Types].xml')
|
||||
assert_equals_file_content(reference_file, content)
|
||||
|
||||
|
||||
def test_write_root_rels():
|
||||
wb = Workbook()
|
||||
content = write_root_rels(wb)
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected', '.rels')
|
||||
assert_equals_file_content(reference_file, content)
|
||||
@@ -1,102 +0,0 @@
|
||||
# file openpyxl/tests/test_named_range.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os.path
|
||||
|
||||
# 3rd-party imports
|
||||
from nose.tools import eq_, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.namedrange import split_named_range
|
||||
from openpyxl.reader.workbook import read_named_ranges
|
||||
from openpyxl.shared.exc import NamedRangeException
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
|
||||
|
||||
def test_split():
|
||||
eq_([('My Sheet', '$D$8'), ], split_named_range("'My Sheet'!$D$8"))
|
||||
|
||||
|
||||
def test_split_no_quotes():
|
||||
eq_([('HYPOTHESES', '$B$3:$L$3'), ], split_named_range('HYPOTHESES!$B$3:$L$3'))
|
||||
|
||||
|
||||
def test_bad_range_name():
|
||||
assert_raises(NamedRangeException, split_named_range, 'HYPOTHESES$B$3')
|
||||
|
||||
|
||||
def test_read_named_ranges():
|
||||
|
||||
class DummyWs(object):
|
||||
title = 'My Sheeet'
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
class DummyWB(object):
|
||||
|
||||
def get_sheet_by_name(self, name):
|
||||
return DummyWs()
|
||||
|
||||
with open(os.path.join(DATADIR, 'reader', 'workbook.xml')) as handle:
|
||||
content = handle.read()
|
||||
named_ranges = read_named_ranges(content, DummyWB())
|
||||
eq_(["My Sheeet!$D$8"], [str(range) for range in named_ranges])
|
||||
|
||||
def test_oddly_shaped_named_ranges():
|
||||
|
||||
ranges_counts = ((4, 'TEST_RANGE'),
|
||||
(3, 'TRAP_1'),
|
||||
(13, 'TRAP_2'))
|
||||
|
||||
def check_ranges(ws, count, range_name):
|
||||
|
||||
eq_(count, len(ws.range(range_name)))
|
||||
|
||||
wb = load_workbook(os.path.join(DATADIR, 'genuine', 'merge_range.xlsx'),
|
||||
use_iterators = False)
|
||||
|
||||
ws = wb.worksheets[0]
|
||||
|
||||
for count, range_name in ranges_counts:
|
||||
|
||||
yield check_ranges, ws, count, range_name
|
||||
|
||||
|
||||
def test_merged_cells_named_range():
|
||||
|
||||
wb = load_workbook(os.path.join(DATADIR, 'genuine', 'merge_range.xlsx'),
|
||||
use_iterators = False)
|
||||
|
||||
ws = wb.worksheets[0]
|
||||
|
||||
cell = ws.range('TRAP_3')
|
||||
|
||||
eq_('B15', cell.get_coordinate())
|
||||
|
||||
eq_(10, cell.value)
|
||||
@@ -1,142 +0,0 @@
|
||||
# file openpyxl/tests/test_number_format.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
from datetime import datetime, date
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, assert_almost_equal, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.cell import Cell
|
||||
from openpyxl.style import NumberFormat
|
||||
from openpyxl.shared.date_time import SharedDate
|
||||
|
||||
|
||||
class TestNumberFormat(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.workbook = Workbook()
|
||||
cls.worksheet = Worksheet(cls.workbook, 'Test')
|
||||
cls.sd = SharedDate()
|
||||
|
||||
def test_convert_date_to_julian(self):
|
||||
eq_(40167, self.sd.to_julian(2009, 12, 20))
|
||||
|
||||
def test_convert_date_from_julian(self):
|
||||
|
||||
def test_date_equal(julian, datetime):
|
||||
|
||||
eq_(self.sd.from_julian(julian), datetime)
|
||||
|
||||
date_pairs= (
|
||||
(40167, datetime(2009, 12, 20)),
|
||||
(21980, datetime(1960, 03, 05)),
|
||||
)
|
||||
|
||||
for count, dt in date_pairs:
|
||||
yield test_date_equal, count, dt
|
||||
|
||||
def test_convert_datetime_to_julian(self):
|
||||
eq_(40167, self.sd.datetime_to_julian(datetime(2009, 12, 20)))
|
||||
|
||||
def test_insert_float(self):
|
||||
self.worksheet.cell('A1').value = 3.14
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_insert_percentage(self):
|
||||
self.worksheet.cell('A1').value = '3.14%'
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
assert_almost_equal(0.0314, self.worksheet.cell('A1').value)
|
||||
|
||||
def test_insert_datetime(self):
|
||||
self.worksheet.cell('A1').value = date.today()
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_insert_date(self):
|
||||
self.worksheet.cell('A1').value = datetime.now()
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_internal_date(self):
|
||||
dt = datetime(2010, 7, 13, 6, 37, 41)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(40372.27616898148, self.worksheet.cell('A3')._value)
|
||||
|
||||
def test_datetime_interpretation(self):
|
||||
dt = datetime(2010, 7, 13, 6, 37, 41)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(dt, self.worksheet.cell('A3').value)
|
||||
|
||||
def test_date_interpretation(self):
|
||||
dt = date(2010, 7, 13)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(datetime(2010, 7, 13, 0, 0), self.worksheet.cell('A3').value)
|
||||
|
||||
def test_number_format_style(self):
|
||||
self.worksheet.cell('A1').value = '12.6%'
|
||||
eq_(NumberFormat.FORMAT_PERCENTAGE, \
|
||||
self.worksheet.cell('A1').style.number_format.format_code)
|
||||
|
||||
def test_date_format_on_non_date(self):
|
||||
cell = self.worksheet.cell('A1')
|
||||
|
||||
def check_date_pair(count, date_string):
|
||||
cell.value = datetime.strptime(date_string, '%Y-%m-%d')
|
||||
eq_(count, cell._value)
|
||||
|
||||
date_pairs = (
|
||||
(15, '1900-01-15'),
|
||||
(59, '1900-02-28'),
|
||||
(61, '1900-03-01'),
|
||||
(367, '1901-01-01'),
|
||||
(2958465, '9999-12-31'), )
|
||||
for count, date_string in date_pairs:
|
||||
yield check_date_pair, count, date_string
|
||||
|
||||
def test_1900_leap_year(self):
|
||||
assert_raises(ValueError, self.sd.from_julian, 60)
|
||||
assert_raises(ValueError, self.sd.to_julian, 1900, 2, 29)
|
||||
|
||||
def test_bad_date(self):
|
||||
|
||||
def check_bad_date(year, month, day):
|
||||
assert_raises(ValueError, self.sd.to_julian, year, month, day)
|
||||
|
||||
bad_dates = ((1776, 07, 04), (1899, 12, 31), )
|
||||
for year, month, day in bad_dates:
|
||||
yield check_bad_date, year, month, day
|
||||
|
||||
def test_bad_julian_date(self):
|
||||
assert_raises(ValueError, self.sd.from_julian, -1)
|
||||
|
||||
def test_mac_date(self):
|
||||
self.sd.excel_base_date = self.sd.CALENDAR_MAC_1904
|
||||
assert_raises(NotImplementedError, self.sd.to_julian, 2000, 1, 1)
|
||||
assert_raises(NotImplementedError, self.sd.from_julian, 1)
|
||||
self.sd.excel_base_date = self.sd.CALENDAR_WINDOWS_1900
|
||||
@@ -1,41 +0,0 @@
|
||||
# file openpyxl/tests/test_password_hash.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.shared.password_hasher import hash_password
|
||||
from openpyxl.worksheet import SheetProtection
|
||||
|
||||
|
||||
def test_hasher():
|
||||
eq_('CBEB', hash_password('test'))
|
||||
|
||||
|
||||
def test_sheet_protection():
|
||||
protection = SheetProtection()
|
||||
protection.password = 'test'
|
||||
eq_('CBEB', protection.password)
|
||||
@@ -1,124 +0,0 @@
|
||||
# coding=utf-8
|
||||
# file openpyxl/tests/test_props.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
from zipfile import ZipFile, ZIP_DEFLATED
|
||||
from datetime import datetime
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, TMPDIR, make_tmpdir, clean_tmpdir, \
|
||||
assert_equals_file_content
|
||||
from openpyxl.reader.workbook import read_properties_core, \
|
||||
read_sheets_titles, get_number_of_parts
|
||||
from openpyxl.writer.workbook import write_properties_core, \
|
||||
write_properties_app
|
||||
from openpyxl.shared.ooxml import ARC_APP, ARC_CORE
|
||||
from openpyxl.workbook import DocumentProperties, Workbook
|
||||
|
||||
|
||||
class TestReaderProps(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.genuine_filename = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
cls.archive = ZipFile(cls.genuine_filename, 'r', ZIP_DEFLATED)
|
||||
|
||||
@classmethod
|
||||
def teardown_class(cls):
|
||||
cls.archive.close()
|
||||
|
||||
def test_read_properties_core(self):
|
||||
content = self.archive.read(ARC_CORE)
|
||||
prop = read_properties_core(content)
|
||||
eq_(prop.creator, '*.*')
|
||||
eq_(prop.last_modified_by, u'Aurélien Campéas')
|
||||
eq_(prop.created, datetime(2010, 4, 9, 20, 43, 12))
|
||||
eq_(prop.modified, datetime(2011, 2, 9, 13, 49, 32))
|
||||
|
||||
def test_read_sheets_titles(self):
|
||||
content = self.archive.read(ARC_APP)
|
||||
sheet_titles = read_sheets_titles(content)
|
||||
eq_(sheet_titles, \
|
||||
['Sheet1 - Text', 'Sheet2 - Numbers', 'Sheet3 - Formulas', 'Sheet4 - Dates'])
|
||||
|
||||
|
||||
class TestReaderPropsMixed(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
reference_filename = \
|
||||
os.path.join(DATADIR, 'reader', 'app-multi-titles.xml')
|
||||
with open(reference_filename) as handle:
|
||||
cls.content = handle.read()
|
||||
|
||||
def test_read_sheet_titles_mixed(self):
|
||||
sheet_titles = read_sheets_titles(self.content)
|
||||
eq_(sheet_titles,
|
||||
['ToC', 'ContractYear', 'ContractTier', 'Demand',
|
||||
'LinearizedFunction', 'Market', 'Transmission'])
|
||||
|
||||
def test_number_of_parts(self):
|
||||
parts_number = get_number_of_parts(self.content)
|
||||
eq_(parts_number,
|
||||
({'Worksheets': 7, 'Named Ranges': 7},
|
||||
['Worksheets', 'Named Ranges']))
|
||||
|
||||
|
||||
class TestWriteProps(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
make_tmpdir()
|
||||
cls.tmp_filename = os.path.join(TMPDIR, 'test.xlsx')
|
||||
cls.prop = DocumentProperties()
|
||||
|
||||
@classmethod
|
||||
def teardown_class(cls):
|
||||
clean_tmpdir()
|
||||
|
||||
def test_write_properties_core(self):
|
||||
self.prop.creator = 'TEST_USER'
|
||||
self.prop.last_modified_by = 'SOMEBODY'
|
||||
self.prop.created = datetime(2010, 4, 1, 20, 30, 00)
|
||||
self.prop.modified = datetime(2010, 4, 5, 14, 5, 30)
|
||||
content = write_properties_core(self.prop)
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'core.xml'),
|
||||
content)
|
||||
|
||||
def test_write_properties_app(self):
|
||||
wb = Workbook()
|
||||
wb.create_sheet()
|
||||
wb.create_sheet()
|
||||
content = write_properties_app(wb)
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'app.xml'),
|
||||
content)
|
||||
@@ -1,134 +0,0 @@
|
||||
# file openpyxl/tests/test_read.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.style import NumberFormat, Style
|
||||
from openpyxl.reader.worksheet import read_worksheet, read_dimension
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.shared.exc import InvalidFileException
|
||||
|
||||
|
||||
def test_read_standalone_worksheet():
|
||||
|
||||
class DummyWb(object):
|
||||
|
||||
def get_sheet_by_name(self, value):
|
||||
return None
|
||||
|
||||
path = os.path.join(DATADIR, 'reader', 'sheet2.xml')
|
||||
with open(path) as handle:
|
||||
ws = read_worksheet(handle.read(), DummyWb(),
|
||||
'Sheet 2', {1: 'hello'}, {1: Style()})
|
||||
assert isinstance(ws, Worksheet)
|
||||
eq_(ws.cell('G5').value, 'hello')
|
||||
eq_(ws.cell('D30').value, 30)
|
||||
eq_(ws.cell('K9').value, 0.09)
|
||||
|
||||
|
||||
def test_read_standard_workbook():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
wb = load_workbook(path)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
def test_read_standard_workbook_from_fileobj():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
fo = open(path, mode = 'rb')
|
||||
wb = load_workbook(fo)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
def test_read_worksheet():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
wb = load_workbook(path)
|
||||
sheet2 = wb.get_sheet_by_name('Sheet2 - Numbers')
|
||||
assert isinstance(sheet2, Worksheet)
|
||||
eq_('This is cell G5', sheet2.cell('G5').value)
|
||||
eq_(18, sheet2.cell('D18').value)
|
||||
|
||||
|
||||
def test_read_nostring_workbook():
|
||||
genuine_wb = os.path.join(DATADIR, 'genuine', 'empty-no-string.xlsx')
|
||||
wb = load_workbook(genuine_wb)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
@raises(InvalidFileException)
|
||||
def test_read_empty_file():
|
||||
|
||||
null_file = os.path.join(DATADIR, 'reader', 'null_file.xlsx')
|
||||
wb = load_workbook(null_file)
|
||||
|
||||
@raises(InvalidFileException)
|
||||
def test_read_empty_archive():
|
||||
|
||||
null_file = os.path.join(DATADIR, 'reader', 'null_archive.xlsx')
|
||||
wb = load_workbook(null_file)
|
||||
|
||||
def test_read_dimension():
|
||||
|
||||
path = os.path.join(DATADIR, 'reader', 'sheet2.xml')
|
||||
|
||||
with open(path) as handle:
|
||||
|
||||
dimension = read_dimension(xml_source = handle.read())
|
||||
|
||||
eq_(('D', 1, 'K', 30), dimension)
|
||||
|
||||
class TestReadWorkbookWithStyles(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.genuine_wb = os.path.join(DATADIR, 'genuine', \
|
||||
'empty-with-styles.xlsx')
|
||||
wb = load_workbook(cls.genuine_wb)
|
||||
cls.ws = wb.get_sheet_by_name('Sheet1')
|
||||
|
||||
def test_read_general_style(self):
|
||||
eq_(self.ws.cell('A1').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_GENERAL)
|
||||
|
||||
def test_read_date_style(self):
|
||||
eq_(self.ws.cell('A2').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_DATE_XLSX14)
|
||||
|
||||
def test_read_number_style(self):
|
||||
eq_(self.ws.cell('A3').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_NUMBER_00)
|
||||
|
||||
def test_read_time_style(self):
|
||||
eq_(self.ws.cell('A4').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_DATE_TIME3)
|
||||
|
||||
def test_read_percentage_style(self):
|
||||
eq_(self.ws.cell('A5').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_PERCENTAGE_00)
|
||||
@@ -1,68 +0,0 @@
|
||||
# file openpyxl/tests/test_strings.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.writer.strings import create_string_table
|
||||
from openpyxl.reader.strings import read_string_table
|
||||
|
||||
|
||||
def test_create_string_table():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('B12').value = 'hello'
|
||||
ws.cell('B13').value = 'world'
|
||||
ws.cell('D28').value = 'hello'
|
||||
table = create_string_table(wb)
|
||||
eq_({'hello': 1, 'world': 0}, table)
|
||||
|
||||
|
||||
def test_read_string_table():
|
||||
with open(os.path.join(DATADIR, 'reader', 'sharedStrings.xml')) as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'This is cell A1 in Sheet 1', 1: 'This is cell G5'}, string_table)
|
||||
|
||||
def test_empty_string():
|
||||
with open(os.path.join(DATADIR, 'reader', 'sharedStrings-emptystring.xml')) as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'Testing empty cell', 1:''}, string_table)
|
||||
|
||||
def test_formatted_string_table():
|
||||
with open(os.path.join(DATADIR, 'reader', 'shared-strings-rich.xml')) \
|
||||
as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'Welcome', 1: 'to the best shop in town',
|
||||
2: " let's play "}, string_table)
|
||||
@@ -1,181 +0,0 @@
|
||||
# file openpyxl/tests/test_style.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
import os.path
|
||||
import datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, assert_false, ok_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content, get_xml
|
||||
from openpyxl.reader.style import read_style_table
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.style import NumberFormat
|
||||
from openpyxl.writer.styles import StyleWriter
|
||||
from openpyxl.style import NumberFormat, Border, Color
|
||||
|
||||
|
||||
class TestCreateStyle(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
now = datetime.datetime.now()
|
||||
cls.workbook = Workbook()
|
||||
cls.worksheet = cls.workbook.create_sheet()
|
||||
cls.worksheet.cell(coordinate = 'A1').value = '12.34%'
|
||||
cls.worksheet.cell(coordinate = 'B4').value = now
|
||||
cls.worksheet.cell(coordinate = 'B5').value = now
|
||||
cls.worksheet.cell(coordinate = 'C14').value = u'This is a test'
|
||||
cls.worksheet.cell(coordinate = 'D9').value = '31.31415'
|
||||
cls.worksheet.cell(coordinate = 'D9').style.number_format.format_code = \
|
||||
NumberFormat.FORMAT_NUMBER_00
|
||||
cls.writer = StyleWriter(cls.workbook)
|
||||
|
||||
def test_create_style_table(self):
|
||||
eq_(3, len(self.writer.style_table))
|
||||
|
||||
def test_write_style_table(self):
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected', 'simple-styles.xml')
|
||||
assert_equals_file_content(reference_file, self.writer.write_table())
|
||||
|
||||
class TestStyleWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
self.workbook = Workbook()
|
||||
self.worksheet = self.workbook.create_sheet()
|
||||
|
||||
def test_no_style(self):
|
||||
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(0, len(w.style_table))
|
||||
|
||||
def test_nb_style(self):
|
||||
|
||||
for i in range(1, 6):
|
||||
self.worksheet.cell(row=1, column=i).style.font.size += i
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(5, len(w.style_table))
|
||||
|
||||
self.worksheet.cell('A10').style.borders.top = Border.BORDER_THIN
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(6, len(w.style_table))
|
||||
|
||||
def test_style_unicity(self):
|
||||
|
||||
for i in range(1, 6):
|
||||
self.worksheet.cell(row=1, column=i).style.font.bold = True
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(1, len(w.style_table))
|
||||
|
||||
def test_fonts(self):
|
||||
|
||||
self.worksheet.cell('A1').style.font.size = 12
|
||||
self.worksheet.cell('A1').style.font.bold = True
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_fonts()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="2"><font><sz val="11" /><color theme="1" /><name val="Calibri" /><family val="2" /><scheme val="minor" /></font><font><sz val="12" /><color rgb="FF000000" /><name val="Calibri" /><family val="2" /><scheme val="minor" /><b /></font></fonts></styleSheet>')
|
||||
|
||||
def test_fills(self):
|
||||
|
||||
self.worksheet.cell('A1').style.fill.fill_type = 'solid'
|
||||
self.worksheet.cell('A1').style.fill.start_color.index = Color.DARKYELLOW
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_fills()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fills count="3"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill><fill><patternFill patternType="solid"><fgColor rgb="FF808000" /></patternFill></fill></fills></styleSheet>')
|
||||
|
||||
def test_borders(self):
|
||||
|
||||
self.worksheet.cell('A1').style.borders.top.border_style = Border.BORDER_THIN
|
||||
self.worksheet.cell('A1').style.borders.top.color.index = Color.DARKYELLOW
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_borders()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><borders count="2"><border><left /><right /><top /><bottom /><diagonal /></border><border><left style="none"><color rgb="FF000000" /></left><right style="none"><color rgb="FF000000" /></right><top style="thin"><color rgb="FF808000" /></top><bottom style="none"><color rgb="FF000000" /></bottom><diagonal style="none"><color rgb="FF000000" /></diagonal></border></borders></styleSheet>')
|
||||
|
||||
def test_write_cell_xfs_1(self):
|
||||
|
||||
self.worksheet.cell('A1').style.font.size = 12
|
||||
w = StyleWriter(self.workbook)
|
||||
ft = w._write_fonts()
|
||||
nft = w._write_number_formats()
|
||||
w._write_cell_xfs(nft, ft, {}, {})
|
||||
xml = get_xml(w._root)
|
||||
ok_('applyFont="1"' in xml)
|
||||
ok_('applyFillId="1"' not in xml)
|
||||
ok_('applyBorder="1"' not in xml)
|
||||
ok_('applyAlignment="1"' not in xml)
|
||||
|
||||
def test_alignment(self):
|
||||
self.worksheet.cell('A1').style.alignment.horizontal = 'center'
|
||||
self.worksheet.cell('A1').style.alignment.vertical = 'center'
|
||||
w = StyleWriter(self.workbook)
|
||||
nft = w._write_number_formats()
|
||||
w._write_cell_xfs(nft,{},{},{})
|
||||
xml = get_xml(w._root)
|
||||
ok_('applyAlignment="1"' in xml)
|
||||
ok_('horizontal="center"' in xml)
|
||||
ok_('vertical="center"' in xml)
|
||||
|
||||
|
||||
#def test_format_comparisions():
|
||||
# format1 = NumberFormat()
|
||||
# format2 = NumberFormat()
|
||||
# format3 = NumberFormat()
|
||||
# format1.format_code = 'm/d/yyyy'
|
||||
# format2.format_code = 'm/d/yyyy'
|
||||
# format3.format_code = 'mm/dd/yyyy'
|
||||
# assert not format1 < format2
|
||||
# assert format1 < format3
|
||||
# assert format1 == format2
|
||||
# assert format1 != format3
|
||||
|
||||
|
||||
def test_builtin_format():
|
||||
format = NumberFormat()
|
||||
format.format_code = '0.00'
|
||||
eq_(format.builtin_format_code(2), format._format_code)
|
||||
|
||||
|
||||
def test_read_style():
|
||||
reference_file = os.path.join(DATADIR, 'reader', 'simple-styles.xml')
|
||||
with open(reference_file, 'r') as handle:
|
||||
content = handle.read()
|
||||
style_table = read_style_table(content)
|
||||
eq_(4, len(style_table))
|
||||
eq_(NumberFormat._BUILTIN_FORMATS[9],
|
||||
style_table[1].number_format.format_code)
|
||||
eq_('yyyy-mm-dd', style_table[2].number_format.format_code)
|
||||
|
||||
|
||||
def test_read_cell_style():
|
||||
reference_file = os.path.join(
|
||||
DATADIR, 'reader', 'empty-workbook-styles.xml')
|
||||
with open(reference_file, 'r') as handle:
|
||||
content = handle.read()
|
||||
style_table = read_style_table(content)
|
||||
eq_(2, len(style_table))
|
||||
@@ -1,37 +0,0 @@
|
||||
# file openpyxl/tests/test_theme.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
import os.path
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content
|
||||
from openpyxl.writer.theme import write_theme
|
||||
|
||||
|
||||
def test_write_theme():
|
||||
content = write_theme()
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'theme1.xml'), content)
|
||||
@@ -1,148 +0,0 @@
|
||||
# file openpyxl/tests/test_workbook.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, with_setup, raises
|
||||
import os.path as osp
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.namedrange import NamedRange
|
||||
from openpyxl.shared.exc import ReadOnlyWorkbookException
|
||||
from openpyxl.tests.helper import TMPDIR, clean_tmpdir, make_tmpdir
|
||||
|
||||
import datetime
|
||||
|
||||
def test_get_active_sheet():
|
||||
wb = Workbook()
|
||||
active_sheet = wb.get_active_sheet()
|
||||
eq_(active_sheet, wb.worksheets[0])
|
||||
|
||||
|
||||
def test_create_sheet():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
eq_(new_sheet, wb.worksheets[0])
|
||||
|
||||
|
||||
@raises(ReadOnlyWorkbookException)
|
||||
def test_create_sheet_readonly():
|
||||
wb = Workbook()
|
||||
wb._set_optimized_read()
|
||||
wb.create_sheet()
|
||||
|
||||
|
||||
def test_remove_sheet():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
wb.remove_sheet(new_sheet)
|
||||
assert new_sheet not in wb.worksheets
|
||||
|
||||
|
||||
def test_get_sheet_by_name():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
title = 'my sheet'
|
||||
new_sheet.title = title
|
||||
found_sheet = wb.get_sheet_by_name(title)
|
||||
eq_(new_sheet, found_sheet)
|
||||
|
||||
|
||||
def test_get_index():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
sheet_index = wb.get_index(new_sheet)
|
||||
eq_(sheet_index, 0)
|
||||
|
||||
|
||||
def test_get_sheet_names():
|
||||
wb = Workbook()
|
||||
names = ['Sheet', 'Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5']
|
||||
for count in range(5):
|
||||
wb.create_sheet(0)
|
||||
actual_names = wb.get_sheet_names()
|
||||
eq_(sorted(actual_names), sorted(names))
|
||||
|
||||
|
||||
def test_get_named_ranges():
|
||||
wb = Workbook()
|
||||
eq_(wb.get_named_ranges(), wb._named_ranges)
|
||||
|
||||
|
||||
def test_add_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
named_ranges_list = wb.get_named_ranges()
|
||||
assert named_range in named_ranges_list
|
||||
|
||||
|
||||
def test_get_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
found_named_range = wb.get_named_range('test_nr')
|
||||
eq_(named_range, found_named_range)
|
||||
|
||||
|
||||
def test_remove_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
wb.remove_named_range(named_range)
|
||||
named_ranges_list = wb.get_named_ranges()
|
||||
assert named_range not in named_ranges_list
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_add_local_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
named_range.local_only = True
|
||||
wb.add_named_range(named_range)
|
||||
dest_filename = osp.join(TMPDIR, 'local_named_range_book.xlsx')
|
||||
wb.save(dest_filename)
|
||||
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_write_regular_date():
|
||||
|
||||
today = datetime.datetime(2010, 1, 18, 14, 15, 20, 1600)
|
||||
|
||||
book = Workbook()
|
||||
sheet = book.get_active_sheet()
|
||||
sheet.cell("A1").value = today
|
||||
dest_filename = osp.join(TMPDIR, 'date_read_write_issue.xlsx')
|
||||
book.save(dest_filename)
|
||||
|
||||
test_book = load_workbook(dest_filename)
|
||||
test_sheet = test_book.get_active_sheet()
|
||||
|
||||
eq_(test_sheet.cell("A1").value, today)
|
||||
|
||||
@@ -1,258 +0,0 @@
|
||||
# file openpyxl/tests/test_worksheet.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.worksheet import Worksheet, Relationship, flatten
|
||||
from openpyxl.cell import Cell
|
||||
from openpyxl.shared.exc import CellCoordinatesException, \
|
||||
SheetTitleException, InsufficientCoordinatesException, \
|
||||
NamedRangeException
|
||||
|
||||
|
||||
class TestWorksheet():
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.wb = Workbook()
|
||||
|
||||
def test_new_worksheet(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_(self.wb, ws._parent)
|
||||
|
||||
def test_new_sheet_name(self):
|
||||
self.wb.worksheets = []
|
||||
ws = Worksheet(self.wb, title = '')
|
||||
eq_(repr(ws), '<Worksheet "Sheet1">')
|
||||
|
||||
def test_get_cell(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell('A1')
|
||||
eq_(cell.get_coordinate(), 'A1')
|
||||
|
||||
@raises(SheetTitleException)
|
||||
def test_set_bad_title(self):
|
||||
Worksheet(self.wb, 'X' * 50)
|
||||
|
||||
def test_set_bad_title_character(self):
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '[')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, ']')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '*')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, ':')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '?')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '/')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '\\')
|
||||
|
||||
def test_worksheet_dimension(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_('A1:A1', ws.calculate_dimension())
|
||||
ws.cell('B12').value = 'AAA'
|
||||
eq_('A1:B12', ws.calculate_dimension())
|
||||
|
||||
def test_worksheet_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
xlrange = ws.range('A1:C4')
|
||||
assert isinstance(xlrange, tuple)
|
||||
eq_(4, len(xlrange))
|
||||
eq_(3, len(xlrange[0]))
|
||||
|
||||
def test_worksheet_named_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
self.wb.create_named_range('test_range', ws, 'C5')
|
||||
xlrange = ws.range('test_range')
|
||||
assert isinstance(xlrange, Cell)
|
||||
eq_(5, xlrange.row)
|
||||
|
||||
@raises(NamedRangeException)
|
||||
def test_bad_named_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.range('bad_range')
|
||||
|
||||
@raises(NamedRangeException)
|
||||
def test_named_range_wrong_sheet(self):
|
||||
ws1 = Worksheet(self.wb)
|
||||
ws2 = Worksheet(self.wb)
|
||||
self.wb.create_named_range('wrong_sheet_range', ws1, 'C5')
|
||||
ws2.range('wrong_sheet_range')
|
||||
|
||||
def test_cell_offset(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_('C17', ws.cell('B15').offset(2, 1).get_coordinate())
|
||||
|
||||
def test_range_offset(self):
|
||||
ws = Worksheet(self.wb)
|
||||
xlrange = ws.range('A1:C4', 1, 3)
|
||||
assert isinstance(xlrange, tuple)
|
||||
eq_(4, len(xlrange))
|
||||
eq_(3, len(xlrange[0]))
|
||||
eq_('D2', xlrange[0][0].get_coordinate())
|
||||
|
||||
def test_cell_alternate_coordinates(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell(row = 8, column = 4)
|
||||
eq_('E9', cell.get_coordinate())
|
||||
|
||||
@raises(InsufficientCoordinatesException)
|
||||
def test_cell_insufficient_coordinates(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell(row = 8)
|
||||
|
||||
def test_cell_range_name(self):
|
||||
ws = Worksheet(self.wb)
|
||||
self.wb.create_named_range('test_range_single', ws, 'B12')
|
||||
assert_raises(CellCoordinatesException, ws.cell, 'test_range_single')
|
||||
c_range_name = ws.range('test_range_single')
|
||||
c_range_coord = ws.range('B12')
|
||||
c_cell = ws.cell('B12')
|
||||
eq_(c_range_coord, c_range_name)
|
||||
eq_(c_range_coord, c_cell)
|
||||
|
||||
def test_garbage_collect(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.cell('A1').value = ''
|
||||
ws.cell('B2').value = '0'
|
||||
ws.cell('C4').value = 0
|
||||
ws.garbage_collect()
|
||||
eq_(ws.get_cell_collection(), [ws.cell('B2'), ws.cell('C4')])
|
||||
|
||||
def test_hyperlink_relationships(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_(len(ws.relationships), 0)
|
||||
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
eq_(len(ws.relationships), 1)
|
||||
eq_("rId1", ws.cell('A1').hyperlink_rel_id)
|
||||
eq_("rId1", ws.relationships[0].id)
|
||||
eq_("http://test.com", ws.relationships[0].target)
|
||||
eq_("External", ws.relationships[0].target_mode)
|
||||
|
||||
ws.cell('A2').hyperlink = "http://test2.com"
|
||||
eq_(len(ws.relationships), 2)
|
||||
eq_("rId2", ws.cell('A2').hyperlink_rel_id)
|
||||
eq_("rId2", ws.relationships[1].id)
|
||||
eq_("http://test2.com", ws.relationships[1].target)
|
||||
eq_("External", ws.relationships[1].target_mode)
|
||||
|
||||
@raises(ValueError)
|
||||
def test_bad_relationship_type(self):
|
||||
rel = Relationship('bad_type')
|
||||
|
||||
def test_append_list(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append(['This is A1', 'This is B1'])
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is B1', ws.cell('B1').value)
|
||||
|
||||
def test_append_dict_letter(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append({'A' : 'This is A1', 'C' : 'This is C1'})
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is C1', ws.cell('C1').value)
|
||||
|
||||
def test_append_dict_index(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append({0 : 'This is A1', 2 : 'This is C1'})
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is C1', ws.cell('C1').value)
|
||||
|
||||
@raises(TypeError)
|
||||
def test_bad_append(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.append("test")
|
||||
|
||||
def test_append_2d_list(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append(['This is A1', 'This is B1'])
|
||||
ws.append(['This is A2', 'This is B2'])
|
||||
|
||||
vals = ws.range('A1:B2')
|
||||
|
||||
eq_((('This is A1', 'This is B1'),
|
||||
('This is A2', 'This is B2'),), flatten(vals))
|
||||
|
||||
def test_rows(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.cell('A1').value = 'first'
|
||||
ws.cell('C9').value = 'last'
|
||||
|
||||
rows = ws.rows
|
||||
|
||||
eq_(len(rows), 9)
|
||||
|
||||
eq_(rows[0][0].value, 'first')
|
||||
eq_(rows[-1][-1].value, 'last')
|
||||
|
||||
def test_cols(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.cell('A1').value = 'first'
|
||||
ws.cell('C9').value = 'last'
|
||||
|
||||
cols = ws.columns
|
||||
|
||||
eq_(len(cols), 3)
|
||||
|
||||
eq_(cols[0][0].value, 'first')
|
||||
eq_(cols[-1][-1].value, 'last')
|
||||
|
||||
def test_auto_filter(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.auto_filter = ws.range('a1:f1')
|
||||
assert ws.auto_filter == 'A1:F1'
|
||||
|
||||
ws.auto_filter = ''
|
||||
assert ws.auto_filter is None
|
||||
|
||||
ws.auto_filter = 'c1:g9'
|
||||
assert ws.auto_filter == 'C1:G9'
|
||||
|
||||
def test_freeze(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.freeze_panes = ws.cell('b2')
|
||||
assert ws.freeze_panes == 'B2'
|
||||
|
||||
ws.freeze_panes = ''
|
||||
assert ws.freeze_panes is None
|
||||
|
||||
ws.freeze_panes = 'c5'
|
||||
assert ws.freeze_panes == 'C5'
|
||||
|
||||
ws.freeze_panes = ws.cell('A1')
|
||||
assert ws.freeze_panes is None
|
||||
|
||||
@@ -1,203 +0,0 @@
|
||||
# file openpyxl/tests/test_write.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from __future__ import with_statement
|
||||
from StringIO import StringIO
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, with_setup, raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import TMPDIR, DATADIR, \
|
||||
assert_equals_file_content, clean_tmpdir, make_tmpdir
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.writer.excel import save_workbook, save_virtual_workbook, \
|
||||
ExcelWriter
|
||||
from openpyxl.writer.workbook import write_workbook, write_workbook_rels
|
||||
from openpyxl.writer.worksheet import write_worksheet, write_worksheet_rels
|
||||
from openpyxl.writer.strings import write_string_table
|
||||
from openpyxl.writer.styles import StyleWriter
|
||||
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_write_empty_workbook():
|
||||
wb = Workbook()
|
||||
dest_filename = os.path.join(TMPDIR, 'empty_book.xlsx')
|
||||
save_workbook(wb, dest_filename)
|
||||
assert os.path.isfile(dest_filename)
|
||||
|
||||
|
||||
def test_write_virtual_workbook():
|
||||
old_wb = Workbook()
|
||||
saved_wb = save_virtual_workbook(old_wb)
|
||||
new_wb = load_workbook(StringIO(saved_wb))
|
||||
assert new_wb
|
||||
|
||||
|
||||
def test_write_workbook_rels():
|
||||
wb = Workbook()
|
||||
content = write_workbook_rels(wb)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'workbook.xml.rels'), content)
|
||||
|
||||
|
||||
def test_write_workbook():
|
||||
wb = Workbook()
|
||||
content = write_workbook(wb)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'workbook.xml'), content)
|
||||
|
||||
|
||||
def test_write_string_table():
|
||||
table = {'hello': 1, 'world': 2, 'nice': 3}
|
||||
content = write_string_table(table)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sharedStrings.xml'), content)
|
||||
|
||||
|
||||
def test_write_worksheet():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1.xml'), content)
|
||||
|
||||
|
||||
def test_write_hidden_worksheet():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.sheet_state = ws.SHEETSTATE_HIDDEN
|
||||
ws.cell('F42').value = 'hello'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1.xml'), content)
|
||||
|
||||
|
||||
def test_write_formula():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = 10
|
||||
ws.cell('F2').value = 32
|
||||
ws.cell('F3').value = '=F1+F2'
|
||||
content = write_worksheet(ws, {}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_formula.xml'), content)
|
||||
|
||||
|
||||
def test_write_style():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = '13%'
|
||||
style_id_by_hash = StyleWriter(wb).get_style_by_hash()
|
||||
content = write_worksheet(ws, {}, style_id_by_hash)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_style.xml'), content)
|
||||
|
||||
|
||||
def test_write_height():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = 10
|
||||
ws.row_dimensions[ws.cell('F1').row].height = 30
|
||||
content = write_worksheet(ws, {}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_height.xml'), content)
|
||||
|
||||
|
||||
def test_write_hyperlink():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('A1').value = "test"
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
content = write_worksheet(ws, {'test': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_hyperlink.xml'), content)
|
||||
|
||||
|
||||
def test_write_hyperlink_rels():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
eq_(0, len(ws.relationships))
|
||||
ws.cell('A1').value = "test"
|
||||
ws.cell('A1').hyperlink = "http://test.com/"
|
||||
eq_(1, len(ws.relationships))
|
||||
ws.cell('A2').value = "test"
|
||||
ws.cell('A2').hyperlink = "http://test2.com/"
|
||||
eq_(2, len(ws.relationships))
|
||||
content = write_worksheet_rels(ws, 1)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_hyperlink.xml.rels'), content)
|
||||
|
||||
|
||||
def test_hyperlink_value():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
eq_("http://test.com", ws.cell('A1').value)
|
||||
ws.cell('A1').value = "test"
|
||||
eq_("test", ws.cell('A1').value)
|
||||
|
||||
def test_write_auto_filter():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.auto_filter = 'A1:F1'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_auto_filter.xml'), content)
|
||||
|
||||
def test_freeze_panes_horiz():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'A4'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_horiz.xml'), content)
|
||||
|
||||
def test_freeze_panes_vert():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'D1'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_vert.xml'), content)
|
||||
pass
|
||||
|
||||
def test_freeze_panes_both():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'D4'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_both.xml'), content)
|
||||
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
# file openpyxl/tests/__init__.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
@@ -1,94 +0,0 @@
|
||||
# file openpyxl/tests/helper.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os
|
||||
import os.path
|
||||
import shutil
|
||||
import difflib
|
||||
from io import StringIO
|
||||
from pprint import pprint
|
||||
from tempfile import gettempdir
|
||||
|
||||
# package imports
|
||||
from openpyxl.shared.xmltools import fromstring, ElementTree
|
||||
from openpyxl.shared.xmltools import pretty_indent
|
||||
|
||||
# constants
|
||||
DATADIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test_data'))
|
||||
TMPDIR = os.path.join(gettempdir(), 'openpyxl_test_temp')
|
||||
|
||||
|
||||
def make_tmpdir():
|
||||
try:
|
||||
os.makedirs(TMPDIR)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def clean_tmpdir():
|
||||
if os.path.isdir(TMPDIR):
|
||||
shutil.rmtree(TMPDIR, ignore_errors = True)
|
||||
|
||||
|
||||
def assert_equals_file_content(reference_file, fixture, filetype = 'xml'):
|
||||
if os.path.isfile(fixture):
|
||||
with open(fixture) as fixture_file:
|
||||
fixture_content = fixture_file.read()
|
||||
else:
|
||||
fixture_content = fixture
|
||||
|
||||
with open(reference_file) as expected_file:
|
||||
expected_content = expected_file.read()
|
||||
|
||||
if filetype == 'xml':
|
||||
fixture_content = fromstring(fixture_content)
|
||||
pretty_indent(fixture_content)
|
||||
temp = StringIO()
|
||||
ElementTree(fixture_content).write(temp)
|
||||
fixture_content = temp.getvalue()
|
||||
|
||||
expected_content = fromstring(expected_content)
|
||||
pretty_indent(expected_content)
|
||||
temp = StringIO()
|
||||
ElementTree(expected_content).write(temp)
|
||||
expected_content = temp.getvalue()
|
||||
|
||||
fixture_lines = fixture_content.split('\n')
|
||||
expected_lines = expected_content.split('\n')
|
||||
differences = list(difflib.unified_diff(expected_lines, fixture_lines))
|
||||
if differences:
|
||||
temp = StringIO()
|
||||
pprint(differences, stream = temp)
|
||||
assert False, 'Differences found : %s' % temp.getvalue()
|
||||
|
||||
def get_xml(xml_node):
|
||||
|
||||
io = StringIO()
|
||||
ElementTree(xml_node).write(io, encoding = 'UTF-8')
|
||||
ret = io.getvalue()
|
||||
io.close()
|
||||
return ret.replace('\n', '')
|
||||
@@ -1,200 +0,0 @@
|
||||
# file openpyxl/tests/test_cell.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from datetime import time, datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.shared.exc import ColumnStringIndexException, \
|
||||
CellCoordinatesException, DataTypeException
|
||||
from openpyxl.cell import column_index_from_string, \
|
||||
coordinate_from_string, get_column_letter, Cell, absolute_coordinate
|
||||
|
||||
|
||||
def test_coordinates():
|
||||
column, row = coordinate_from_string('ZF46')
|
||||
eq_("ZF", column)
|
||||
eq_(46, row)
|
||||
|
||||
|
||||
@raises(CellCoordinatesException)
|
||||
def test_invalid_coordinate():
|
||||
coordinate_from_string('AAA')
|
||||
|
||||
|
||||
def test_absolute():
|
||||
eq_('$ZF$51', absolute_coordinate('ZF51'))
|
||||
|
||||
def test_absolute_multiple():
|
||||
|
||||
eq_('$ZF$51:$ZF$53', absolute_coordinate('ZF51:ZF$53'))
|
||||
|
||||
|
||||
def test_column_index():
|
||||
eq_(10, column_index_from_string('J'))
|
||||
eq_(270, column_index_from_string('jJ'))
|
||||
eq_(7030, column_index_from_string('jjj'))
|
||||
|
||||
|
||||
def test_bad_column_index():
|
||||
|
||||
@raises(ColumnStringIndexException)
|
||||
def _check(bad_string):
|
||||
column_index_from_string(bad_string)
|
||||
|
||||
bad_strings = ('JJJJ', '', '$', '1',)
|
||||
for bad_string in bad_strings:
|
||||
yield _check, bad_string
|
||||
|
||||
|
||||
def test_column_letter_boundries():
|
||||
assert_raises(ColumnStringIndexException, get_column_letter, 0)
|
||||
assert_raises(ColumnStringIndexException, get_column_letter, 18279)
|
||||
|
||||
|
||||
def test_column_letter():
|
||||
eq_('ZZZ', get_column_letter(18278))
|
||||
eq_('JJJ', get_column_letter(7030))
|
||||
eq_('AB', get_column_letter(28))
|
||||
eq_('AA', get_column_letter(27))
|
||||
eq_('Z', get_column_letter(26))
|
||||
|
||||
|
||||
def test_initial_value():
|
||||
cell = Cell(None, 'A', 1, value = '17.5')
|
||||
eq_(cell.TYPE_NUMERIC, cell.data_type)
|
||||
|
||||
|
||||
class TestCellValueTypes():
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.cell = Cell(None, 'A', 1)
|
||||
|
||||
def test_1st(self):
|
||||
eq_(self.cell.TYPE_NULL, self.cell.data_type)
|
||||
|
||||
def test_null(self):
|
||||
self.cell.value = None
|
||||
eq_(self.cell.TYPE_NULL, self.cell.data_type)
|
||||
|
||||
def test_numeric(self):
|
||||
|
||||
def check_numeric(value):
|
||||
self.cell.value = value
|
||||
eq_(self.cell.TYPE_NUMERIC, self.cell.data_type)
|
||||
|
||||
values = (42, '4.2', '-42.000', '0', 0, 0.0001, '0.9999', '99E-02')
|
||||
for value in values:
|
||||
yield check_numeric, value
|
||||
|
||||
def test_string(self):
|
||||
self.cell.value = 'hello'
|
||||
eq_(self.cell.TYPE_STRING, self.cell.data_type)
|
||||
|
||||
def test_formula(self):
|
||||
self.cell.value = '=42'
|
||||
eq_(self.cell.TYPE_FORMULA, self.cell.data_type)
|
||||
|
||||
def test_boolean(self):
|
||||
self.cell.value = True
|
||||
eq_(self.cell.TYPE_BOOL, self.cell.data_type)
|
||||
self.cell.value = False
|
||||
eq_(self.cell.TYPE_BOOL, self.cell.data_type)
|
||||
|
||||
def test_error_codes(self):
|
||||
|
||||
def check_error():
|
||||
eq_(self.cell.TYPE_ERROR, self.cell.data_type)
|
||||
|
||||
for error_string in list(self.cell.ERROR_CODES.keys()):
|
||||
self.cell.value = error_string
|
||||
yield check_error
|
||||
|
||||
|
||||
def test_data_type_check():
|
||||
cell = Cell(None, 'A', 1)
|
||||
cell.bind_value(None)
|
||||
eq_(Cell.TYPE_NULL, cell._data_type)
|
||||
|
||||
cell.bind_value('.0e000')
|
||||
eq_(Cell.TYPE_NUMERIC, cell._data_type)
|
||||
|
||||
cell.bind_value('-0.e-0')
|
||||
eq_(Cell.TYPE_NUMERIC, cell._data_type)
|
||||
|
||||
cell.bind_value('1E')
|
||||
eq_(Cell.TYPE_STRING, cell._data_type)
|
||||
|
||||
@raises(DataTypeException)
|
||||
def test_set_bad_type():
|
||||
cell = Cell(None, 'A', 1)
|
||||
cell.set_value_explicit(1, 'q')
|
||||
|
||||
|
||||
def test_time():
|
||||
|
||||
def check_time(raw_value, coerced_value):
|
||||
cell.value = raw_value
|
||||
eq_(cell.value, coerced_value)
|
||||
eq_(cell.TYPE_NUMERIC, cell.data_type)
|
||||
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
values = (('03:40:16', time(3, 40, 16)), ('03:40', time(3, 40)),)
|
||||
for raw_value, coerced_value in values:
|
||||
yield check_time, raw_value, coerced_value
|
||||
|
||||
|
||||
def test_date_format_on_non_date():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
cell.value = datetime.now()
|
||||
cell.value = 'testme'
|
||||
eq_('testme', cell.value)
|
||||
|
||||
|
||||
def test_repr():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
eq_(repr(cell), '<Cell Sheet1.A1>', 'Got bad repr: %s' % repr(cell))
|
||||
|
||||
def test_is_date():
|
||||
wb = Workbook()
|
||||
ws = Worksheet(wb)
|
||||
cell = Cell(ws, 'A', 1)
|
||||
cell.value = datetime.now()
|
||||
eq_(cell.is_date(), True)
|
||||
cell.value = 'testme'
|
||||
eq_('testme', cell.value)
|
||||
eq_(cell.is_date(), False)
|
||||
@@ -1,131 +0,0 @@
|
||||
# file openpyxl/tests/test_chart.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
from nose.tools import eq_
|
||||
|
||||
from openpyxl.tests.helper import get_xml
|
||||
from openpyxl.shared.xmltools import Element
|
||||
from openpyxl.writer.charts import ChartWriter
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.chart import BarChart, ScatterChart, Serie, Reference
|
||||
from openpyxl.style import Color
|
||||
|
||||
class TestChartWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.get_active_sheet()
|
||||
ws.title = 'data'
|
||||
for i in range(10):
|
||||
ws.cell(row = i, column = 0).value = i
|
||||
self.chart = BarChart()
|
||||
self.chart.title = 'TITLE'
|
||||
self.chart.add_serie(Serie(Reference(ws, (0, 0), (10, 0))))
|
||||
self.chart._series[-1].color = Color.GREEN
|
||||
self.cw = ChartWriter(self.chart)
|
||||
self.root = Element('test')
|
||||
|
||||
def test_write_title(self):
|
||||
self.cw._write_title(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:title><c:tx><c:rich><a:bodyPr /><a:lstStyle /><a:p><a:pPr><a:defRPr /></a:pPr><a:r><a:rPr lang="fr-FR" /><a:t>TITLE</a:t></a:r></a:p></c:rich></c:tx><c:layout /></c:title></test>')
|
||||
|
||||
def test_write_xaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.chart.x_axis, 'c:catAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:catAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /></c:scaling><c:axPos val="b" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /></c:catAx></test>')
|
||||
|
||||
def test_write_yaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.chart.y_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="between" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
def test_write_series(self):
|
||||
|
||||
self.cw._write_series(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:ser><c:idx val="0" /><c:order val="0" /><c:spPr><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill><a:ln><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill></a:ln></c:spPr><c:marker><c:symbol val="none" /></c:marker><c:val><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:val></c:ser></test>')
|
||||
|
||||
def test_write_legend(self):
|
||||
|
||||
self.cw._write_legend(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:legend><c:legendPos val="r" /><c:layout /></c:legend></test>')
|
||||
|
||||
def test_write_print_settings(self):
|
||||
|
||||
self.cw._write_print_settings(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:printSettings><c:headerFooter /><c:pageMargins b="0.75" footer="0.3" header="0.3" l="0.7" r="0.7" t="0.75" /><c:pageSetup /></c:printSettings></test>')
|
||||
|
||||
def test_write_chart(self):
|
||||
|
||||
self.cw._write_chart(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:chart><c:title><c:tx><c:rich><a:bodyPr /><a:lstStyle /><a:p><a:pPr><a:defRPr /></a:pPr><a:r><a:rPr lang="fr-FR" /><a:t>TITLE</a:t></a:r></a:p></c:rich></c:tx><c:layout /></c:title><c:plotArea><c:layout><c:manualLayout><c:layoutTarget val="inner" /><c:xMode val="edge" /><c:yMode val="edge" /><c:x val="1.28571428571" /><c:y val="0.2125" /><c:w val="0.6" /><c:h val="0.6" /></c:manualLayout></c:layout><c:barChart><c:barDir val="col" /><c:grouping val="clustered" /><c:ser><c:idx val="0" /><c:order val="0" /><c:spPr><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill><a:ln><a:solidFill><a:srgbClr val="00FF00" /></a:solidFill></a:ln></c:spPr><c:marker><c:symbol val="none" /></c:marker><c:val><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:val></c:ser><c:marker val="1" /><c:axId val="60871424" /><c:axId val="60873344" /></c:barChart><c:catAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /></c:scaling><c:axPos val="b" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /></c:catAx><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="between" /><c:majorUnit val="2.0" /></c:valAx></c:plotArea><c:legend><c:legendPos val="r" /><c:layout /></c:legend><c:plotVisOnly val="1" /></c:chart></test>')
|
||||
|
||||
|
||||
class TestScatterChartWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.get_active_sheet()
|
||||
ws.title = 'data'
|
||||
for i in range(10):
|
||||
ws.cell(row = i, column = 0).value = i
|
||||
ws.cell(row = i, column = 1).value = i
|
||||
self.scatterchart = ScatterChart()
|
||||
self.scatterchart.add_serie(Serie(Reference(ws, (0, 0), (10, 0)),
|
||||
xvalues = Reference(ws, (0, 1), (10, 1))))
|
||||
self.cw = ChartWriter(self.scatterchart)
|
||||
self.root = Element('test')
|
||||
|
||||
def test_write_xaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.scatterchart.x_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="b" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
|
||||
def test_write_yaxis(self):
|
||||
|
||||
self.cw._write_axis(self.root, self.scatterchart.y_axis, 'c:valAx')
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></test>')
|
||||
|
||||
def test_write_series(self):
|
||||
|
||||
self.cw._write_series(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:ser><c:idx val="0" /><c:order val="0" /><c:marker><c:symbol val="none" /></c:marker><c:xVal><c:numRef><c:f>data!$B$1:$B$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:xVal><c:yVal><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:yVal></c:ser></test>')
|
||||
|
||||
def test_write_legend(self):
|
||||
|
||||
self.cw._write_legend(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:legend><c:legendPos val="r" /><c:layout /></c:legend></test>')
|
||||
|
||||
def test_write_print_settings(self):
|
||||
|
||||
self.cw._write_print_settings(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:printSettings><c:headerFooter /><c:pageMargins b="0.75" footer="0.3" header="0.3" l="0.7" r="0.7" t="0.75" /><c:pageSetup /></c:printSettings></test>')
|
||||
|
||||
def test_write_chart(self):
|
||||
|
||||
self.cw._write_chart(self.root)
|
||||
eq_(get_xml(self.root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><test><c:chart><c:plotArea><c:layout><c:manualLayout><c:layoutTarget val="inner" /><c:xMode val="edge" /><c:yMode val="edge" /><c:x val="1.28571428571" /><c:y val="0.2125" /><c:w val="0.6" /><c:h val="0.6" /></c:manualLayout></c:layout><c:scatterChart><c:scatterStyle val="lineMarker" /><c:ser><c:idx val="0" /><c:order val="0" /><c:marker><c:symbol val="none" /></c:marker><c:xVal><c:numRef><c:f>data!$B$1:$B$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:xVal><c:yVal><c:numRef><c:f>data!$A$1:$A$11</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="11" /><c:pt idx="0"><c:v>0</c:v></c:pt><c:pt idx="1"><c:v>1</c:v></c:pt><c:pt idx="2"><c:v>2</c:v></c:pt><c:pt idx="3"><c:v>3</c:v></c:pt><c:pt idx="4"><c:v>4</c:v></c:pt><c:pt idx="5"><c:v>5</c:v></c:pt><c:pt idx="6"><c:v>6</c:v></c:pt><c:pt idx="7"><c:v>7</c:v></c:pt><c:pt idx="8"><c:v>8</c:v></c:pt><c:pt idx="9"><c:v>9</c:v></c:pt><c:pt idx="10"><c:v>None</c:v></c:pt></c:numCache></c:numRef></c:yVal></c:ser><c:marker val="1" /><c:axId val="60871424" /><c:axId val="60873344" /></c:scatterChart><c:valAx><c:axId val="60871424" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="b" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60873344" /><c:crosses val="autoZero" /><c:auto val="1" /><c:lblAlgn val="ctr" /><c:lblOffset val="100" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx><c:valAx><c:axId val="60873344" /><c:scaling><c:orientation val="minMax" /><c:max val="10.0" /><c:min val="0" /></c:scaling><c:axPos val="l" /><c:majorGridlines /><c:numFmt formatCode="General" sourceLinked="1" /><c:tickLblPos val="nextTo" /><c:crossAx val="60871424" /><c:crosses val="autoZero" /><c:crossBetween val="midCat" /><c:majorUnit val="2.0" /></c:valAx></c:plotArea><c:legend><c:legendPos val="r" /><c:layout /></c:legend><c:plotVisOnly val="1" /></c:chart></test>')
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
|
||||
<DocSecurity>0</DocSecurity>
|
||||
<ScaleCrop>false</ScaleCrop>
|
||||
<HeadingPairs>
|
||||
<vt:vector size="4" baseType="variant">
|
||||
<vt:variant>
|
||||
<vt:lpstr>Worksheets</vt:lpstr>
|
||||
</vt:variant>
|
||||
<vt:variant>
|
||||
<vt:i4>7</vt:i4>
|
||||
</vt:variant>
|
||||
<vt:variant>
|
||||
<vt:lpstr>Named Ranges</vt:lpstr>
|
||||
</vt:variant>
|
||||
<vt:variant>
|
||||
<vt:i4>7</vt:i4>
|
||||
</vt:variant>
|
||||
</vt:vector>
|
||||
</HeadingPairs>
|
||||
<TitlesOfParts>
|
||||
<vt:vector size="14" baseType="lpstr">
|
||||
<vt:lpstr>ToC</vt:lpstr>
|
||||
<vt:lpstr>ContractYear</vt:lpstr>
|
||||
<vt:lpstr>ContractTier</vt:lpstr>
|
||||
<vt:lpstr>Demand</vt:lpstr>
|
||||
<vt:lpstr>LinearizedFunction</vt:lpstr>
|
||||
<vt:lpstr>Market</vt:lpstr>
|
||||
<vt:lpstr>Transmission</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_10</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_12</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_13</vt:lpstr>
|
||||
<vt:lpstr>TS_discount_rate!Excel_BuiltIn_Print_Area_26</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_27</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_28</vt:lpstr>
|
||||
<vt:lpstr>Excel_BuiltIn_Print_Area_29</vt:lpstr>
|
||||
</vt:vector>
|
||||
</TitlesOfParts>
|
||||
<LinksUpToDate>false</LinksUpToDate>
|
||||
<SharedDoc>false</SharedDoc>
|
||||
<HyperlinksChanged>false</HyperlinksChanged>
|
||||
<AppVersion>12.0000</AppVersion>
|
||||
</Properties>
|
||||
@@ -1,53 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
||||
<fonts count="2">
|
||||
<font>
|
||||
<sz val="11" />
|
||||
<color theme="1" />
|
||||
<name val="Calibri" />
|
||||
<family val="2" />
|
||||
<scheme val="minor" />
|
||||
</font>
|
||||
<font>
|
||||
<sz val="11" />
|
||||
<color theme="1" />
|
||||
<name val="Calibri" />
|
||||
<family val="2" />
|
||||
<scheme val="minor" />
|
||||
</font>
|
||||
</fonts>
|
||||
<fills count="2">
|
||||
<fill>
|
||||
<patternFill patternType="none" />
|
||||
</fill>
|
||||
<fill>
|
||||
<patternFill patternType="gray125" />
|
||||
</fill>
|
||||
</fills>
|
||||
<borders count="1">
|
||||
<border>
|
||||
<left />
|
||||
<right />
|
||||
<top />
|
||||
<bottom />
|
||||
<diagonal />
|
||||
</border>
|
||||
</borders>
|
||||
<cellStyleXfs count="2">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />
|
||||
<xf numFmtId="9" fontId="1" fillId="0" borderId="0" applyFont="0"
|
||||
applyFill="0" applyBorder="0" applyAlignment="0" applyProtection="0" />
|
||||
</cellStyleXfs>
|
||||
<cellXfs count="2">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" />
|
||||
<xf numFmtId="9" fontId="0" fillId="0" borderId="0" xfId="1"
|
||||
applyFont="1" />
|
||||
</cellXfs>
|
||||
<cellStyles count="2">
|
||||
<cellStyle name="Normal" xfId="0" builtinId="0" />
|
||||
<cellStyle name="Percent" xfId="1" builtinId="5" />
|
||||
</cellStyles>
|
||||
<dxfs count="0" />
|
||||
<tableStyles count="0" defaultTableStyle="TableStyleMedium9"
|
||||
defaultPivotStyle="PivotStyleLight16" />
|
||||
</styleSheet>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1:E15"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="B16" sqref="B16"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="15"/><sheetData><row r="1" spans="1:5"><c r="A1" s="3"><v>1</v></c><c r="B1" s="3"><v>2</v></c><c r="C1" s="3"><v>3</v></c><c r="D1" s="3"><v>4</v></c></row><row r="3" spans="1:5"><c r="A3" s="2" t="s"><v>0</v></c><c r="B3" t="s"><v>1</v></c><c r="C3" s="2" t="s"><v>2</v></c><c r="D3" s="2" t="s"><v>3</v></c></row><row r="5" spans="1:5"><c r="C5" s="1" t="s"><v>4</v></c><c r="E5" s="1" t="s"><v>6</v></c></row><row r="6" spans="1:5"><c r="C6" s="1" t="s"><v>4</v></c><c r="E6" s="1" t="s"><v>6</v></c></row><row r="7" spans="1:5"><c r="C7" s="1" t="s"><v>4</v></c><c r="E7" s="1" t="s"><v>6</v></c></row><row r="8" spans="1:5"><c r="D8" s="1" t="s"><v>5</v></c></row><row r="9" spans="1:5"><c r="C9" s="1" t="s"><v>4</v></c><c r="E9" s="1" t="s"><v>6</v></c></row><row r="10" spans="1:5"><c r="C10" s="1" t="s"><v>4</v></c><c r="E10" s="1" t="s"><v>6</v></c></row><row r="11" spans="1:5"><c r="C11" s="1" t="s"><v>4</v></c><c r="E11" s="1" t="s"><v>6</v></c></row><row r="15" spans="1:5"><c r="B15" s="4"><v>10</v></c><c r="C15" s="4"/><c r="D15" s="4"/></row></sheetData><mergeCells count="1"><mergeCell ref="B15:D15"/></mergeCells><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><pageSetup orientation="portrait" horizontalDpi="200" verticalDpi="200" r:id="rId1"/></worksheet>
|
||||
Binary file not shown.
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3">
|
||||
<si>
|
||||
<t>Welcome</t>
|
||||
</si>
|
||||
<si>
|
||||
<r>
|
||||
<t xml:space="preserve">to the best </t>
|
||||
</r><r>
|
||||
<rPr>
|
||||
<b/>
|
||||
<sz val="11"/>
|
||||
<color theme="1"/>
|
||||
<rFont val="Calibri"/>
|
||||
<family val="2"/>
|
||||
<scheme val="minor"/>
|
||||
</rPr><t xml:space="preserve">shop in </t>
|
||||
</r><r>
|
||||
<rPr>
|
||||
<b/>
|
||||
<u/>
|
||||
<sz val="11"/>
|
||||
<color theme="1"/>
|
||||
<rFont val="Calibri"/>
|
||||
<family val="2"/>
|
||||
<scheme val="minor"/>
|
||||
</rPr><t>town</t>
|
||||
</r>
|
||||
</si>
|
||||
<si>
|
||||
<t xml:space="preserve"> let's play </t>
|
||||
</si>
|
||||
</sst>
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<sst count="1" uniqueCount="1" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><si><t>Testing empty cell</t></si> <si><t/></si></sst>
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="2"><si><t>This is cell A1 in Sheet 1</t></si><si><t>This is cell G5</t></si></sst>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="D1:K30"/><sheetViews><sheetView workbookViewId="0"><selection activeCell="L2" sqref="L2"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="15"/><sheetData><row r="1" spans="4:11"><c r="D1"><v>1</v></c><c r="K1" s="1"><v>0.01</v></c></row><row r="2" spans="4:11"><c r="D2"><v>2</v></c><c r="K2" s="1"><v>0.02</v></c></row><row r="3" spans="4:11"><c r="D3"><v>3</v></c><c r="K3" s="1"><v>0.03</v></c></row><row r="4" spans="4:11"><c r="D4"><v>4</v></c><c r="K4" s="1"><v>0.04</v></c></row><row r="5" spans="4:11"><c r="D5"><v>5</v></c><c r="G5" t="s"><v>1</v></c><c r="K5" s="1"><v>0.05</v></c></row><row r="6" spans="4:11"><c r="D6"><v>6</v></c><c r="K6" s="1"><v>0.06</v></c></row><row r="7" spans="4:11"><c r="D7"><v>7</v></c><c r="K7" s="1"><v>7.0000000000000007E-2</v></c></row><row r="8" spans="4:11"><c r="D8"><v>8</v></c><c r="K8" s="1"><v>0.08</v></c></row><row r="9" spans="4:11"><c r="D9"><v>9</v></c><c r="K9" s="1"><v>0.09</v></c></row><row r="10" spans="4:11"><c r="D10"><v>10</v></c><c r="K10" s="1"><v>0.1</v></c></row><row r="11" spans="4:11"><c r="D11"><v>11</v></c><c r="K11" s="1"><v>0.11</v></c></row><row r="12" spans="4:11"><c r="D12"><v>12</v></c><c r="K12" s="1"><v>0.12</v></c></row><row r="13" spans="4:11"><c r="D13"><v>13</v></c><c r="K13" s="1"><v>0.13</v></c></row><row r="14" spans="4:11"><c r="D14"><v>14</v></c><c r="K14" s="1"><v>0.14000000000000001</v></c></row><row r="15" spans="4:11"><c r="D15"><v>15</v></c><c r="K15" s="1"><v>0.15</v></c></row><row r="16" spans="4:11"><c r="D16"><v>16</v></c><c r="K16" s="1"><v>0.16</v></c></row><row r="17" spans="4:11"><c r="D17"><v>17</v></c><c r="K17" s="1"><v>0.17</v></c></row><row r="18" spans="4:11"><c r="D18"><v>18</v></c><c r="K18" s="1"><v>0.18</v></c></row><row r="19" spans="4:11"><c r="D19"><v>19</v></c><c r="K19" s="1"><v>0.19</v></c></row><row r="20" spans="4:11"><c r="D20"><v>20</v></c><c r="K20" s="1"><v>0.2</v></c></row><row r="21" spans="4:11"><c r="D21"><v>21</v></c><c r="K21" s="1"><v>0.21</v></c></row><row r="22" spans="4:11"><c r="D22"><v>22</v></c><c r="K22" s="1"><v>0.22</v></c></row><row r="23" spans="4:11"><c r="D23"><v>23</v></c><c r="K23" s="1"><v>0.23</v></c></row><row r="24" spans="4:11"><c r="D24"><v>24</v></c><c r="K24" s="1"><v>0.24</v></c></row><row r="25" spans="4:11"><c r="D25"><v>25</v></c><c r="K25" s="1"><v>0.25</v></c></row><row r="26" spans="4:11"><c r="D26"><v>26</v></c><c r="K26" s="1"><v>0.26</v></c></row><row r="27" spans="4:11"><c r="D27"><v>27</v></c><c r="K27" s="1"><v>0.27</v></c></row><row r="28" spans="4:11"><c r="D28"><v>28</v></c><c r="K28" s="1"><v>0.28000000000000003</v></c></row><row r="29" spans="4:11"><c r="D29"><v>29</v></c><c r="K29" s="1"><v>0.28999999999999998</v></c></row><row r="30" spans="4:11"><c r="D30"><v>30</v></c><c r="K30" s="1"><v>0.3</v></c></row></sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>
|
||||
@@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
||||
<numFmts count="1">
|
||||
<numFmt numFmtId="165" formatCode="yyyy-mm-dd"/>
|
||||
</numFmts>
|
||||
<fonts count="1">
|
||||
<font>
|
||||
<sz val="11"/>
|
||||
<color theme="1"/>
|
||||
<name val="Calibri"/>
|
||||
<family val="2"/>
|
||||
<scheme val="minor"/>
|
||||
</font>
|
||||
</fonts>
|
||||
<fills count="2">
|
||||
<fill>
|
||||
<patternFill patternType="none"/>
|
||||
</fill>
|
||||
<fill>
|
||||
<patternFill patternType="gray125"/>
|
||||
</fill>
|
||||
</fills>
|
||||
<borders count="1">
|
||||
<border>
|
||||
<left/>
|
||||
<right/>
|
||||
<top/>
|
||||
<bottom/>
|
||||
<diagonal/>
|
||||
</border>
|
||||
</borders>
|
||||
<cellStyleXfs count="1">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
|
||||
</cellStyleXfs>
|
||||
<cellXfs count="4">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
|
||||
<xf numFmtId="9" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
<xf numFmtId="165" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
<xf numFmtId="2" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
</cellXfs>
|
||||
<cellStyles count="1">
|
||||
<cellStyle name="Normal" xfId="0" builtinId="0"/>
|
||||
</cellStyles>
|
||||
<dxfs count="0"/>
|
||||
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
|
||||
</styleSheet>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<workbook xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505" /><workbookPr codeName="ThisWorkbook" defaultThemeVersion="124226" /><bookViews><workbookView activeTab="0" autoFilterDateGrouping="1" firstSheet="0" minimized="0" showHorizontalScroll="1" showSheetTabs="1" showVerticalScroll="1" tabRatio="600" visibility="visible" /></bookViews><sheets><sheet name="My Sheeet" r:id="rId1" sheetId="1" /><sheet name="My Second Sheet" r:id="rId2" sheetId="2" /></sheets><definedNames><definedName name="THE_GREAT_ANSWER">'My Sheeet'!$D$8</definedName></definedNames><calcPr calcId="124519" calcMode="auto" fullCalcOnLoad="1" /></workbook>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Target="xl/workbook.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" /><Relationship Id="rId2" Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" /><Relationship Id="rId3" Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" /></Relationships>
|
||||
@@ -1,31 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
||||
<Override ContentType="application/vnd.openxmlformats-officedocument.theme+xml"
|
||||
PartName="/xl/theme/theme1.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
|
||||
PartName="/xl/styles.xml" />
|
||||
<Default ContentType="application/vnd.openxmlformats-package.relationships+xml"
|
||||
Extension="rels" />
|
||||
<Default ContentType="application/xml" Extension="xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"
|
||||
PartName="/xl/workbook.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"
|
||||
PartName="/docProps/app.xml" />
|
||||
<Override ContentType="application/vnd.openxmlformats-package.core-properties+xml"
|
||||
PartName="/docProps/core.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"
|
||||
PartName="/xl/sharedStrings.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
|
||||
PartName="/xl/worksheets/sheet1.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
|
||||
PartName="/xl/worksheets/sheet2.xml" />
|
||||
<Override
|
||||
ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
|
||||
PartName="/xl/worksheets/sheet3.xml" />
|
||||
</Types>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Application>Microsoft Excel</Application><DocSecurity>0</DocSecurity><ScaleCrop>false</ScaleCrop><Company /><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>12.0000</AppVersion><HeadingPairs><vt:vector baseType="variant" size="2"><vt:variant><vt:lpstr>Worksheets</vt:lpstr></vt:variant><vt:variant><vt:i4>3</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector baseType="lpstr" size="3"><vt:lpstr>Sheet</vt:lpstr><vt:lpstr>Sheet1</vt:lpstr><vt:lpstr>Sheet2</vt:lpstr></vt:vector></TitlesOfParts></Properties>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:creator>TEST_USER</dc:creator><cp:lastModifiedBy>SOMEBODY</cp:lastModifiedBy><dcterms:created xsi:type="dcterms:W3CDTF">2010-04-01T20:30:00Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2010-04-05T14:05:30Z</dcterms:modified></cp:coreProperties>
|
||||
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<fonts count="1">
|
||||
<font>
|
||||
<sz val="11"/>
|
||||
<color theme="1"/>
|
||||
<name val="Calibri"/>
|
||||
<family val="2"/>
|
||||
<scheme val="minor"/>
|
||||
</font>
|
||||
</fonts>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<sst uniqueCount="3" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><si><t>hello</t></si><si><t>world</t></si><si><t>nice</t></si></sst>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F42" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<selection activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="42" spans="1:6">
|
||||
<c r="F42" t="s">
|
||||
<v>0</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
@@ -1 +0,0 @@
|
||||
<worksheet xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetPr><outlinePr summaryRight="1" summaryBelow="1"></outlinePr></sheetPr><dimension ref="A1:F42"></dimension><sheetViews><sheetView workbookViewId="0"><selection sqref="A1" activeCell="A1"></selection></sheetView></sheetViews><sheetFormatPr defaultRowHeight="15"></sheetFormatPr><cols><col collapsed="0" min="6" max="6" width="9.10"></col></cols><sheetData><row spans="1:6" r="42"><c t="s" r="F42"><v>0</v></c></row></sheetData><autoFilter ref="A1:F1"></autoFilter></worksheet>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F3" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<selection activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="1" spans="1:6">
|
||||
<c r="F1" t="n">
|
||||
<v>10</v>
|
||||
</c>
|
||||
</row>
|
||||
<row r="2" spans="1:6">
|
||||
<c r="F2" t="n">
|
||||
<v>32</v>
|
||||
</c>
|
||||
</row>
|
||||
<row r="3" spans="1:6">
|
||||
<c r="F3" t="f">
|
||||
<f>F1+F2</f><v />
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F42" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<pane xSplit="3" ySplit="3" topLeftCell="D4" activePane="bottomRight" state="frozen" />
|
||||
<selection pane="topRight"/>
|
||||
<selection pane="bottomLeft"/>
|
||||
<selection pane="bottomRight" activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="42" spans="1:6">
|
||||
<c r="F42" t="s">
|
||||
<v>0</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F42" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<pane ySplit="3" topLeftCell="A4" activePane="bottomLeft" state="frozen"/>
|
||||
<selection pane="bottomLeft" activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="42" spans="1:6">
|
||||
<c r="F42" t="s">
|
||||
<v>0</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F42" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<pane xSplit="3" topLeftCell="D1" activePane="topRight" state="frozen"/>
|
||||
<selection pane="topRight" activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="42" spans="1:6">
|
||||
<c r="F42" t="s">
|
||||
<v>0</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:F1" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<selection activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="6" min="6" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="1" spans="1:6" customHeight="1" ht="30">
|
||||
<c r="F1" t="n">
|
||||
<v>10</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
</worksheet>
|
||||
@@ -1,27 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<worksheet xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
||||
<sheetPr>
|
||||
<outlinePr summaryBelow="1" summaryRight="1" />
|
||||
</sheetPr>
|
||||
<dimension ref="A1:A1" />
|
||||
<sheetViews>
|
||||
<sheetView workbookViewId="0">
|
||||
<selection activeCell="A1" sqref="A1" />
|
||||
</sheetView>
|
||||
</sheetViews>
|
||||
<sheetFormatPr defaultRowHeight="15" />
|
||||
<cols>
|
||||
<col collapsed="0" max="1" min="1" width="9.10" />
|
||||
</cols>
|
||||
<sheetData>
|
||||
<row r="1" spans="1:1">
|
||||
<c r="A1" t="s">
|
||||
<v>0</v>
|
||||
</c>
|
||||
</row>
|
||||
</sheetData>
|
||||
<hyperlinks>
|
||||
<hyperlink display="http://test.com" ref="A1" r:id='rId1'/>
|
||||
</hyperlinks>
|
||||
</worksheet>
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
||||
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="http://test.com/" TargetMode="External"/>
|
||||
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="http://test2.com/" TargetMode="External"/>
|
||||
</Relationships>
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<worksheet xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetPr><outlinePr summaryRight="1" summaryBelow="1"></outlinePr></sheetPr><dimension ref="A1:F1"></dimension><sheetViews><sheetView workbookViewId="0"><selection sqref="A1" activeCell="A1"></selection></sheetView></sheetViews><sheetFormatPr defaultRowHeight="15"></sheetFormatPr><cols><col collapsed="0" min="6" max="6" width="9.10"></col></cols><sheetData><row spans="1:6" r="1"><c t="n" s="1" r="F1"><v>0.13</v></c></row></sheetData></worksheet>
|
||||
@@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
||||
<numFmts count="1">
|
||||
<numFmt numFmtId="165" formatCode="yyyy-mm-dd"/>
|
||||
</numFmts>
|
||||
<fonts count="1">
|
||||
<font>
|
||||
<sz val="11"/>
|
||||
<color theme="1"/>
|
||||
<name val="Calibri"/>
|
||||
<family val="2"/>
|
||||
<scheme val="minor"/>
|
||||
</font>
|
||||
</fonts>
|
||||
<fills count="2">
|
||||
<fill>
|
||||
<patternFill patternType="none"/>
|
||||
</fill>
|
||||
<fill>
|
||||
<patternFill patternType="gray125"/>
|
||||
</fill>
|
||||
</fills>
|
||||
<borders count="1">
|
||||
<border>
|
||||
<left/>
|
||||
<right/>
|
||||
<top/>
|
||||
<bottom/>
|
||||
<diagonal/>
|
||||
</border>
|
||||
</borders>
|
||||
<cellStyleXfs count="1">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
|
||||
</cellStyleXfs>
|
||||
<cellXfs count="4">
|
||||
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
|
||||
<xf numFmtId="9" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
<xf numFmtId="165" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
<xf numFmtId="2" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
|
||||
</cellXfs>
|
||||
<cellStyles count="1">
|
||||
<cellStyle name="Normal" xfId="0" builtinId="0"/>
|
||||
</cellStyles>
|
||||
<dxfs count="0"/>
|
||||
<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/>
|
||||
</styleSheet>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="1"><font><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs><cellXfs count="2"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/><xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/></cellXfs><cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles><dxfs count="0"/><tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleLight16"/></styleSheet>
|
||||
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<workbook xml:space="preserve" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505" /><workbookPr codeName="ThisWorkbook" defaultThemeVersion="124226" /><bookViews><workbookView activeTab="0" autoFilterDateGrouping="1" firstSheet="0" minimized="0" showHorizontalScroll="1" showSheetTabs="1" showVerticalScroll="1" tabRatio="600" visibility="visible" /></bookViews><sheets><sheet name="Sheet" r:id="rId1" sheetId="1" /></sheets><definedNames /><calcPr calcId="124519" calcMode="auto" fullCalcOnLoad="1" /></workbook>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Target="worksheets/sheet1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" /><Relationship Id="rId2" Target="sharedStrings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" /><Relationship Id="rId3" Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" /><Relationship Id="rId4" Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" /></Relationships>
|
||||
@@ -1,109 +0,0 @@
|
||||
|
||||
# file openpyxl/tests/test_dump.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
from datetime import time, datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.cell import get_column_letter
|
||||
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
|
||||
from openpyxl.writer.strings import StringTableBuilder
|
||||
|
||||
from tempfile import NamedTemporaryFile
|
||||
import os
|
||||
import shutil
|
||||
|
||||
def test_dump_sheet():
|
||||
|
||||
test_file = NamedTemporaryFile(prefix='openpyxl.', suffix='.xlsx', delete=False)
|
||||
test_file.close()
|
||||
test_filename = test_file.name
|
||||
|
||||
wb = Workbook(optimized_write = True)
|
||||
|
||||
ws = wb.create_sheet()
|
||||
|
||||
letters = [get_column_letter(x+1) for x in range(20)]
|
||||
|
||||
expected_rows = []
|
||||
|
||||
for row in range(20):
|
||||
|
||||
expected_rows.append(['%s%d' % (letter, row+1) for letter in letters])
|
||||
|
||||
for row in range(20):
|
||||
|
||||
expected_rows.append([(row+1) for letter in letters])
|
||||
|
||||
for row in range(10):
|
||||
|
||||
expected_rows.append([datetime(2010, ((x % 12)+1), row+1) for x in range(len(letters))])
|
||||
|
||||
for row in range(20):
|
||||
|
||||
expected_rows.append(['=%s%d' % (letter, row+1) for letter in letters])
|
||||
|
||||
for row in expected_rows:
|
||||
|
||||
ws.append(row)
|
||||
|
||||
wb.save(test_filename)
|
||||
|
||||
wb2 = load_workbook(test_filename, True)
|
||||
|
||||
ws = wb2.worksheets[0]
|
||||
|
||||
|
||||
for ex_row, ws_row in zip(expected_rows[:-20], ws.iter_rows()):
|
||||
|
||||
for ex_cell, ws_cell in zip(ex_row, ws_row):
|
||||
|
||||
eq_(ex_cell, ws_cell.internal_value)
|
||||
|
||||
os.remove(test_filename)
|
||||
|
||||
|
||||
def test_table_builder():
|
||||
|
||||
sb = StringTableBuilder()
|
||||
|
||||
result = {'a':0, 'b':1, 'c':2, 'd':3}
|
||||
|
||||
for letter in sorted(result.keys()):
|
||||
|
||||
for x in range(5):
|
||||
|
||||
sb.add(letter)
|
||||
|
||||
table = dict(sb.get_table())
|
||||
|
||||
for key,idx in result.items():
|
||||
eq_(idx, table[key])
|
||||
@@ -1,112 +0,0 @@
|
||||
# file openpyxl/tests/test_iter.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
import os.path as osp
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.reader.iter_worksheet import get_range_boundaries
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
import datetime
|
||||
|
||||
class TestWorksheet(object):
|
||||
|
||||
workbook_name = osp.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
|
||||
class TestText(TestWorksheet):
|
||||
sheet_name = 'Sheet1 - Text'
|
||||
|
||||
expected = [['This is cell A1 in Sheet 1', None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, None],
|
||||
[None, None, None, None, None, None, 'This is cell G5'], ]
|
||||
|
||||
def test_read_fast_integrated(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
for row, expected_row in zip(ws.iter_rows(), self.expected):
|
||||
|
||||
row_values = [x.internal_value for x in row]
|
||||
|
||||
eq_(row_values, expected_row)
|
||||
|
||||
|
||||
def test_get_boundaries_range(self):
|
||||
|
||||
eq_(get_range_boundaries('C1:C4'), (3, 1, 3, 4))
|
||||
|
||||
def test_get_boundaries_one(self):
|
||||
|
||||
|
||||
eq_(get_range_boundaries('C1'), (3, 1, 4, 1))
|
||||
|
||||
def test_read_single_cell_range(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
eq_('This is cell A1 in Sheet 1', list(ws.iter_rows('A1'))[0][0].internal_value)
|
||||
|
||||
class TestIntegers(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet2 - Numbers'
|
||||
|
||||
expected = [[x + 1] for x in range(30)]
|
||||
|
||||
query_range = 'D1:E30'
|
||||
|
||||
def test_read_fast_integrated(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
for row, expected_row in zip(ws.iter_rows(self.query_range), self.expected):
|
||||
|
||||
row_values = [x.internal_value for x in row]
|
||||
|
||||
eq_(row_values, expected_row)
|
||||
|
||||
class TestFloats(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet2 - Numbers'
|
||||
query_range = 'K1:L30'
|
||||
expected = expected = [[(x + 1) / 100.0] for x in range(30)]
|
||||
|
||||
class TestDates(TestWorksheet):
|
||||
|
||||
sheet_name = 'Sheet4 - Dates'
|
||||
|
||||
def test_read_single_cell_date(self):
|
||||
|
||||
wb = load_workbook(filename = self.workbook_name, use_iterators = True)
|
||||
ws = wb.get_sheet_by_name(name = self.sheet_name)
|
||||
|
||||
eq_(datetime.datetime(1973, 5, 20), list(ws.iter_rows('A1'))[0][0].internal_value)
|
||||
eq_(datetime.datetime(1973, 5, 20, 9, 15, 2), list(ws.iter_rows('C1'))[0][0].internal_value)
|
||||
|
||||
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# file openpyxl/tests/test_meta.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os.path
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content
|
||||
from openpyxl.writer.workbook import write_content_types, write_root_rels
|
||||
from openpyxl.workbook import Workbook
|
||||
|
||||
|
||||
def test_write_content_types():
|
||||
wb = Workbook()
|
||||
wb.create_sheet()
|
||||
wb.create_sheet()
|
||||
content = write_content_types(wb)
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected',
|
||||
'[Content_Types].xml')
|
||||
assert_equals_file_content(reference_file, content)
|
||||
|
||||
|
||||
def test_write_root_rels():
|
||||
wb = Workbook()
|
||||
content = write_root_rels(wb)
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected', '.rels')
|
||||
assert_equals_file_content(reference_file, content)
|
||||
@@ -1,102 +0,0 @@
|
||||
# file openpyxl/tests/test_named_range.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os.path
|
||||
|
||||
# 3rd-party imports
|
||||
from nose.tools import eq_, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.namedrange import split_named_range
|
||||
from openpyxl.reader.workbook import read_named_ranges
|
||||
from openpyxl.shared.exc import NamedRangeException
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
|
||||
|
||||
def test_split():
|
||||
eq_([('My Sheet', '$D$8'), ], split_named_range("'My Sheet'!$D$8"))
|
||||
|
||||
|
||||
def test_split_no_quotes():
|
||||
eq_([('HYPOTHESES', '$B$3:$L$3'), ], split_named_range('HYPOTHESES!$B$3:$L$3'))
|
||||
|
||||
|
||||
def test_bad_range_name():
|
||||
assert_raises(NamedRangeException, split_named_range, 'HYPOTHESES$B$3')
|
||||
|
||||
|
||||
def test_read_named_ranges():
|
||||
|
||||
class DummyWs(object):
|
||||
title = 'My Sheeet'
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
class DummyWB(object):
|
||||
|
||||
def get_sheet_by_name(self, name):
|
||||
return DummyWs()
|
||||
|
||||
with open(os.path.join(DATADIR, 'reader', 'workbook.xml')) as handle:
|
||||
content = handle.read()
|
||||
named_ranges = read_named_ranges(content, DummyWB())
|
||||
eq_(["My Sheeet!$D$8"], [str(range) for range in named_ranges])
|
||||
|
||||
def test_oddly_shaped_named_ranges():
|
||||
|
||||
ranges_counts = ((4, 'TEST_RANGE'),
|
||||
(3, 'TRAP_1'),
|
||||
(13, 'TRAP_2'))
|
||||
|
||||
def check_ranges(ws, count, range_name):
|
||||
|
||||
eq_(count, len(ws.range(range_name)))
|
||||
|
||||
wb = load_workbook(os.path.join(DATADIR, 'genuine', 'merge_range.xlsx'),
|
||||
use_iterators = False)
|
||||
|
||||
ws = wb.worksheets[0]
|
||||
|
||||
for count, range_name in ranges_counts:
|
||||
|
||||
yield check_ranges, ws, count, range_name
|
||||
|
||||
|
||||
def test_merged_cells_named_range():
|
||||
|
||||
wb = load_workbook(os.path.join(DATADIR, 'genuine', 'merge_range.xlsx'),
|
||||
use_iterators = False)
|
||||
|
||||
ws = wb.worksheets[0]
|
||||
|
||||
cell = ws.range('TRAP_3')
|
||||
|
||||
eq_('B15', cell.get_coordinate())
|
||||
|
||||
eq_(10, cell.value)
|
||||
@@ -1,142 +0,0 @@
|
||||
# file openpyxl/tests/test_number_format.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
from datetime import datetime, date
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, assert_almost_equal, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.cell import Cell
|
||||
from openpyxl.style import NumberFormat
|
||||
from openpyxl.shared.date_time import SharedDate
|
||||
|
||||
|
||||
class TestNumberFormat(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.workbook = Workbook()
|
||||
cls.worksheet = Worksheet(cls.workbook, 'Test')
|
||||
cls.sd = SharedDate()
|
||||
|
||||
def test_convert_date_to_julian(self):
|
||||
eq_(40167, self.sd.to_julian(2009, 12, 20))
|
||||
|
||||
def test_convert_date_from_julian(self):
|
||||
|
||||
def test_date_equal(julian, datetime):
|
||||
|
||||
eq_(self.sd.from_julian(julian), datetime)
|
||||
|
||||
date_pairs= (
|
||||
(40167, datetime(2009, 12, 20)),
|
||||
(21980, datetime(1960, 0o3, 0o5)),
|
||||
)
|
||||
|
||||
for count, dt in date_pairs:
|
||||
yield test_date_equal, count, dt
|
||||
|
||||
def test_convert_datetime_to_julian(self):
|
||||
eq_(40167, self.sd.datetime_to_julian(datetime(2009, 12, 20)))
|
||||
|
||||
def test_insert_float(self):
|
||||
self.worksheet.cell('A1').value = 3.14
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_insert_percentage(self):
|
||||
self.worksheet.cell('A1').value = '3.14%'
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
assert_almost_equal(0.0314, self.worksheet.cell('A1').value)
|
||||
|
||||
def test_insert_datetime(self):
|
||||
self.worksheet.cell('A1').value = date.today()
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_insert_date(self):
|
||||
self.worksheet.cell('A1').value = datetime.now()
|
||||
eq_(Cell.TYPE_NUMERIC, self.worksheet.cell('A1')._data_type)
|
||||
|
||||
def test_internal_date(self):
|
||||
dt = datetime(2010, 7, 13, 6, 37, 41)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(40372.27616898148, self.worksheet.cell('A3')._value)
|
||||
|
||||
def test_datetime_interpretation(self):
|
||||
dt = datetime(2010, 7, 13, 6, 37, 41)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(dt, self.worksheet.cell('A3').value)
|
||||
|
||||
def test_date_interpretation(self):
|
||||
dt = date(2010, 7, 13)
|
||||
self.worksheet.cell('A3').value = dt
|
||||
eq_(datetime(2010, 7, 13, 0, 0), self.worksheet.cell('A3').value)
|
||||
|
||||
def test_number_format_style(self):
|
||||
self.worksheet.cell('A1').value = '12.6%'
|
||||
eq_(NumberFormat.FORMAT_PERCENTAGE, \
|
||||
self.worksheet.cell('A1').style.number_format.format_code)
|
||||
|
||||
def test_date_format_on_non_date(self):
|
||||
cell = self.worksheet.cell('A1')
|
||||
|
||||
def check_date_pair(count, date_string):
|
||||
cell.value = datetime.strptime(date_string, '%Y-%m-%d')
|
||||
eq_(count, cell._value)
|
||||
|
||||
date_pairs = (
|
||||
(15, '1900-01-15'),
|
||||
(59, '1900-02-28'),
|
||||
(61, '1900-03-01'),
|
||||
(367, '1901-01-01'),
|
||||
(2958465, '9999-12-31'), )
|
||||
for count, date_string in date_pairs:
|
||||
yield check_date_pair, count, date_string
|
||||
|
||||
def test_1900_leap_year(self):
|
||||
assert_raises(ValueError, self.sd.from_julian, 60)
|
||||
assert_raises(ValueError, self.sd.to_julian, 1900, 2, 29)
|
||||
|
||||
def test_bad_date(self):
|
||||
|
||||
def check_bad_date(year, month, day):
|
||||
assert_raises(ValueError, self.sd.to_julian, year, month, day)
|
||||
|
||||
bad_dates = ((1776, 0o7, 0o4), (1899, 12, 31), )
|
||||
for year, month, day in bad_dates:
|
||||
yield check_bad_date, year, month, day
|
||||
|
||||
def test_bad_julian_date(self):
|
||||
assert_raises(ValueError, self.sd.from_julian, -1)
|
||||
|
||||
def test_mac_date(self):
|
||||
self.sd.excel_base_date = self.sd.CALENDAR_MAC_1904
|
||||
assert_raises(NotImplementedError, self.sd.to_julian, 2000, 1, 1)
|
||||
assert_raises(NotImplementedError, self.sd.from_julian, 1)
|
||||
self.sd.excel_base_date = self.sd.CALENDAR_WINDOWS_1900
|
||||
@@ -1,41 +0,0 @@
|
||||
# file openpyxl/tests/test_password_hash.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.shared.password_hasher import hash_password
|
||||
from openpyxl.worksheet import SheetProtection
|
||||
|
||||
|
||||
def test_hasher():
|
||||
eq_('CBEB', hash_password('test'))
|
||||
|
||||
|
||||
def test_sheet_protection():
|
||||
protection = SheetProtection()
|
||||
protection.password = 'test'
|
||||
eq_('CBEB', protection.password)
|
||||
@@ -1,124 +0,0 @@
|
||||
# coding=utf-8
|
||||
# file openpyxl/tests/test_props.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
from zipfile import ZipFile, ZIP_DEFLATED
|
||||
from datetime import datetime
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, TMPDIR, make_tmpdir, clean_tmpdir, \
|
||||
assert_equals_file_content
|
||||
from openpyxl.reader.workbook import read_properties_core, \
|
||||
read_sheets_titles, get_number_of_parts
|
||||
from openpyxl.writer.workbook import write_properties_core, \
|
||||
write_properties_app
|
||||
from openpyxl.shared.ooxml import ARC_APP, ARC_CORE
|
||||
from openpyxl.workbook import DocumentProperties, Workbook
|
||||
|
||||
|
||||
class TestReaderProps(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.genuine_filename = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
cls.archive = ZipFile(cls.genuine_filename, 'r', ZIP_DEFLATED)
|
||||
|
||||
@classmethod
|
||||
def teardown_class(cls):
|
||||
cls.archive.close()
|
||||
|
||||
def test_read_properties_core(self):
|
||||
content = self.archive.read(ARC_CORE)
|
||||
prop = read_properties_core(content)
|
||||
eq_(prop.creator, '*.*')
|
||||
eq_(prop.last_modified_by, 'Aurélien Campéas')
|
||||
eq_(prop.created, datetime(2010, 4, 9, 20, 43, 12))
|
||||
eq_(prop.modified, datetime(2011, 2, 9, 13, 49, 32))
|
||||
|
||||
def test_read_sheets_titles(self):
|
||||
content = self.archive.read(ARC_APP)
|
||||
sheet_titles = read_sheets_titles(content)
|
||||
eq_(sheet_titles, \
|
||||
['Sheet1 - Text', 'Sheet2 - Numbers', 'Sheet3 - Formulas', 'Sheet4 - Dates'])
|
||||
|
||||
|
||||
class TestReaderPropsMixed(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
reference_filename = \
|
||||
os.path.join(DATADIR, 'reader', 'app-multi-titles.xml')
|
||||
with open(reference_filename) as handle:
|
||||
cls.content = handle.read()
|
||||
|
||||
def test_read_sheet_titles_mixed(self):
|
||||
sheet_titles = read_sheets_titles(self.content)
|
||||
eq_(sheet_titles,
|
||||
['ToC', 'ContractYear', 'ContractTier', 'Demand',
|
||||
'LinearizedFunction', 'Market', 'Transmission'])
|
||||
|
||||
def test_number_of_parts(self):
|
||||
parts_number = get_number_of_parts(self.content)
|
||||
eq_(parts_number,
|
||||
({'Worksheets': 7, 'Named Ranges': 7},
|
||||
['Worksheets', 'Named Ranges']))
|
||||
|
||||
|
||||
class TestWriteProps(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
make_tmpdir()
|
||||
cls.tmp_filename = os.path.join(TMPDIR, 'test.xlsx')
|
||||
cls.prop = DocumentProperties()
|
||||
|
||||
@classmethod
|
||||
def teardown_class(cls):
|
||||
clean_tmpdir()
|
||||
|
||||
def test_write_properties_core(self):
|
||||
self.prop.creator = 'TEST_USER'
|
||||
self.prop.last_modified_by = 'SOMEBODY'
|
||||
self.prop.created = datetime(2010, 4, 1, 20, 30, 00)
|
||||
self.prop.modified = datetime(2010, 4, 5, 14, 5, 30)
|
||||
content = write_properties_core(self.prop)
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'core.xml'),
|
||||
content)
|
||||
|
||||
def test_write_properties_app(self):
|
||||
wb = Workbook()
|
||||
wb.create_sheet()
|
||||
wb.create_sheet()
|
||||
content = write_properties_app(wb)
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'app.xml'),
|
||||
content)
|
||||
@@ -1,134 +0,0 @@
|
||||
# file openpyxl/tests/test_read.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.worksheet import Worksheet
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.style import NumberFormat, Style
|
||||
from openpyxl.reader.worksheet import read_worksheet, read_dimension
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.shared.exc import InvalidFileException
|
||||
|
||||
|
||||
def test_read_standalone_worksheet():
|
||||
|
||||
class DummyWb(object):
|
||||
|
||||
def get_sheet_by_name(self, value):
|
||||
return None
|
||||
|
||||
path = os.path.join(DATADIR, 'reader', 'sheet2.xml')
|
||||
with open(path) as handle:
|
||||
ws = read_worksheet(handle.read(), DummyWb(),
|
||||
'Sheet 2', {1: 'hello'}, {1: Style()})
|
||||
assert isinstance(ws, Worksheet)
|
||||
eq_(ws.cell('G5').value, 'hello')
|
||||
eq_(ws.cell('D30').value, 30)
|
||||
eq_(ws.cell('K9').value, 0.09)
|
||||
|
||||
|
||||
def test_read_standard_workbook():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
wb = load_workbook(path)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
def test_read_standard_workbook_from_fileobj():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
fo = open(path, mode = 'rb')
|
||||
wb = load_workbook(fo)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
def test_read_worksheet():
|
||||
path = os.path.join(DATADIR, 'genuine', 'empty.xlsx')
|
||||
wb = load_workbook(path)
|
||||
sheet2 = wb.get_sheet_by_name('Sheet2 - Numbers')
|
||||
assert isinstance(sheet2, Worksheet)
|
||||
eq_('This is cell G5', sheet2.cell('G5').value)
|
||||
eq_(18, sheet2.cell('D18').value)
|
||||
|
||||
|
||||
def test_read_nostring_workbook():
|
||||
genuine_wb = os.path.join(DATADIR, 'genuine', 'empty-no-string.xlsx')
|
||||
wb = load_workbook(genuine_wb)
|
||||
assert isinstance(wb, Workbook)
|
||||
|
||||
@raises(InvalidFileException)
|
||||
def test_read_empty_file():
|
||||
|
||||
null_file = os.path.join(DATADIR, 'reader', 'null_file.xlsx')
|
||||
wb = load_workbook(null_file)
|
||||
|
||||
@raises(InvalidFileException)
|
||||
def test_read_empty_archive():
|
||||
|
||||
null_file = os.path.join(DATADIR, 'reader', 'null_archive.xlsx')
|
||||
wb = load_workbook(null_file)
|
||||
|
||||
def test_read_dimension():
|
||||
|
||||
path = os.path.join(DATADIR, 'reader', 'sheet2.xml')
|
||||
|
||||
with open(path) as handle:
|
||||
|
||||
dimension = read_dimension(xml_source = handle.read())
|
||||
|
||||
eq_(('D', 1, 'K', 30), dimension)
|
||||
|
||||
class TestReadWorkbookWithStyles(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.genuine_wb = os.path.join(DATADIR, 'genuine', \
|
||||
'empty-with-styles.xlsx')
|
||||
wb = load_workbook(cls.genuine_wb)
|
||||
cls.ws = wb.get_sheet_by_name('Sheet1')
|
||||
|
||||
def test_read_general_style(self):
|
||||
eq_(self.ws.cell('A1').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_GENERAL)
|
||||
|
||||
def test_read_date_style(self):
|
||||
eq_(self.ws.cell('A2').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_DATE_XLSX14)
|
||||
|
||||
def test_read_number_style(self):
|
||||
eq_(self.ws.cell('A3').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_NUMBER_00)
|
||||
|
||||
def test_read_time_style(self):
|
||||
eq_(self.ws.cell('A4').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_DATE_TIME3)
|
||||
|
||||
def test_read_percentage_style(self):
|
||||
eq_(self.ws.cell('A5').style.number_format.format_code,
|
||||
NumberFormat.FORMAT_PERCENTAGE_00)
|
||||
@@ -1,68 +0,0 @@
|
||||
# file openpyxl/tests/test_strings.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.writer.strings import create_string_table
|
||||
from openpyxl.reader.strings import read_string_table
|
||||
|
||||
|
||||
def test_create_string_table():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('B12').value = 'hello'
|
||||
ws.cell('B13').value = 'world'
|
||||
ws.cell('D28').value = 'hello'
|
||||
table = create_string_table(wb)
|
||||
eq_({'hello': 1, 'world': 0}, table)
|
||||
|
||||
|
||||
def test_read_string_table():
|
||||
with open(os.path.join(DATADIR, 'reader', 'sharedStrings.xml')) as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'This is cell A1 in Sheet 1', 1: 'This is cell G5'}, string_table)
|
||||
|
||||
def test_empty_string():
|
||||
with open(os.path.join(DATADIR, 'reader', 'sharedStrings-emptystring.xml')) as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'Testing empty cell', 1:''}, string_table)
|
||||
|
||||
def test_formatted_string_table():
|
||||
with open(os.path.join(DATADIR, 'reader', 'shared-strings-rich.xml')) \
|
||||
as handle:
|
||||
content = handle.read()
|
||||
string_table = read_string_table(content)
|
||||
eq_({0: 'Welcome', 1: 'to the best shop in town',
|
||||
2: " let's play "}, string_table)
|
||||
@@ -1,181 +0,0 @@
|
||||
# file openpyxl/tests/test_style.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
import os.path
|
||||
import datetime
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, assert_false, ok_
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content, get_xml
|
||||
from openpyxl.reader.style import read_style_table
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.style import NumberFormat
|
||||
from openpyxl.writer.styles import StyleWriter
|
||||
from openpyxl.style import NumberFormat, Border, Color
|
||||
|
||||
|
||||
class TestCreateStyle(object):
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
now = datetime.datetime.now()
|
||||
cls.workbook = Workbook()
|
||||
cls.worksheet = cls.workbook.create_sheet()
|
||||
cls.worksheet.cell(coordinate = 'A1').value = '12.34%'
|
||||
cls.worksheet.cell(coordinate = 'B4').value = now
|
||||
cls.worksheet.cell(coordinate = 'B5').value = now
|
||||
cls.worksheet.cell(coordinate = 'C14').value = 'This is a test'
|
||||
cls.worksheet.cell(coordinate = 'D9').value = '31.31415'
|
||||
cls.worksheet.cell(coordinate = 'D9').style.number_format.format_code = \
|
||||
NumberFormat.FORMAT_NUMBER_00
|
||||
cls.writer = StyleWriter(cls.workbook)
|
||||
|
||||
def test_create_style_table(self):
|
||||
eq_(3, len(self.writer.style_table))
|
||||
|
||||
def test_write_style_table(self):
|
||||
reference_file = os.path.join(DATADIR, 'writer', 'expected', 'simple-styles.xml')
|
||||
assert_equals_file_content(reference_file, self.writer.write_table())
|
||||
|
||||
class TestStyleWriter(object):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
self.workbook = Workbook()
|
||||
self.worksheet = self.workbook.create_sheet()
|
||||
|
||||
def test_no_style(self):
|
||||
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(0, len(w.style_table))
|
||||
|
||||
def test_nb_style(self):
|
||||
|
||||
for i in range(1, 6):
|
||||
self.worksheet.cell(row=1, column=i).style.font.size += i
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(5, len(w.style_table))
|
||||
|
||||
self.worksheet.cell('A10').style.borders.top = Border.BORDER_THIN
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(6, len(w.style_table))
|
||||
|
||||
def test_style_unicity(self):
|
||||
|
||||
for i in range(1, 6):
|
||||
self.worksheet.cell(row=1, column=i).style.font.bold = True
|
||||
w = StyleWriter(self.workbook)
|
||||
eq_(1, len(w.style_table))
|
||||
|
||||
def test_fonts(self):
|
||||
|
||||
self.worksheet.cell('A1').style.font.size = 12
|
||||
self.worksheet.cell('A1').style.font.bold = True
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_fonts()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="2"><font><sz val="11" /><color theme="1" /><name val="Calibri" /><family val="2" /><scheme val="minor" /></font><font><sz val="12" /><color rgb="FF000000" /><name val="Calibri" /><family val="2" /><scheme val="minor" /><b /></font></fonts></styleSheet>')
|
||||
|
||||
def test_fills(self):
|
||||
|
||||
self.worksheet.cell('A1').style.fill.fill_type = 'solid'
|
||||
self.worksheet.cell('A1').style.fill.start_color.index = Color.DARKYELLOW
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_fills()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fills count="3"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill><fill><patternFill patternType="solid"><fgColor rgb="FF808000" /></patternFill></fill></fills></styleSheet>')
|
||||
|
||||
def test_borders(self):
|
||||
|
||||
self.worksheet.cell('A1').style.borders.top.border_style = Border.BORDER_THIN
|
||||
self.worksheet.cell('A1').style.borders.top.color.index = Color.DARKYELLOW
|
||||
w = StyleWriter(self.workbook)
|
||||
w._write_borders()
|
||||
eq_(get_xml(w._root), '<?xml version=\'1.0\' encoding=\'UTF-8\'?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><borders count="2"><border><left /><right /><top /><bottom /><diagonal /></border><border><left style="none"><color rgb="FF000000" /></left><right style="none"><color rgb="FF000000" /></right><top style="thin"><color rgb="FF808000" /></top><bottom style="none"><color rgb="FF000000" /></bottom><diagonal style="none"><color rgb="FF000000" /></diagonal></border></borders></styleSheet>')
|
||||
|
||||
def test_write_cell_xfs_1(self):
|
||||
|
||||
self.worksheet.cell('A1').style.font.size = 12
|
||||
w = StyleWriter(self.workbook)
|
||||
ft = w._write_fonts()
|
||||
nft = w._write_number_formats()
|
||||
w._write_cell_xfs(nft, ft, {}, {})
|
||||
xml = get_xml(w._root)
|
||||
ok_('applyFont="1"' in xml)
|
||||
ok_('applyFillId="1"' not in xml)
|
||||
ok_('applyBorder="1"' not in xml)
|
||||
ok_('applyAlignment="1"' not in xml)
|
||||
|
||||
def test_alignment(self):
|
||||
self.worksheet.cell('A1').style.alignment.horizontal = 'center'
|
||||
self.worksheet.cell('A1').style.alignment.vertical = 'center'
|
||||
w = StyleWriter(self.workbook)
|
||||
nft = w._write_number_formats()
|
||||
w._write_cell_xfs(nft,{},{},{})
|
||||
xml = get_xml(w._root)
|
||||
ok_('applyAlignment="1"' in xml)
|
||||
ok_('horizontal="center"' in xml)
|
||||
ok_('vertical="center"' in xml)
|
||||
|
||||
|
||||
#def test_format_comparisions():
|
||||
# format1 = NumberFormat()
|
||||
# format2 = NumberFormat()
|
||||
# format3 = NumberFormat()
|
||||
# format1.format_code = 'm/d/yyyy'
|
||||
# format2.format_code = 'm/d/yyyy'
|
||||
# format3.format_code = 'mm/dd/yyyy'
|
||||
# assert not format1 < format2
|
||||
# assert format1 < format3
|
||||
# assert format1 == format2
|
||||
# assert format1 != format3
|
||||
|
||||
|
||||
def test_builtin_format():
|
||||
format = NumberFormat()
|
||||
format.format_code = '0.00'
|
||||
eq_(format.builtin_format_code(2), format._format_code)
|
||||
|
||||
|
||||
def test_read_style():
|
||||
reference_file = os.path.join(DATADIR, 'reader', 'simple-styles.xml')
|
||||
with open(reference_file, 'r') as handle:
|
||||
content = handle.read()
|
||||
style_table = read_style_table(content)
|
||||
eq_(4, len(style_table))
|
||||
eq_(NumberFormat._BUILTIN_FORMATS[9],
|
||||
style_table[1].number_format.format_code)
|
||||
eq_('yyyy-mm-dd', style_table[2].number_format.format_code)
|
||||
|
||||
|
||||
def test_read_cell_style():
|
||||
reference_file = os.path.join(
|
||||
DATADIR, 'reader', 'empty-workbook-styles.xml')
|
||||
with open(reference_file, 'r') as handle:
|
||||
content = handle.read()
|
||||
style_table = read_style_table(content)
|
||||
eq_(2, len(style_table))
|
||||
@@ -1,37 +0,0 @@
|
||||
# file openpyxl/tests/test_theme.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
import os.path
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import DATADIR, assert_equals_file_content
|
||||
from openpyxl.writer.theme import write_theme
|
||||
|
||||
|
||||
def test_write_theme():
|
||||
content = write_theme()
|
||||
assert_equals_file_content(
|
||||
os.path.join(DATADIR, 'writer', 'expected', 'theme1.xml'), content)
|
||||
@@ -1,148 +0,0 @@
|
||||
# file openpyxl/tests/test_workbook.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, with_setup, raises
|
||||
import os.path as osp
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.namedrange import NamedRange
|
||||
from openpyxl.shared.exc import ReadOnlyWorkbookException
|
||||
from openpyxl.tests.helper import TMPDIR, clean_tmpdir, make_tmpdir
|
||||
|
||||
import datetime
|
||||
|
||||
def test_get_active_sheet():
|
||||
wb = Workbook()
|
||||
active_sheet = wb.get_active_sheet()
|
||||
eq_(active_sheet, wb.worksheets[0])
|
||||
|
||||
|
||||
def test_create_sheet():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
eq_(new_sheet, wb.worksheets[0])
|
||||
|
||||
|
||||
@raises(ReadOnlyWorkbookException)
|
||||
def test_create_sheet_readonly():
|
||||
wb = Workbook()
|
||||
wb._set_optimized_read()
|
||||
wb.create_sheet()
|
||||
|
||||
|
||||
def test_remove_sheet():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
wb.remove_sheet(new_sheet)
|
||||
assert new_sheet not in wb.worksheets
|
||||
|
||||
|
||||
def test_get_sheet_by_name():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
title = 'my sheet'
|
||||
new_sheet.title = title
|
||||
found_sheet = wb.get_sheet_by_name(title)
|
||||
eq_(new_sheet, found_sheet)
|
||||
|
||||
|
||||
def test_get_index():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet(0)
|
||||
sheet_index = wb.get_index(new_sheet)
|
||||
eq_(sheet_index, 0)
|
||||
|
||||
|
||||
def test_get_sheet_names():
|
||||
wb = Workbook()
|
||||
names = ['Sheet', 'Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5']
|
||||
for count in range(5):
|
||||
wb.create_sheet(0)
|
||||
actual_names = wb.get_sheet_names()
|
||||
eq_(sorted(actual_names), sorted(names))
|
||||
|
||||
|
||||
def test_get_named_ranges():
|
||||
wb = Workbook()
|
||||
eq_(wb.get_named_ranges(), wb._named_ranges)
|
||||
|
||||
|
||||
def test_add_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
named_ranges_list = wb.get_named_ranges()
|
||||
assert named_range in named_ranges_list
|
||||
|
||||
|
||||
def test_get_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
found_named_range = wb.get_named_range('test_nr')
|
||||
eq_(named_range, found_named_range)
|
||||
|
||||
|
||||
def test_remove_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
wb.add_named_range(named_range)
|
||||
wb.remove_named_range(named_range)
|
||||
named_ranges_list = wb.get_named_ranges()
|
||||
assert named_range not in named_ranges_list
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_add_local_named_range():
|
||||
wb = Workbook()
|
||||
new_sheet = wb.create_sheet()
|
||||
named_range = NamedRange('test_nr', [(new_sheet, 'A1')])
|
||||
named_range.local_only = True
|
||||
wb.add_named_range(named_range)
|
||||
dest_filename = osp.join(TMPDIR, 'local_named_range_book.xlsx')
|
||||
wb.save(dest_filename)
|
||||
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_write_regular_date():
|
||||
|
||||
today = datetime.datetime(2010, 1, 18, 14, 15, 20, 1600)
|
||||
|
||||
book = Workbook()
|
||||
sheet = book.get_active_sheet()
|
||||
sheet.cell("A1").value = today
|
||||
dest_filename = osp.join(TMPDIR, 'date_read_write_issue.xlsx')
|
||||
book.save(dest_filename)
|
||||
|
||||
test_book = load_workbook(dest_filename)
|
||||
test_sheet = test_book.get_active_sheet()
|
||||
|
||||
eq_(test_sheet.cell("A1").value, today)
|
||||
|
||||
@@ -1,258 +0,0 @@
|
||||
# file openpyxl/tests/test_worksheet.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, raises, assert_raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.worksheet import Worksheet, Relationship, flatten
|
||||
from openpyxl.cell import Cell
|
||||
from openpyxl.shared.exc import CellCoordinatesException, \
|
||||
SheetTitleException, InsufficientCoordinatesException, \
|
||||
NamedRangeException
|
||||
|
||||
|
||||
class TestWorksheet():
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
cls.wb = Workbook()
|
||||
|
||||
def test_new_worksheet(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_(self.wb, ws._parent)
|
||||
|
||||
def test_new_sheet_name(self):
|
||||
self.wb.worksheets = []
|
||||
ws = Worksheet(self.wb, title = '')
|
||||
eq_(repr(ws), '<Worksheet "Sheet1">')
|
||||
|
||||
def test_get_cell(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell('A1')
|
||||
eq_(cell.get_coordinate(), 'A1')
|
||||
|
||||
@raises(SheetTitleException)
|
||||
def test_set_bad_title(self):
|
||||
Worksheet(self.wb, 'X' * 50)
|
||||
|
||||
def test_set_bad_title_character(self):
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '[')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, ']')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '*')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, ':')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '?')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '/')
|
||||
assert_raises(SheetTitleException, Worksheet, self.wb, '\\')
|
||||
|
||||
def test_worksheet_dimension(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_('A1:A1', ws.calculate_dimension())
|
||||
ws.cell('B12').value = 'AAA'
|
||||
eq_('A1:B12', ws.calculate_dimension())
|
||||
|
||||
def test_worksheet_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
xlrange = ws.range('A1:C4')
|
||||
assert isinstance(xlrange, tuple)
|
||||
eq_(4, len(xlrange))
|
||||
eq_(3, len(xlrange[0]))
|
||||
|
||||
def test_worksheet_named_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
self.wb.create_named_range('test_range', ws, 'C5')
|
||||
xlrange = ws.range('test_range')
|
||||
assert isinstance(xlrange, Cell)
|
||||
eq_(5, xlrange.row)
|
||||
|
||||
@raises(NamedRangeException)
|
||||
def test_bad_named_range(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.range('bad_range')
|
||||
|
||||
@raises(NamedRangeException)
|
||||
def test_named_range_wrong_sheet(self):
|
||||
ws1 = Worksheet(self.wb)
|
||||
ws2 = Worksheet(self.wb)
|
||||
self.wb.create_named_range('wrong_sheet_range', ws1, 'C5')
|
||||
ws2.range('wrong_sheet_range')
|
||||
|
||||
def test_cell_offset(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_('C17', ws.cell('B15').offset(2, 1).get_coordinate())
|
||||
|
||||
def test_range_offset(self):
|
||||
ws = Worksheet(self.wb)
|
||||
xlrange = ws.range('A1:C4', 1, 3)
|
||||
assert isinstance(xlrange, tuple)
|
||||
eq_(4, len(xlrange))
|
||||
eq_(3, len(xlrange[0]))
|
||||
eq_('D2', xlrange[0][0].get_coordinate())
|
||||
|
||||
def test_cell_alternate_coordinates(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell(row = 8, column = 4)
|
||||
eq_('E9', cell.get_coordinate())
|
||||
|
||||
@raises(InsufficientCoordinatesException)
|
||||
def test_cell_insufficient_coordinates(self):
|
||||
ws = Worksheet(self.wb)
|
||||
cell = ws.cell(row = 8)
|
||||
|
||||
def test_cell_range_name(self):
|
||||
ws = Worksheet(self.wb)
|
||||
self.wb.create_named_range('test_range_single', ws, 'B12')
|
||||
assert_raises(CellCoordinatesException, ws.cell, 'test_range_single')
|
||||
c_range_name = ws.range('test_range_single')
|
||||
c_range_coord = ws.range('B12')
|
||||
c_cell = ws.cell('B12')
|
||||
eq_(c_range_coord, c_range_name)
|
||||
eq_(c_range_coord, c_cell)
|
||||
|
||||
def test_garbage_collect(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.cell('A1').value = ''
|
||||
ws.cell('B2').value = '0'
|
||||
ws.cell('C4').value = 0
|
||||
ws.garbage_collect()
|
||||
eq_(ws.get_cell_collection(), [ws.cell('B2'), ws.cell('C4')])
|
||||
|
||||
def test_hyperlink_relationships(self):
|
||||
ws = Worksheet(self.wb)
|
||||
eq_(len(ws.relationships), 0)
|
||||
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
eq_(len(ws.relationships), 1)
|
||||
eq_("rId1", ws.cell('A1').hyperlink_rel_id)
|
||||
eq_("rId1", ws.relationships[0].id)
|
||||
eq_("http://test.com", ws.relationships[0].target)
|
||||
eq_("External", ws.relationships[0].target_mode)
|
||||
|
||||
ws.cell('A2').hyperlink = "http://test2.com"
|
||||
eq_(len(ws.relationships), 2)
|
||||
eq_("rId2", ws.cell('A2').hyperlink_rel_id)
|
||||
eq_("rId2", ws.relationships[1].id)
|
||||
eq_("http://test2.com", ws.relationships[1].target)
|
||||
eq_("External", ws.relationships[1].target_mode)
|
||||
|
||||
@raises(ValueError)
|
||||
def test_bad_relationship_type(self):
|
||||
rel = Relationship('bad_type')
|
||||
|
||||
def test_append_list(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append(['This is A1', 'This is B1'])
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is B1', ws.cell('B1').value)
|
||||
|
||||
def test_append_dict_letter(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append({'A' : 'This is A1', 'C' : 'This is C1'})
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is C1', ws.cell('C1').value)
|
||||
|
||||
def test_append_dict_index(self):
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append({0 : 'This is A1', 2 : 'This is C1'})
|
||||
|
||||
eq_('This is A1', ws.cell('A1').value)
|
||||
eq_('This is C1', ws.cell('C1').value)
|
||||
|
||||
@raises(TypeError)
|
||||
def test_bad_append(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.append("test")
|
||||
|
||||
def test_append_2d_list(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.append(['This is A1', 'This is B1'])
|
||||
ws.append(['This is A2', 'This is B2'])
|
||||
|
||||
vals = ws.range('A1:B2')
|
||||
|
||||
eq_((('This is A1', 'This is B1'),
|
||||
('This is A2', 'This is B2'),), flatten(vals))
|
||||
|
||||
def test_rows(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.cell('A1').value = 'first'
|
||||
ws.cell('C9').value = 'last'
|
||||
|
||||
rows = ws.rows
|
||||
|
||||
eq_(len(rows), 9)
|
||||
|
||||
eq_(rows[0][0].value, 'first')
|
||||
eq_(rows[-1][-1].value, 'last')
|
||||
|
||||
def test_cols(self):
|
||||
|
||||
ws = Worksheet(self.wb)
|
||||
|
||||
ws.cell('A1').value = 'first'
|
||||
ws.cell('C9').value = 'last'
|
||||
|
||||
cols = ws.columns
|
||||
|
||||
eq_(len(cols), 3)
|
||||
|
||||
eq_(cols[0][0].value, 'first')
|
||||
eq_(cols[-1][-1].value, 'last')
|
||||
|
||||
def test_auto_filter(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.auto_filter = ws.range('a1:f1')
|
||||
assert ws.auto_filter == 'A1:F1'
|
||||
|
||||
ws.auto_filter = ''
|
||||
assert ws.auto_filter is None
|
||||
|
||||
ws.auto_filter = 'c1:g9'
|
||||
assert ws.auto_filter == 'C1:G9'
|
||||
|
||||
def test_freeze(self):
|
||||
ws = Worksheet(self.wb)
|
||||
ws.freeze_panes = ws.cell('b2')
|
||||
assert ws.freeze_panes == 'B2'
|
||||
|
||||
ws.freeze_panes = ''
|
||||
assert ws.freeze_panes is None
|
||||
|
||||
ws.freeze_panes = 'c5'
|
||||
assert ws.freeze_panes == 'C5'
|
||||
|
||||
ws.freeze_panes = ws.cell('A1')
|
||||
assert ws.freeze_panes is None
|
||||
|
||||
@@ -1,203 +0,0 @@
|
||||
# file openpyxl/tests/test_write.py
|
||||
|
||||
# Copyright (c) 2010 openpyxl
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
# @license: http://www.opensource.org/licenses/mit-license.php
|
||||
# @author: Eric Gazoni
|
||||
|
||||
# Python stdlib imports
|
||||
|
||||
from io import StringIO
|
||||
import os.path
|
||||
|
||||
# 3rd party imports
|
||||
from nose.tools import eq_, with_setup, raises
|
||||
|
||||
# package imports
|
||||
from openpyxl.tests.helper import TMPDIR, DATADIR, \
|
||||
assert_equals_file_content, clean_tmpdir, make_tmpdir
|
||||
from openpyxl.workbook import Workbook
|
||||
from openpyxl.reader.excel import load_workbook
|
||||
from openpyxl.writer.excel import save_workbook, save_virtual_workbook, \
|
||||
ExcelWriter
|
||||
from openpyxl.writer.workbook import write_workbook, write_workbook_rels
|
||||
from openpyxl.writer.worksheet import write_worksheet, write_worksheet_rels
|
||||
from openpyxl.writer.strings import write_string_table
|
||||
from openpyxl.writer.styles import StyleWriter
|
||||
|
||||
|
||||
@with_setup(setup = make_tmpdir, teardown = clean_tmpdir)
|
||||
def test_write_empty_workbook():
|
||||
wb = Workbook()
|
||||
dest_filename = os.path.join(TMPDIR, 'empty_book.xlsx')
|
||||
save_workbook(wb, dest_filename)
|
||||
assert os.path.isfile(dest_filename)
|
||||
|
||||
|
||||
def test_write_virtual_workbook():
|
||||
old_wb = Workbook()
|
||||
saved_wb = save_virtual_workbook(old_wb)
|
||||
new_wb = load_workbook(StringIO(saved_wb))
|
||||
assert new_wb
|
||||
|
||||
|
||||
def test_write_workbook_rels():
|
||||
wb = Workbook()
|
||||
content = write_workbook_rels(wb)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'workbook.xml.rels'), content)
|
||||
|
||||
|
||||
def test_write_workbook():
|
||||
wb = Workbook()
|
||||
content = write_workbook(wb)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'workbook.xml'), content)
|
||||
|
||||
|
||||
def test_write_string_table():
|
||||
table = {'hello': 1, 'world': 2, 'nice': 3}
|
||||
content = write_string_table(table)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sharedStrings.xml'), content)
|
||||
|
||||
|
||||
def test_write_worksheet():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1.xml'), content)
|
||||
|
||||
|
||||
def test_write_hidden_worksheet():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.sheet_state = ws.SHEETSTATE_HIDDEN
|
||||
ws.cell('F42').value = 'hello'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1.xml'), content)
|
||||
|
||||
|
||||
def test_write_formula():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = 10
|
||||
ws.cell('F2').value = 32
|
||||
ws.cell('F3').value = '=F1+F2'
|
||||
content = write_worksheet(ws, {}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_formula.xml'), content)
|
||||
|
||||
|
||||
def test_write_style():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = '13%'
|
||||
style_id_by_hash = StyleWriter(wb).get_style_by_hash()
|
||||
content = write_worksheet(ws, {}, style_id_by_hash)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_style.xml'), content)
|
||||
|
||||
|
||||
def test_write_height():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F1').value = 10
|
||||
ws.row_dimensions[ws.cell('F1').row].height = 30
|
||||
content = write_worksheet(ws, {}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_height.xml'), content)
|
||||
|
||||
|
||||
def test_write_hyperlink():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('A1').value = "test"
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
content = write_worksheet(ws, {'test': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_hyperlink.xml'), content)
|
||||
|
||||
|
||||
def test_write_hyperlink_rels():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
eq_(0, len(ws.relationships))
|
||||
ws.cell('A1').value = "test"
|
||||
ws.cell('A1').hyperlink = "http://test.com/"
|
||||
eq_(1, len(ws.relationships))
|
||||
ws.cell('A2').value = "test"
|
||||
ws.cell('A2').hyperlink = "http://test2.com/"
|
||||
eq_(2, len(ws.relationships))
|
||||
content = write_worksheet_rels(ws, 1)
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_hyperlink.xml.rels'), content)
|
||||
|
||||
|
||||
def test_hyperlink_value():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('A1').hyperlink = "http://test.com"
|
||||
eq_("http://test.com", ws.cell('A1').value)
|
||||
ws.cell('A1').value = "test"
|
||||
eq_("test", ws.cell('A1').value)
|
||||
|
||||
def test_write_auto_filter():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.auto_filter = 'A1:F1'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_auto_filter.xml'), content)
|
||||
|
||||
def test_freeze_panes_horiz():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'A4'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_horiz.xml'), content)
|
||||
|
||||
def test_freeze_panes_vert():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'D1'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_vert.xml'), content)
|
||||
pass
|
||||
|
||||
def test_freeze_panes_both():
|
||||
wb = Workbook()
|
||||
ws = wb.create_sheet()
|
||||
ws.cell('F42').value = 'hello'
|
||||
ws.freeze_panes = 'D4'
|
||||
content = write_worksheet(ws, {'hello': 0}, {})
|
||||
assert_equals_file_content(os.path.join(DATADIR, 'writer', 'expected', \
|
||||
'sheet1_freeze_panes_both.xml'), content)
|
||||
|
||||
|
||||
Executable
+522
@@ -0,0 +1,522 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Tests for Tablib."""
|
||||
|
||||
import unittest
|
||||
import sys
|
||||
|
||||
if sys.version_info[0] > 2:
|
||||
from tablib.packages import markup3 as markup
|
||||
else:
|
||||
from tablib.packages import markup
|
||||
|
||||
|
||||
|
||||
import tablib
|
||||
|
||||
|
||||
|
||||
class TablibTestCase(unittest.TestCase):
|
||||
"""Tablib test cases."""
|
||||
|
||||
def setUp(self):
|
||||
"""Create simple data set with headers."""
|
||||
|
||||
global data, book
|
||||
|
||||
data = tablib.Dataset()
|
||||
book = tablib.Databook()
|
||||
|
||||
self.headers = ('first_name', 'last_name', 'gpa')
|
||||
self.john = ('John', 'Adams', 90)
|
||||
self.george = ('George', 'Washington', 67)
|
||||
self.tom = ('Thomas', 'Jefferson', 50)
|
||||
|
||||
self.founders = tablib.Dataset(headers=self.headers)
|
||||
self.founders.append(self.john)
|
||||
self.founders.append(self.george)
|
||||
self.founders.append(self.tom)
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
"""Teardown."""
|
||||
pass
|
||||
|
||||
|
||||
def test_empty_append(self):
|
||||
"""Verify append() correctly adds tuple with no headers."""
|
||||
new_row = (1, 2, 3)
|
||||
data.append(new_row)
|
||||
|
||||
# Verify width/data
|
||||
self.assertTrue(data.width == len(new_row))
|
||||
self.assertTrue(data[0] == new_row)
|
||||
|
||||
|
||||
def test_empty_append_with_headers(self):
|
||||
"""Verify append() correctly detects mismatch of number of
|
||||
headers and data.
|
||||
"""
|
||||
data.headers = ['first', 'second']
|
||||
new_row = (1, 2, 3, 4)
|
||||
|
||||
self.assertRaises(tablib.InvalidDimensions, data.append, new_row)
|
||||
|
||||
|
||||
def test_add_column(self):
|
||||
"""Verify adding column works with/without headers."""
|
||||
|
||||
data.append(['kenneth'])
|
||||
data.append(['bessie'])
|
||||
|
||||
new_col = ['reitz', 'monke']
|
||||
|
||||
data.append(col=new_col)
|
||||
|
||||
self.assertEquals(data[0], ('kenneth', 'reitz'))
|
||||
self.assertEquals(data.width, 2)
|
||||
|
||||
# With Headers
|
||||
data.headers = ('fname', 'lname')
|
||||
new_col = [21, 22]
|
||||
data.append(col=new_col, header='age')
|
||||
|
||||
self.assertEquals(data['age'], new_col)
|
||||
|
||||
|
||||
def test_add_column_no_data_no_headers(self):
|
||||
"""Verify adding new column with no headers."""
|
||||
|
||||
new_col = ('reitz', 'monke')
|
||||
|
||||
data.append(col=new_col)
|
||||
|
||||
self.assertEquals(data[0], tuple([new_col[0]]))
|
||||
self.assertEquals(data.width, 1)
|
||||
self.assertEquals(data.height, len(new_col))
|
||||
|
||||
|
||||
def test_add_callable_column(self):
|
||||
"""Verify adding column with values specified as callable."""
|
||||
new_col = [lambda x: x[0]]
|
||||
self.founders.append(col=new_col, header='first_again')
|
||||
#
|
||||
# self.assertTrue(map(lambda x: x[0] == x[-1], self.founders))
|
||||
|
||||
|
||||
def test_header_slicing(self):
|
||||
"""Verify slicing by headers."""
|
||||
|
||||
self.assertEqual(self.founders['first_name'],
|
||||
[self.john[0], self.george[0], self.tom[0]])
|
||||
self.assertEqual(self.founders['last_name'],
|
||||
[self.john[1], self.george[1], self.tom[1]])
|
||||
self.assertEqual(self.founders['gpa'],
|
||||
[self.john[2], self.george[2], self.tom[2]])
|
||||
|
||||
|
||||
def test_data_slicing(self):
|
||||
"""Verify slicing by data."""
|
||||
|
||||
# Slice individual rows
|
||||
self.assertEqual(self.founders[0], self.john)
|
||||
self.assertEqual(self.founders[:1], [self.john])
|
||||
self.assertEqual(self.founders[1:2], [self.george])
|
||||
self.assertEqual(self.founders[-1], self.tom)
|
||||
self.assertEqual(self.founders[3:], [])
|
||||
|
||||
# Slice multiple rows
|
||||
self.assertEqual(self.founders[:], [self.john, self.george, self.tom])
|
||||
self.assertEqual(self.founders[0:2], [self.john, self.george])
|
||||
self.assertEqual(self.founders[1:3], [self.george, self.tom])
|
||||
self.assertEqual(self.founders[2:], [self.tom])
|
||||
|
||||
|
||||
def test_delete(self):
|
||||
"""Verify deleting from dataset works."""
|
||||
|
||||
# Delete from front of object
|
||||
del self.founders[0]
|
||||
self.assertEqual(self.founders[:], [self.george, self.tom])
|
||||
|
||||
# Verify dimensions, width should NOT change
|
||||
self.assertEqual(self.founders.height, 2)
|
||||
self.assertEqual(self.founders.width, 3)
|
||||
|
||||
# Delete from back of object
|
||||
del self.founders[1]
|
||||
self.assertEqual(self.founders[:], [self.george])
|
||||
|
||||
# Verify dimensions, width should NOT change
|
||||
self.assertEqual(self.founders.height, 1)
|
||||
self.assertEqual(self.founders.width, 3)
|
||||
|
||||
# Delete from invalid index
|
||||
self.assertRaises(IndexError, self.founders.__delitem__, 3)
|
||||
|
||||
|
||||
def test_csv_export(self):
|
||||
"""Verify exporting dataset object as CSV."""
|
||||
|
||||
# Build up the csv string with headers first, followed by each row
|
||||
csv = ''
|
||||
for col in self.headers:
|
||||
csv += col + ','
|
||||
|
||||
csv = csv.strip(',') + '\r\n'
|
||||
|
||||
for founder in self.founders:
|
||||
for col in founder:
|
||||
csv += str(col) + ','
|
||||
csv = csv.strip(',') + '\r\n'
|
||||
|
||||
self.assertEqual(csv, self.founders.csv)
|
||||
|
||||
def test_tsv_export(self):
|
||||
"""Verify exporting dataset object as CSV."""
|
||||
|
||||
# Build up the csv string with headers first, followed by each row
|
||||
tsv = ''
|
||||
for col in self.headers:
|
||||
tsv += col + '\t'
|
||||
|
||||
tsv = tsv.strip('\t') + '\r\n'
|
||||
|
||||
for founder in self.founders:
|
||||
for col in founder:
|
||||
tsv += str(col) + '\t'
|
||||
tsv = tsv.strip('\t') + '\r\n'
|
||||
|
||||
self.assertEqual(tsv, self.founders.tsv)
|
||||
|
||||
def test_html_export(self):
|
||||
|
||||
"""HTML export"""
|
||||
|
||||
html = markup.page()
|
||||
html.table.open()
|
||||
html.thead.open()
|
||||
|
||||
html.tr(markup.oneliner.th(self.founders.headers))
|
||||
html.thead.close()
|
||||
|
||||
for founder in self.founders:
|
||||
|
||||
html.tr(markup.oneliner.td(founder))
|
||||
|
||||
html.table.close()
|
||||
html = str(html)
|
||||
|
||||
self.assertEqual(html, self.founders.html)
|
||||
|
||||
|
||||
def test_unicode_append(self):
|
||||
"""Passes in a single unicode charecter and exports."""
|
||||
|
||||
new_row = ('å', 'é')
|
||||
data.append(new_row)
|
||||
|
||||
data.json
|
||||
data.yaml
|
||||
data.csv
|
||||
data.tsv
|
||||
data.xls
|
||||
<<<<<<< HEAD
|
||||
data.html
|
||||
=======
|
||||
data.xlsx
|
||||
>>>>>>> 5350355fbe0aefe053d40fda03c0688a7b7eae3d
|
||||
|
||||
|
||||
def test_book_export_no_exceptions(self):
|
||||
"""Test that varoius exports don't error out."""
|
||||
|
||||
book = tablib.Databook()
|
||||
book.add_sheet(data)
|
||||
|
||||
book.json
|
||||
book.yaml
|
||||
book.xls
|
||||
book.xlsx
|
||||
|
||||
|
||||
def test_json_import_set(self):
|
||||
"""Generate and import JSON set serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
_json = data.json
|
||||
|
||||
data.json = _json
|
||||
|
||||
self.assertEqual(_json, data.json)
|
||||
|
||||
|
||||
def test_json_import_book(self):
|
||||
"""Generate and import JSON book serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
book.add_sheet(data)
|
||||
_json = book.json
|
||||
|
||||
book.json = _json
|
||||
|
||||
self.assertEqual(_json, book.json)
|
||||
|
||||
|
||||
def test_yaml_import_set(self):
|
||||
"""Generate and import YAML set serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
_yaml = data.yaml
|
||||
|
||||
data.yaml = _yaml
|
||||
|
||||
self.assertEqual(_yaml, data.yaml)
|
||||
|
||||
|
||||
def test_yaml_import_book(self):
|
||||
"""Generate and import YAML book serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
book.add_sheet(data)
|
||||
_yaml = book.yaml
|
||||
|
||||
book.yaml = _yaml
|
||||
|
||||
self.assertEqual(_yaml, book.yaml)
|
||||
|
||||
|
||||
def test_csv_import_set(self):
|
||||
"""Generate and import CSV set serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
_csv = data.csv
|
||||
|
||||
data.csv = _csv
|
||||
|
||||
self.assertEqual(_csv, data.csv)
|
||||
|
||||
|
||||
def test_csv_import_set_with_spaces(self):
|
||||
"""Generate and import CSV set serialization when row values have
|
||||
spaces."""
|
||||
data.append(('Bill Gates', 'Microsoft'))
|
||||
data.append(('Steve Jobs', 'Apple'))
|
||||
data.headers = ('Name', 'Company')
|
||||
|
||||
_csv = data.csv
|
||||
|
||||
data.csv = _csv
|
||||
|
||||
self.assertEqual(_csv, data.csv)
|
||||
|
||||
|
||||
def test_tsv_import_set(self):
|
||||
"""Generate and import TSV set serialization."""
|
||||
data.append(self.john)
|
||||
data.append(self.george)
|
||||
data.headers = self.headers
|
||||
|
||||
_tsv = data.tsv
|
||||
|
||||
data.tsv = _tsv
|
||||
|
||||
self.assertEqual(_tsv, data.tsv)
|
||||
|
||||
|
||||
def test_csv_format_detect(self):
|
||||
"""Test CSV format detection."""
|
||||
|
||||
_csv = (
|
||||
'1,2,3\n'
|
||||
'4,5,6\n'
|
||||
'7,8,9\n'
|
||||
)
|
||||
_bunk = (
|
||||
'¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
|
||||
)
|
||||
|
||||
self.assertTrue(tablib.formats.csv.detect(_csv))
|
||||
self.assertFalse(tablib.formats.csv.detect(_bunk))
|
||||
|
||||
|
||||
def test_tsv_format_detect(self):
|
||||
"""Test TSV format detection."""
|
||||
|
||||
_tsv = (
|
||||
'1\t2\t3\n'
|
||||
'4\t5\t6\n'
|
||||
'7\t8\t9\n'
|
||||
)
|
||||
_bunk = (
|
||||
'¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
|
||||
)
|
||||
|
||||
self.assertTrue(tablib.formats.tsv.detect(_tsv))
|
||||
self.assertFalse(tablib.formats.tsv.detect(_bunk))
|
||||
|
||||
|
||||
def test_json_format_detect(self):
|
||||
"""Test JSON format detection."""
|
||||
|
||||
_json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]'
|
||||
_bunk = (
|
||||
'¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
|
||||
)
|
||||
|
||||
self.assertTrue(tablib.formats.json.detect(_json))
|
||||
self.assertFalse(tablib.formats.json.detect(_bunk))
|
||||
|
||||
|
||||
def test_yaml_format_detect(self):
|
||||
"""Test YAML format detection."""
|
||||
|
||||
_yaml = '- {age: 90, first_name: John, last_name: Adams}'
|
||||
_bunk = (
|
||||
'¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
|
||||
)
|
||||
|
||||
self.assertTrue(tablib.formats.yaml.detect(_yaml))
|
||||
self.assertFalse(tablib.formats.yaml.detect(_bunk))
|
||||
|
||||
|
||||
def test_auto_format_detect(self):
|
||||
"""Test auto format detection."""
|
||||
|
||||
_yaml = '- {age: 90, first_name: John, last_name: Adams}'
|
||||
_json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]'
|
||||
_csv = '1,2,3\n4,5,6\n7,8,9\n'
|
||||
_bunk = '¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶'
|
||||
|
||||
self.assertEqual(tablib.detect(_yaml)[0], tablib.formats.yaml)
|
||||
self.assertEqual(tablib.detect(_csv)[0], tablib.formats.csv)
|
||||
self.assertEqual(tablib.detect(_json)[0], tablib.formats.json)
|
||||
self.assertEqual(tablib.detect(_bunk)[0], None)
|
||||
|
||||
|
||||
def test_transpose(self):
|
||||
"""Transpose a dataset."""
|
||||
|
||||
transposed_founders = self.founders.transpose()
|
||||
first_row = transposed_founders[0]
|
||||
second_row = transposed_founders[1]
|
||||
|
||||
self.assertEqual(transposed_founders.headers,
|
||||
["first_name","John", "George", "Thomas"])
|
||||
self.assertEqual(first_row,
|
||||
("last_name","Adams", "Washington", "Jefferson"))
|
||||
self.assertEqual(second_row,
|
||||
("gpa",90, 67, 50))
|
||||
|
||||
|
||||
def test_row_stacking(self):
|
||||
|
||||
"""Row stacking."""
|
||||
|
||||
to_join = tablib.Dataset(headers=self.founders.headers)
|
||||
|
||||
for row in self.founders:
|
||||
to_join.append(row=row)
|
||||
|
||||
row_stacked = self.founders.stack_rows(to_join)
|
||||
|
||||
for column in row_stacked.headers:
|
||||
|
||||
original_data = self.founders[column]
|
||||
expected_data = original_data + original_data
|
||||
self.assertEqual(row_stacked[column], expected_data)
|
||||
|
||||
|
||||
def test_column_stacking(self):
|
||||
|
||||
"""Column stacking"""
|
||||
|
||||
to_join = tablib.Dataset(headers=self.founders.headers)
|
||||
|
||||
for row in self.founders:
|
||||
to_join.append(row=row)
|
||||
|
||||
column_stacked = self.founders.stack_columns(to_join)
|
||||
|
||||
for index, row in enumerate(column_stacked):
|
||||
|
||||
original_data = self.founders[index]
|
||||
expected_data = original_data + original_data
|
||||
self.assertEqual(row, expected_data)
|
||||
|
||||
self.assertEqual(column_stacked[0],
|
||||
("John", "Adams", 90, "John", "Adams", 90))
|
||||
|
||||
|
||||
def test_sorting(self):
|
||||
|
||||
"""Sort columns."""
|
||||
|
||||
sorted_data = self.founders.sort(col="first_name")
|
||||
|
||||
first_row = sorted_data[0]
|
||||
second_row = sorted_data[2]
|
||||
third_row = sorted_data[1]
|
||||
expected_first = self.founders[1]
|
||||
expected_second = self.founders[2]
|
||||
expected_third = self.founders[0]
|
||||
|
||||
self.assertEqual(first_row, expected_first)
|
||||
self.assertEqual(second_row, expected_second)
|
||||
self.assertEqual(third_row, expected_third)
|
||||
|
||||
|
||||
def test_wipe(self):
|
||||
"""Purge a dataset."""
|
||||
|
||||
new_row = (1, 2, 3)
|
||||
data.append(new_row)
|
||||
|
||||
# Verify width/data
|
||||
self.assertTrue(data.width == len(new_row))
|
||||
self.assertTrue(data[0] == new_row)
|
||||
|
||||
data.wipe()
|
||||
new_row = (1, 2, 3, 4)
|
||||
data.append(new_row)
|
||||
self.assertTrue(data.width == len(new_row))
|
||||
self.assertTrue(data[0] == new_row)
|
||||
|
||||
|
||||
def test_formatters(self):
|
||||
"""Confirm formatters are being triggered."""
|
||||
|
||||
def _formatter(cell_value):
|
||||
return str(cell_value).upper()
|
||||
|
||||
self.founders.add_formatter('last_name', _formatter)
|
||||
|
||||
for name in [r['last_name'] for r in self.founders.dict]:
|
||||
self.assertTrue(name.isupper())
|
||||
|
||||
def test_unicode_csv(self):
|
||||
"""Check if unicode in csv export doesn't raise."""
|
||||
|
||||
data = tablib.Dataset()
|
||||
|
||||
if sys.version_info[0] > 2:
|
||||
data.append(['\xfc', '\xfd'])
|
||||
else:
|
||||
exec("data.append([u'\xfc', u'\xfd'])")
|
||||
|
||||
|
||||
data.csv
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user