pax_global_header00006660000000000000000000000064146517323500014520gustar00rootroot0000000000000052 comment=bed9ef1812f426be5cf6d696af0459175eee2c0a xlsx2csv-0.8.3/000077500000000000000000000000001465173235000133245ustar00rootroot00000000000000xlsx2csv-0.8.3/.github/000077500000000000000000000000001465173235000146645ustar00rootroot00000000000000xlsx2csv-0.8.3/.github/workflows/000077500000000000000000000000001465173235000167215ustar00rootroot00000000000000xlsx2csv-0.8.3/.github/workflows/publish-to-test-pypi.yml000066400000000000000000000062561465173235000234770ustar00rootroot00000000000000name: Publish Python 🐍 distribution 📦 to PyPI and TestPyPI on: push jobs: build: name: Build distribution 📦 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.x" - name: Install pypa/build run: >- python3 -m pip install build --user - name: Build a binary wheel and a source tarball run: python3 -m build - name: Store the distribution packages uses: actions/upload-artifact@v3 with: name: python-package-distributions path: dist/ publish-to-pypi: name: >- Publish Python 🐍 distribution 📦 to PyPI if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes needs: - build runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/xlsx2csv permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 github-release: name: >- Sign the Python 🐍 distribution 📦 with Sigstore and upload them to GitHub Release needs: - publish-to-pypi runs-on: ubuntu-latest permissions: contents: write # IMPORTANT: mandatory for making GitHub Releases id-token: write # IMPORTANT: mandatory for sigstore steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Sign the dists with Sigstore uses: sigstore/gh-action-sigstore-python@v1.2.3 with: inputs: >- ./dist/*.tar.gz ./dist/*.whl - name: Create GitHub Release env: GITHUB_TOKEN: ${{ github.token }} run: >- gh release create '${{ github.ref_name }}' --repo '${{ github.repository }}' --notes "" - name: Upload artifact signatures to GitHub Release env: GITHUB_TOKEN: ${{ github.token }} # Upload to GitHub Release using the `gh` CLI. # `dist/` contains the built packages, and the # sigstore-produced signatures and certificates. run: >- gh release upload '${{ github.ref_name }}' dist/** --repo '${{ github.repository }}' publish-to-testpypi: name: Publish Python 🐍 distribution 📦 to TestPyPI needs: - build runs-on: ubuntu-latest environment: name: testpypi url: https://test.pypi.org/p/xlsx2csv permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to TestPyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ skip-existing: true xlsx2csv-0.8.3/.gitignore000066400000000000000000000006011465173235000153110ustar00rootroot00000000000000.DS_Store *.py[cod] # C extensions *.so # Packages *.egg *.egg-info MANIFEST scripts dist build eggs parts bin var sdist develop-eggs .installed.cfg lib lib64 __pycache__ # Installer logs pip-log.txt # Unit test / coverage reports .coverage .tox nosetests.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject *.swp # Test *.csv-test # PyCharm .idea xlsx2csv-0.8.3/CHANGELOG000066400000000000000000000051021465173235000145340ustar00rootroot00000000000000version 0.8.2 (2023-Dec-13): * add "-" notation for reading from stdin * refactor float formatting in data processing * Added file separator ASCII(28) as optional delimiter * added formatted inline strings support * #228 issue fix version 0.8.1 (2023-Jan-9): * include hidden rows options version 0.8.0 (2022-Jun-7): * MIT License version 0.7.9 (2021-Aug-29) * add support for sheetname argument to convert function version 0.7.8 (2021-Apr-19): * bug fixes version 0.7.7 (2020-Jun-23): version 0.7.6 (2019-Mar-21): * reverting id field for sheet indexing version 0.7.5 (2019-Mar-7): * Passing "sheets_order" test case. Added support for workbook relations. * add floadformat to README * Updated the date formats to current ms excel * read and use [Content_Types].xml * Fix for missing cell ids ("r" attribute in ) * Refactoring, etc. version 0.7.4 (2018-Jun-5): version 0.7.3 (2017-May-20): * Support for "xl/worksheets/worksheet.xml" * Date format "float" leaves value as simple numeric. * bug fixes by Eudes du Rivau version 0.7.2 (2015-Apr-17): * bug fixes version 0.7.1 (2015-Feb-10): * more date formats * other fixes version 0.7 (2014-Jan-28): * hyperlinks support version 0.6 (2013-Dec-7): * python 2.4 support * python 3.3 support * setuptools * escape \t\r\n characters option * bug fixes version * seperate csv files for each sheet (#37) * #38 issue fix version 0.5 (2013-Jun-6): * Select EOL terminator according to OS (#32) * floating errors (#28) * inlineStr support (#24) * Add man/ directory for manual page (#23) * Misinterpretation of & (#15) and other fixes version 0.20 (2012-Aug-7) version 0.19 (2012-May-17): * issue #12 fix, some kind of unknown excel app version version 0.18 (2012-Feb-19): * Support for multi-region shared-strings (merge #11) version 0.17 (2012-Feb-14): * issue #10 fix version 0.16 (2011-Oct-26): * new date format version 0.15 (2011-Sep-16): * datetime 1904 format support * datetime format bug fix version 0.14 (2011-jul-15): * recursively convert the xlsx files in a directory to csv (Zhehao Mao's patch) version 0.131 (2011-apr-19): * skip empty lines option version 0.13 (2011-jan-16): * sheet no bug fix version 0.12 (2010-dec-21): * fix last column empty bug version 0.11 (2010-sep-13): * no numFmt bugfix version 0.1 (2010-sep-12): * better support for date/time formats * two letter columns bug fixed * sheets support added * unicode fix * boolean type - thanks to Neil Killeen version 0.0 (2010-jun-11): * xlsx to csv converter first release xlsx2csv-0.8.3/LICENSE.txt000066400000000000000000000020511465173235000151450ustar00rootroot00000000000000Copyright (c) 2022 Dilshod Temirkhodjaev 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. xlsx2csv-0.8.3/MANIFEST.in000066400000000000000000000001001465173235000150510ustar00rootroot00000000000000include test/* include man/* include README include LICENSE.txt xlsx2csv-0.8.3/README.md000066400000000000000000000077421465173235000146150ustar00rootroot00000000000000 # xlsx2csv > xlsx to csv converter (http://github.com/dilshod/xlsx2csv) Converts xlsx files to csv format. Handles large XLSX files. Fast and easy to use. ## Tested(supported) python versions: - 2.4 - 2.7 - 3.4 to 3.12 ## Installation: ```sh sudo easy_install xlsx2csv ``` or ```sh pip install xlsx2csv ``` Also, works standalone with only the *xlsx2csv.py* script **Usage:** ``` xlsx2csv.py [-h] [-v] [-a] [-c OUTPUTENCODING] [-s SHEETID] [-n SHEETNAME] [-d DELIMITER] [-l LINETERMINATOR] [-f DATEFORMAT] [--floatformat FLOATFORMAT] [-i] [-e] [-p SHEETDELIMITER] [--hyperlinks] [-I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...]] [-E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...]] [-m] xlsxfile [outfile] ``` **positional arguments:** ``` xlsxfile xlsx file path, use '-' to read from STDIN outfile output csv file path, or directory if -s 0 is specified ``` **optional arguments:** ``` -h, --help show this help message and exit -v, --version show program's version number and exit -a, --all export all sheets -c OUTPUTENCODING, --outputencoding OUTPUTENCODING encoding of output csv ** Python 3 only ** (default: utf-8) -s SHEETID, --sheet SHEETID sheet number to convert, 0 for all -n SHEETNAME, --sheetname SHEETNAME sheet name to convert -d DELIMITER, --delimiter DELIMITER delimiter - columns delimiter in csv, 'tab' or 'x09' for a tab (default: comma ',') -l LINETERMINATOR, --lineterminator LINETERMINATOR line terminator - lines terminator in csv, '\n' '\r\n' or '\r' (default: os.linesep) -f DATEFORMAT, --dateformat DATEFORMAT override date/time format (ex. %Y/%m/%d) --floatformat FLOATFORMAT override float format (ex. %.15f) -i, --ignoreempty skip empty lines -e, --escape Escape \r\n\t characters -p SHEETDELIMITER, --sheetdelimiter SHEETDELIMITER sheet delimiter used to separate sheets, pass '' if you do not need delimiter, or 'x07' or '\\f' for form feed (default: '--------') -q QUOTING, --quoting QUOTING field quoting, 'none' 'minimal' 'nonnumeric' or 'all' (default: 'minimal') --hyperlinks, --hyperlinks include hyperlinks -I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...], --include_sheet_pattern INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...] only include sheets named matching given pattern, only effects when -a option is enabled. -E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...], --exclude_sheet_pattern EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...] exclude sheets named matching given pattern, only effects when -a option is enabled. -m, --merge-cells merge cells ``` Usage with folder containing multiple `xlxs` files: ``` python xlsx2csv.py /path/to/input/dir /path/to/output/dir ``` will output each file in the input dir converted to `.csv` in the output dir. If omitting the output dir it will output the converted files in the input dir Usage from within Python: ``` from xlsx2csv import Xlsx2csv Xlsx2csv("myfile.xlsx", outputencoding="utf-8").convert("myfile.csv") ``` Expat SAX parser used for xml parsing. See alternatives: Bash: http://kirk.webfinish.com/?p=91 Python: http://github.com/staale/python-xlsx http://github.com/leegao/pyXLSX Ruby: http://roo.rubyforge.org/ Java: http://poi.apache.org/ ## Meta Dilshod Temirkhdojaev – tdilshod@gmail.com Distributed under the MIT LICENSE. See ``LICENSE`` for more information. [https://github.com/dilshod](https://github.com/dilshod) xlsx2csv-0.8.3/man/000077500000000000000000000000001465173235000140775ustar00rootroot00000000000000xlsx2csv-0.8.3/man/Makefile000066400000000000000000000002041465173235000155330ustar00rootroot00000000000000# Makefile PACKAGE = xlsx2csv all: man clean: rm -f *.1 man: $(MAKE) -f pod2man.mk PACKAGE=$(PACKAGE) makeman # End of file xlsx2csv-0.8.3/man/pod2man.mk000066400000000000000000000033561465173235000157770ustar00rootroot00000000000000# pod2man.mk -- Makefile portion to convert *.pod files to manual pages # # Copyright information # # Copyright (C) 2008-2012 Jari Aalto # # License # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Description # # Convert *.pod files to manual pages. Add this to Makefile: # # PACKAGE = package # # man: # make -f pod2man.mk PACKAGE=$(PACKAGE) makeman # # build: man ifneq (,) This makefile requires GNU Make. endif # This variable *must* be set when called PACKAGE ?= package # Optional variables to set MANSECT ?= 1 PODCENTER ?= User Commands PODDATE ?= $$(date "+%Y-%m-%d") # Directories MANSRC ?= MANDEST ?= $(MANSRC) MANPOD ?= $(MANSRC)$(PACKAGE).$(MANSECT).pod MANPAGE ?= $(MANDEST)$(PACKAGE).$(MANSECT) POD2MAN ?= pod2man POD2MAN_FLAGS ?= --utf8 makeman: $(MANPAGE) $(MANPAGE): $(MANPOD) # make target - create manual page from a *.pod page podchecker $(MANPOD) LC_ALL= LANG=C $(POD2MAN) $(POD2MAN_FLAGS) \ --center="$(PODCENTER)" \ --date="$(PODDATE)" \ --name="$(PACKAGE)" \ --section="$(MANSECT)" \ $(MANPOD) \ | sed 's,[Pp]erl v[0-9.]\+,$(PACKAGE),' \ > $(MANPAGE) && \ rm -f pod*.tmp # End of of Makefile part xlsx2csv-0.8.3/man/xlsx2csv.1.pod000066400000000000000000000054351465173235000165450ustar00rootroot00000000000000# Copyright # # Copyright (C) 2011-2012 Jari Aalto # # License # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Description # # To learn what TOP LEVEL sections to use in manual page, # see POSIX/Susv standard about "Utility Description Defaults" at # http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap01.html#tag_01_11 # # This manual page in Perl POD format. Read more at # http://perldoc.perl.org/perlpod.html or run command: # # perldoc perlpod | less # # To check the syntax: # # podchecker *.pod # # To create manual: # # pod2man PROGRAM.N.pod > PROGRAM.N =pod =head1 NAME xlsx2csv - Convert xlsx xml files to csv format =head1 SYNOPSIS xlsx2csv [options] INFILE [OUTPUT FILE] =head1 DESCRIPTION The conversion uses Expat SAX parser for xml processing. =head1 STDIN Use "-" for INFILE to read from the STDIN. =head1 OPTIONS =over 4 =item B<-d DELIMITER, --delimiter=DELIMITER> Output csv columns delimiter. Use "tab" or "x09" for tab. Defaults to comma. =item B<-f DATEFORMAT, --dateformat=DATEFORMAT> Set date/time format. See strftime(3) for %-format specifiers. An example "%Y-%m-%d". =item B<-i, --ignoreempty> Skip empty lines. =item B<-p SHEETDELIMITER, --sheetdelimiter=SHEETDELIMITER> Sheet delimiter used to separate sheets, pass "" if you don't want delimiters. DEfaults to "--------". =item B<-q QUOTING, --quoting=QUOTING> Output csv fields quoting. Use "none" "minimal" "nonnumeric" or "all". Defaults to none. =item B<-r, --recursive> Convert recursively. =item B<-s SHEETID, --sheet=SHEETID> Sheet to convert (0 for all sheets). =item B<-h, --help> Display short help and exit. =item B<--version> Display program's version number and exit. =back =head1 ENVIRONMENT None. =head1 FILES None. =head1 SEE ALSO catdoc(1) =head1 AUTHORS Program was written by Dilshod Temirkhodjaev This manual page was written by Jari Aalto . Released under license GNU GPL version 2 or (at your option) any later version. For more information about the license, visit . =cut xlsx2csv-0.8.3/pyproject.toml000066400000000000000000000033331465173235000162420ustar00rootroot00000000000000[build-system] requires = ["setuptools>=61.2.0", "wheel", "setuptools_scm[toml]>=3.4.3"] build-backend = "setuptools.build_meta" [project] name = "xlsx2csv" authors = [{name = "Dilshod Temirkhdojaev", email = "tdilshod@gmail.com"}] description = "xlsx to csv converter" readme = "README.md" classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: End Users/Desktop", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.0", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Office/Business", "Topic :: Utilities", ] urls = {Homepage = "http://github.com/dilshod/xlsx2csv"} #dynamic = ["version"] version = "0.8.3" [project.scripts] xlsx2csv = "xlsx2csv:main" [tool.setuptools] py-modules = ["xlsx2csv"] include-package-data = false [tool.setuptools_scm] xlsx2csv-0.8.3/test/000077500000000000000000000000001465173235000143035ustar00rootroot00000000000000xlsx2csv-0.8.3/test/datetime.csv000066400000000000000000000000251465173235000166110ustar00rootroot000000000000002011-09-15 15:22:00 xlsx2csv-0.8.3/test/datetime.xlsx000066400000000000000000000777571465173235000170460ustar00rootroot00000000000000PK!t8b<[Content_Types].xml (SN0#(q!#P>ē4^qKL\ZATroɛ|]ʚM KTV*u޲0Rt@lV^^䋭Lm`msZ3Nm^}Ý~=ʚ&`eXu!y~w*pSd_ȸWYh:7~f2'Y9pںVH[4y[,\cvIG{w "Sgi <.lhCj{tN F>( Ot(APK!}T  _rels/.rels (MN0H} PnRwLibv!=ECU=͛f0={E tJFkZ$H6zLQl,(M?peKc<\ٻ`0chGaC|Uw<ԀjɶJ@ت` %TKhC& Ig/P|^{-Ƀ!x4$<z?GO)8.t;9,WjfgQ#)Sx|'KY}PK!?d-xl/_rels/workbook.xml.rels (JA 0ftzlݝ&iuްbPKKȗ_֛i4G<`*J0|lYx۽=aqqc da&M}{~щ.q?$6B/49.b6ɉar~:UY>`6椗m;xz0Q '==D.w$N-eRJ xfuMѐd?2S_;<{r PK!8 xl/workbook.xmlRMo0 toM]P=2 DCgߏVm.t(|,'brQH`cî߿ݟ]IHF; PH~1BdGoJ{i1zMƝJ}ݤST^ /ضCHO퓬:x<0?k}ON }h,AS vqWquE!F,,+ rJpz E4Szz0ߘ+'+ybWޘCOe?o:Ns/s\(ي: `e|˗mf3~6yG 1 n9r$ }JTl3_CDL WyWǵ&n{' V7ZU5PK!J xl/styles.xmlSMo0 to { C{i6JG#@Dq(;>.6I=OT|rV|`L&Jn6R?m|Wkc%GLR&-I0O<ߕJ#:HG'mةG2YUl6_e]S0xdqe`TuĨC O0cm]eDqc{a:ex`]6!j2'Cui%+z6(86.xl l8=_̯ ?]I7;m澢͗.7ixI&s7J,3M|`+Wf0_\U`N}ZuVW_[,J+j3oS#PK!{֩xl/theme/theme1.xmlYMoE#F{oc'NGuرhF[x=N3' G$$DA\q@@VR~MԿ;3x8!zgkf㘡C"$I#^$!d:W$N4 w߹7TDb>DJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK!txl/worksheets/sheet1.xmlTN1}Xl.@*@HTDM ^l7ٳI;TH3dyy0 Dl'1g`kVۓ " ,T"\}ܻ;d`c;D_EG΃#a[D@49b:F(2|õpdo@ $S>8#sO3 jdw]`ˣdpѵrJ#d33#˻uAԚL2YvpT#KfW~e6akhT<;oe6*ZVZ6ħcڊ_MR0C>*ǿ E S gjӋw*rD~R v@$hE퐢T_:MɌJDP<dz3Gt 5C~fr#PE/RM Y'S$n5[fx:?~.!җ@ @ĵi`Qb2ዧ8-[!V4x4'ya0fؠvH91˭s9bn{ϼ6 .(.` 9(J<|>]Lyk#FG0y4<#Aꃅ59e?mHA^mL3/VPK !cLaadocProps/thumbnail.jpegJFIFHH@ICC_PROFILE0appl mntrRGB XYZ   acspAPPLappl-appl dscmdescogXYZlwtptrXYZbXYZrTRCcprt8chad,gTRCbTRCmluc enUS&~esES&daDK.deDE,fiFI(frFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR@zhTWlzhCNruRU"plPL,Yleinen RGB-profiiliGenerisk RGB-profilProfil Gnrique RVBN, RGB 000000u( RGB r_icϏPerfil RGB GenricoAllgemeines RGB-Profilfn RGB cϏeNGenerel RGB-beskrivelseAlgemeen RGB-profiel| RGB \ |Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&ltExifMM*>F(iNHHCC }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<7xcWմ0Rɮo BqQqss;G,wnwm[vݒշciǷz-~Ǟ2x7S#|ccx[FRzWoiǯh2ϫh Km>;(6}%S^pQ-vuynrwFJBiTY.6龿R|1> o|>05tMv|6W%;` "$֙Y'[g);֣V*o%U{= VZ<䤯giM=S=xQ|0}:Eڿ弟Oh/qڣajڗj~I^R2rS$lp:U8'ktʚ{.OWkF/g'h+?៾НM:?៾НM:?៾НM:?៾НM:ˆne_蛣:^'`x3׭xx^3_׺S\Os4,݉ڪ;WN21*bcEh|l$<5NNRrmv{O3oO\H?|&;D^t h?';|2KxNWΑik>%͌TA[J$|MT ^ (i|4i-u/^',nӴ嶼on-DWHf$GFWVPU)$M]:Of~n4;5NOj.|7)]mGZ,n:e<v44Wf,;1i/h5}ⷈoo~NENtO š>=VI_ 2g/wS׫N^mۻ5ciJ޲ zo! N?W|W|''gO)Ɓ /T %ŵ IUiԊ'^e+'+4ѧ=L|O 8*J2N2KFu{3~  h& k^Mn- { ӫn;VP)#/*s]IyG $):r^m&",O3EʴTegg7ů Dh &-[Ιk,AC^<7K[[Oz7xVŧu_ڇ_ KPhf)Պ{ZiiFl%)Y/fr%(/MSӝU'*tUajr[W> |CQM+ >t(W)gE,oZ|7Ms1eɞbO;?T8)ago.}bTa+eKQ}OdQ-I-嬷~#3^ZIx]:"]<OK<@Ҙ"ƽEVZU:p'5wkhS:J2i˚sdTFz.[^ײ/_M_ "5j@o?<)|RGZ֭i:>ayjڮmrN4>KCPc[#WTF`|㟇zşQIºGm4D}mڌZf/vc/ ohG-5K9|u0qM~<x7:hB2i:'W=Pin imշv{iyD Kk? M?"/"/|@Mk:ύ iuOinlBk^A ůo,◀?2.Vۑe>5M^ZDo,VKKۻx%> h%ek "a5}r y$DE!IcZ׫Tn_i.k^-eBN#k^mwos5|e7ßx~7/x CIмO_뚖hڄF3T ; UԐETg(INq]%}Х$$ZOf[?xzŸeCU5-+hVڞu&mkkl\]}J 4jUjU').ИS48F k=G_ "5fX}/_OǶ5E~ZjsqmA wo$&,K!tGuWe ̠*'$;w咕v&y8^oۙ5;^cmgFw 33x{FZגhӭd"ьi#TύKs9Jݹݼ}=:p!_,RSs򚠰W_|9爿M@{CᎳ_j3]xsŲjΘoΟ ރ![;Sh/.Ois =\*NPQm=w>3*EqS%u|0e|W)oy{j~#}GQMܻ2^_nr$(J.zs{ۢ]8*1w{6OBW_|9爿MPP}/_^4Gů7V 桧zQ. e7R\@ lg}_F/?77+٘bc^7/*|ֿ/7[u*kŸ<1Gt^Hӡu8ͬZ$3ђH؇FR8\L+*si;jKe^[RNSMnn4|tC࿈.>~ϋi|W sEn ^ Ԏ?4?tuO 4H7]*CJX|Wjq^\?y5J^H8R%'+JKKVm-w ӟV&kԂ?\S5?:>?2?3 G??% &db)kLa9cn qmI4ii٧%($i4M>S=3pl?!,?`  I|Wew O=uxu){ ٝF!1h??g;g4xsW"ğ#= FOwX~7NWƷ5-Zōk:_|6oѿ>fiKVᧆ>xZ+x |5zKF᫯)ԭ)_|>#}#2"#O h bkY@< ~ xi?Kᖱ! _c|g_ |@-I#ūF^jՕ:G?X~ў2Я|q{|VǾN]oooiVF|=5M3׺*~0ٟ~<|~~j^Ӽ=㏆்Z|-j? ?E_7ƹ?Bѣ𗄼-?O5}^ g|U'VXeլ6e8ti)wpl?| Csa_<7?@,?`  8xo6~1EKv([$G4M^ŝUEQ1,$"1K,Z.b% fʲ* @_| Csa_<7?@,?`  8xo6~X>9_l?CT?9suekZ&FkkkuQEVtJn68eSi٫s{ەpՔ&#>IA|_RiowFvGoCTfmB:OϻgueWY>uUwf֋;fb|AI'$ސOQ yQ( <T_?€*/@_ʋyG|/PE<(Q yQ( <T_?€8F| cBN%T";o*/@_ʋyG|/PE<(Q yQ( ,Q9ǟMW|g^(:Lqt-$QrO-!<#PGWoxl~0N:6Iu_ie-Eg VT4e?>r2#|xքR_Vɥg)*ҷYZWIyJ'/#w~X\^vm0|s?_So.<)amgGLYxXB|9q Ix5ֺaiBRFOPIJܶ79ki=ZuvIE{yܭ-ʭLx':燻 yF~}yyV' _ׇ$~.M?uQ3K1C4͕VGh Ƽݶm{+WmlЕWn+]$vIyC׌0OQ?C׌=G 7@"z^1nDc<7?=xxo?z3t'fOQ?C׌=G 7@w _J3]` ?~X&0TIvȧ_>$^𾟣wl(WׅwHa ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_]]^ p#T,%j%d2rFHc ?Au_] ?Au_] ?Au_] ?Au_] ?Au_] ?Au_]?u>+VGmc YNFTY %Eg aA8k&Oh(fEtIWX¬0VMedUq (l :. :. :. :. :. :.>-"Ꮟ!VekuoKmg(i;mZk1)$`0M`|Mᗄ[^ot5[\NR-u Uuz~w:iԂktתn>wk#_~9$m]/HxW0>,-u;xVA]690hʍeJr3U*JQ&Z7+/{K늴9Sԃn>#s5.{>f\+lW2gK_;@A/to>gK_;@$tV͢ꊪ/f63NM'u<7}_LWMJVV r z3}CΗv:_?? kh3}CΗv<O Pt=i#;wݬQBh> |1{|3𖥫3kOws\Nak#<k]GSO %r^X|O MG^_GctCXγe&gjWw .'<5[TQs5i Fj*qWV8b)ޝ>Iʜ#—7;rm885djڷ}-~xG!IwE?kd/1>xo×?|;4啿Իym뺜q{pƋ(¢*Ͷmۻm{ޭzDI$J-KdDLS-'ӿO зNj? z FO зNj? z FO зNj? z FO зNj? z FO зNj? z FO зNj>xgÓ+óOid՞Yt $veܳRē@"o@>)@"o@>)@"o@>)@#c"xwBGMTtu4eu!A o/<9I't)$Dҝ=`fvcnK31%I$S-'ӿE/oö |qmhSZb)RG"@u`y~uisk)M*,m@3_y8'"-kxԠJ^KvP[]۹*uܛ%E6cY]]_[&ώ|UZT'x$BOĿxoAy~'Xzׇ3j/^kaq-SIёml5{[X|CS$ь>TZ䲓NZ_mW$O(*HMѧyZ:.g33嵉xWkd# \~ @ '^AKG5~(ׇF WrɭjI$J1QC&X(cmm+ɽޮBݕݭwۥ޶=+;'m>;'m>??|_Cv oO;'m>??|_Cv oO;'m>??|_Cv| {)m16O7_A9;'m>??|_Cv oO;'m>?5ƓƂHG~|SMo%w g84XО?}Kd~h0Bn]T݁(g;'m>??|_Cv oO;'m>?ϋZ/cɮ]h-.y5$~o-w25~ jzu[Vz^Xvןi)gkq{|EC35ZuxۍMVQuNJsI,^ֺ?T_vU2?A4?)'g%@D|K{mð'YQodɺMoRyxYRc#G Hƿz_ڏ'W&+@?[h:ߌ,x{qZ+n/${:G>%hm\4IzuRTq/iQ8I5ng{)8/hnU#}fSW8TŞtg&?j4P@P@P@q FF@P@oxYՖ*g_F-rCy$}\ 񦰴/IIgoh䚔;$և~~ˁ¸I ǖ y\Tujvc _u? |'~n{!\4%}cg 7SI95R9;rr)61cFQ%H_g&i(?>Йwvg&i qhx?Bf}?>Йwvg&i qhx?Bf}?>Йwvg&i qh?:-B67wvBYwt$PW ?<|3O?Lﻏ;@34 ?<|3O?ek>Zտ#Jn!$д[Iqu3^|4p+I14 ?<|3O?Lﻏ;@34 ?<|3O?p>|.оY)eiiol/IB7# ($G 47.mo} d31#?0X⷏\β5m~oa'|}4fOx?jĿB֟o?YixoCO7էV!_sk1/ntBIRK,wS'W5U/)~Ӽ[RJIm9?mN4ʤފm]~=Z:ӟj/x[|_PDGïeJ5vK;VB,dn[&ݮ{t^B{+k[s<1r? ~zw矆?=OP?(Sn7xycs<1r 9~?9@? ~zw矆?=OP?(|13fO?3GI8];9~?9@? ~zw矆?=OP?(Snxw͏^_>l:b~ܹnxZoƿh>T~t+yԷafvn8 9~?9@? ~zw矆?=OP?(Sn󿋍V=l~/" <+R)cs@Oÿ |>𾇫]xjz>7w"X[Dݮ%nXSڧ_^Ͷ\6?M>ax[  FAָ~E)gg֨4U_@<7mÑMu~m$+ >Oco.E.+(i6]Sh7M4٤GU׹<-?Ot<-?Ot_?U W@, !]<-?Ot_?U W@, !]<-?Ot_?U W@wxneUz!H׍=Uvs@, !]<-?Ot_?U W@, !]<-?Otxb]\//ˣq:N 2GV d|7 C)//Ţq:Xp̭Io? X'Cʺ?`x[/*o? <ߍ9}ǖvwqsmbVM\I,U 4tp <"s@i5-p y$&孚N]ڒk{^oM+6{[j~x5u[ٳ^t3&~>*=C§g}i߳__j0,"]5Ť&!7`GJn B->JXz iQJ.Z{qjTs,E~V9.OZχ:/U ~ ]k qondKxfx*vl^P8*x{FrJwvuBeKb4c/WI?)c?ßH5?B1U[Ԣ^%P41i%3ǕfݒnY+.td۲JݺozY_UkHauWVɴeAUmY_Uk@!__Z&uWVɴeAUmY_Uk@!__Z&uWVɴeAUmY_Uk@o YگV)ub_0Gv ?6C/*M/ sh:+«\??6C/*M xF? [,SG>JN:=WRG̬ h$:ɢNV?qƥ`b* ' 0p(k/ sh:+«\??6C/*M/ sh:+«\󯋾_۔ x_7I?⋟?lڧ_;~? \b,/tԴ].Xm͗ ?kVNguUuG{:iNNP"RtgzA}xxq-; ~-ҝoRi©NdHc^'k6ݛѵ}Wv}~bm䒓Ii;ji6դdzWWhYy>=_ÿV^3@W;e34hYy>=_ÿV^3@W;e34hYy>=_ÿV^3@W-4 "_C#'/v`9Hsq@W;e34hYy>=_ÿV^3@W;e34-CG@Ft}LH⫷uCe>T>@쫒<\7ÚG|> K;0lgA̸,)$nldmhYy>=_ÿV^3@W;e34hYy>=_ÿV^3@wnolj{Ѽ--xha6r+ve92&w1UG>hZ>tmKZKL_ǥ@_d/{mvki|8lDҒY٩*riw'ߩXxFU)FU"kǯ~_?2Kڏ C^23]#¾%? |HREvaWsWIs( :81r\4nJU8GVrmWWP)JJ2jR?F?g io8;?A_QW9 z_uC5$[.5]SK/ 4VU?c4IRx$K8GP*,jťvޭm&F% &fc[ԧ#FGVkM4i[gZjI4M&wM=SO{O|Cgoeǩ ?=O ?=O ?=O ?=O ?=O ?=O 7mq} U)uK4͔ᕥ 8#h?6x{_zO|CgoeǨ?6x{_zO|CgoeǨ?6x{_zO|CgoeǨ^:dcZ&"jle:Iff 2I8xo> úR@I#tGլ# ͐ ?6x{_zO|CgoeǨ?6x{_zO|CgoeǨ?6x{_zO|CgoeǨξ.W <{ig]º6jv4g*qFwv8UPI'f1 ]Xh!0}Yehz%!n<$%4ծ]uL[oW!79nv׊n[|' azmU)Ք.ȝHqZ.w_'?K?xZUOӖh^k:i#:֍{jI%޹MkWw31rbslmp]8UW DTi-fhOS?l3@"z1c?}[CfD?|c34'?=O>-fhOS?l3@"z1ccQ-fhOS?l3@"z1c?}[CfD?|c34 Q^.&OFrIÈ_km'k) 煵)<=-fhOS?l3@"z1c?}[Cf<߆_><ƞ)H|-H_}VRH2'ly{#HkZL>g-|qIK{ecFaY'K>-B=Fz!JoM7f-ƛO]+VrK Q}T_̹&y_~ wO] k?;.OStG')˺?#?g~ HODY߅?w@$~'}Ÿ?>wO] k?;.(|6uX(K F2CRmb9Tg#r(OStG')˺?#?g~ HODY߅?w@$~'}Ÿ įk"G5y[Z,jS5v bYU''NW xYyM%*&qvR7Ѱ܁#*.!q^g>|9\CShEiJ7T|hϋ"A,bM2*/mLD)zZͯ+~*S^E%6&ClR?| Dlɲt)m뒵_=$J4BzlSx C@ 1!sKv@9Qw$j<z P&K%gK߆f0PC,Fj6 ̍h=M4ŽVr$g9Yu]1(߶ϻaԕMI`Ud Wlߏ q,π@ #1Z Y Qetcߢ@FD-S?:].)j& GH[~MUCq,KPKBR@yPKX_N@docProps/app.xmlAj1 E2xxEPmн5X2&dΖE+Ti__ofIcsR#a֭j=C&W[TvH52P`ԉ9ﴮյ(IO%9[M}= h0`!_h ݯ~,uyyޱhDmkokdgn"z2Z PK^}gPKX_N@xl/workbook.xmlQn0 (R4iڤq6.H*N)|œVնN篏ZvٌO' g` =e gU8 z9Ν;3[xB j׀J|-Ax +P&ɽ|PXh|Dѧ Q[庌3F4M u}U*E1^@EҐo2[_zk2;n-ML_j VQL󊑧TcV ߵd:Y9oPK5eUPKX_N@xl/theme/theme1.xmlYOo6S;:A֦ bCLKl(Q$lmV`u؇a|=Ltt-!{|H]ݝ"rVP |DӨ<nm;[2& AN- b) Crx:i ԡ1>bõk'xȏlj<Z˲`Fa|[SǵIղ F8b2JHcB<=Ա X1d@N ͈i~tW;9xڜ#'.33NmX>!Sڸn.auG$}4k9>:u&.RHzsn#q'Ii؏cQ!j ~Bw?q1fL%h&43 U\wa+һ/,{x z vQ./[egj[)Srȃ\9lL>U,Ǣ;H`MRcAO]G(/XG9xg9=^@_.IQu,X[MϛB)oXHj5-.ujʠ̼jZš} Yp$W,)tqQQ$#b\L[iߕ!TFu7( bKd03JKR;XN[APV0S(<&8-Wf\܄R6u4n v8yl|_bZȿ֨`{7 @} )7!D6)ծkxLBi;ۚQ3"wDяGh&J2A'͗k}ƙy̲Rݜg:*imf_.w*j;SH9$WV9T,aO-p{ L"'9C5XreIG5jcXtDY{HNjpbu]M2qa7TOm\L2tw5.^w_^̺UYlc*֜k;jU?] R`"d[Pj+OfFշTUS!]M1&+B(.Z=&]ūǛ0ck3) S9D;F3pOrg0y ]C>,7rb#::+RS56V|UUCKX;++ 2X_BoZR,+&[Bxm9yY˚t[L]mR`i/l:&un PKP|,kPKX_N@xl/_rels/workbook.xml.relsN0 _%!l]v^ jܦZD8HVNƥH'?_Ыw`*JP8rsg{|HG 9=kMR41EV'[lzU:=S흁w1Iޱiw>J@DzTiVK o/mFYV=ǘo<,Ir3x$W/n PK<*BPKX_N@xl/worksheets/sheet1.xmlVKn0 }1$E~-]3eD4WGHcQn8$|ǷSUGZ!똆^@ Szӭ_(i53Vʚ+oezh 5iu6-xZO6&bCFqMUςܯCXy.R~-mk@/m!&Q&3!1}oId,xS3ܟs{)!Z6xxY< "ٶW"2] frhiVq)4y˅Ne ђJPR'g[zhsJme՝,f7c ; =ۿj09f=[9ڰǩ1 "@<߱v@jbτ1w!@vBD t^&C(<)> Mg$} f5,<2nH33groZ$yC Y_l o=0^LfCfӪlZVOӪմbZGx03p^#enz.*6Ėr[j|U_\DزmJ^6DEٵP(6GFsGRaЁqmH!xfu#Ph`>/F*Д4N<7ؔPKIv;B PKX_N@ xl/styles.xmlYQo0+RZV&"=L$&AJ;%fUeZb>_~^oz8ək["c^ݕmU9}~E@"{%eq:%e@I(X:U)(YTTιNA2faʙ9_3ٗ(yHTO܈j.%Eo^0-2gqoOМ\Xb9Uk)8WW@_r~P7&$RR0@79zvV-!▂l'ʱqT<ttwz%gVS2lB l)`Ԍ$JAOaNSrE\KK |[ddv7lOUJE\xB?!jȢPiLr,T77y~}IwsMju1-'yׯZ!ɳ%+(Sn.t.ۥcDE2ޮSR`,nQ4XvSw-"5~䡓tޟ RK]YRA:Tow_@5|-G@q$HA2Hn1KNUwԋrkj]M -.yUjtnFM܌;j#u*eBP=nǍ?<ǁP:v^|6B :}7/htc fD7ڶ|ݔ)lY_oKyQv t '8Ki][T{Њt*tGII&>dI.gA2p!#ɈjCw/݋LWä+ `B "+ǰAyN@$49I6 4"D.6c#=#1?_τaS.#Ghrc].1LcD!. 5ɞ3DH # tP| ec aŽ P.$yP;Ϝsv'PKZnPKX_N@xl/sharedStrings.xmleMj02 Qv)BT{bZ#W3 ٺzɦ <=Or=0TlTQ X 5:#uU0 $%q:a5:3? H*Cyhz9?jg,)}$)IA$q{Fتl&n#w&ܸؖrM&'K}G'$a2wR\sͶǔ.o[O^ 8`0F@Q] i=p_.ZPKbPnPKX_N@[Content_Types].xmlTN0WjpJ&4VnKm$~M6G3ٱ^^'M 9GR/~QU٥H킇Bnl:yF@ Y+јWM ٚd Nt6Nq#ʖ`Bj؇I=uGsaL Ը9SS"F[?(mQqVm ,2$$ƷB}]aJ|5O؃Bv(CePK8`PKX_N@P _rels/.relsPKX_N@BR@y(docProps/core.xmlPKX_N@^}gdocProps/app.xmlPKX_N@5eUxl/workbook.xmlPKX_N@P|,kYxl/theme/theme1.xmlPKX_N@<*BO xl/_rels/workbook.xml.relsPKX_N@Iv;B  xl/worksheets/sheet1.xmlPKX_N@Zn xl/styles.xmlPKX_N@bPnxl/sharedStrings.xmlPKX_N@8`[Content_Types].xmlPK xlsx2csv-0.8.3/test/escape.csv000066400000000000000000000000321465173235000162530ustar00rootroot00000000000000,,,,Hello\nWorld\t!,FALSE xlsx2csv-0.8.3/test/escape.xlsx000066400000000000000000000173101465173235000164650ustar00rootroot00000000000000PK/RK=[Content_Types].xmlUX RꝲLŔQK0+J^MiG8%&kX{7uM$sR-˶dŴ(EN{cݺJ,j @kբ1\KI^Q8i<*2(Qkڻ.1eyu8xz|BHiͻ!1kBVɭ3hZB~M2^/ZEy h8"GMc5pKϖv0Gn7oRf"uf P 8(&9N3?zPu@~1;rCDU^0{cRÚPKtE2PK aqC_rels/UX R&RPK/RK= _rels/.relsUX RꝲLJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTu[#"*ZRGDT~h%GRX[RK˰ŏRUZNh1AS5Z׀w/~1Z f%/dVjjd.ח}ji2B1,D?dn.:o 'e,2F^PKpPKqCxl/sharedStrings.xmlUX RR5 0 )jӃA@\t6 ^_Bzab@!uw4]ϛ(KڦESbtԚ2NH$KVxsA'DGHDuBcclkCbniw k\(\640DRbY*m ;n! ~Te=;039gNFxfb_*`A }<4Kd-1fӫ~'U^gM6<{(G=s̰P j*2Zg|Jd+y%2$Z$q5g™rbLaN,:(wG 7**^*u&SKXC&%n` LC!Ӑ?~8bөvddbnB8-u+[n`7nFzF5J7[[3[Ӭ3|I\ABr$U787|oD,VZ V$T]F r"U: 8J0־ϡzP-PK!0s_ kP} W9PiPkPK7Y8DPK/RK=xl/workbook.xmlUX RꝲLRMo0 W/hAbhQnڵgZc-dHt׏V6"Ίhd1˥@6nSɟ7RDz|(/ןV{[.V%YUęq0l[DlV<8y`XMc^{5t@ؚ>1WXX%AԠCJ6`#տP;k@X\ O1O>G+ɛmL0n [ JRR{iQq ̼7N37MˣE9垍=?[S2yy{Q.-i<^ifL qig- KÅpˑ;9+OϒI[W|=CtQk9_O{YEε PK]z PK aqCxl/worksheets/UX R&RPKqCxl/worksheets/sheet1.xmlUX RwRVKo8W:uk=;E:X[`oDYD(QKRv_CE h{M#悰f3up4i{:B@5x`~ZFJD^kqIX'ZQ }?jDG濂ʒ]كpLEEZ\9RyNI3+Q6wX~m&A04g@ `O\:0 > mN(+7\%NWvN8pDNkH`1Vm')v/7 l}S?3+hVZTE:Gg6 :'șSr,=UPNջQHoO_4{"b^XS g*KkcEZM󿆷4K1aҸ>S1IQ+TL) <^ IBU YW8K~H4Adu>Y2y #??}Iq~>gpQp|bsާxq%aŗ>Ing>;"ȉM 4P4#]Cn@D,g3fNHVu~'UJmS}"\ҁ1a>Khw{ۃ`b}=|m 1dirmǒSAy:vK`( =bF"zIa`KS3+,E0i9,tx=@YU'RA}\d0$ΪFg!uϷM"%=j 5%c-QJ &s$\H5At^[u>``LO|Ij̡~KT3倷\ ӯyp&|G^#&îx'+U`~과 u R@}#5=jۢx8++o=SPK9, PK qC__MACOSX/xl/worksheets/UX RRPKqC#__MACOSX/xl/worksheets/._sheet1.xmlUX RwRc`cg`b`MLVVP'q!!AP&H VBSˆMML.M,I-KN,J-a"9?47OVK򌌭jPKfPK/RK=xl/worksheets/sheet2.xmlUX RꝲLUKs6WppȩI%~!qci" "" wHNg:AvU{X'Y:KX0B}ξܯ~d\ =cdGc\#t]*8vE5w3ӀFMil=^>v.£Z$9k.5<\Ô,m wN,(1}WƱE"llTJ~2.ra KlPpRNj,/2!1Y(sv^}H"%&0?E߰H@[R,I3o[` CBO!#W lw?NInB9b0rﶠ `42Ytr uŢ7x|Hҿ#yrdΓ1 M.8{.%oi]B 05p 'FcN$3 ;}SoJ c5N)(i:hpBY:;xsL^!v#D/2k? WΛzL+i Gt4>:h.H^H@ ^Z>וX U5#k#cKpNOF{8`'xx^b`']\^C5^ a/3Q #3:( 2}hhxpJz;\$3$ _adKi'ߵ.a":u<_{~Mid^ n cDamC=8FTIр'X/HzXj8]" RbQA0>֊1dP\@z;YxG(FCOPyů7N> 5"6*N@R_EJc@B4L@PȣA2laepftmG4j.WV~8~5e2n e{_HcO|^$N=G֞DG]6i`!d`߬~=GOw@fiGزoPK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK!DGxl/_rels/workbook.xml.rels (j0{Ӗ"R !$} n\E3^}PY Y"[ % #1z#g],khE˖Édva0ehЛdF/tCa7/_</_租f='?o]n=C8՜(w  fEqwG@3)^stbhA8g . p]y;8xHvGNh[jqf8RxH"~GXwRǯ[\Bw)j`Z.94#ڤ!eRd3 " 0+PKkxpXIJCw "%;q- C8jE4؛ u 0[lH計 yGqC }W E1 ;8>ܦCGY'cQk;ۙ&@w:uHjیB߶޴XQlk'-zmU1Eo:'Y+.;{I<< >uԄ6~5sN%A-RW6tpC \OU p s|L2a=(ΓfY@hUSl'Xm]^q$cc3p*hI38 SURgV6&HL.6xpyf,fބI|^^7Z40#}w4,& ">Ib힏Q)͕9C64אv UNFuf,Jx9(_,B{uV]zq..p^QJش?MϢYK s oG v@,2a%)"-X^lZ,@2cZВ*܊MZ)+":AX`NUO%1A;mmI_],pnul!e:z`[ƸbJLɧ+/FR*Ѕm- CRkm+Ȯ5gyڡC$(G*lC[2w rwY,ad2*=KXWe{(T7$iwE:;kv!K|\{ 0fJdOY 1uo%ҵ?PK!;m2KB#xl/worksheets/_rels/sheet1.xml.rels0ECx{օ CS7"Ubۗ{ep6<f,Ժch{-A8 -Iy0Ьjm_/N,}W:=RY}H9EbAwk}m PK!~`txl/worksheets/sheet2.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!~`txl/worksheets/sheet3.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!Wxl/worksheets/sheet1.xmloo0OwYPUŤi1Xg;IO3(IVZd{9S?yCgI k=%3g>ȡ=Px~_}Pm|_. UF- Agdkd=~dz0R|"6V@50 ⠗H3nW %Z:F(gFv@'=47F+NLy.HUQk 9hJ7\T؟ٚ^A*@M6qۿF%=JǀH*|`rK q(8zݱvoy}XWi'9 *1)鷿 c?6LO!FT`r7#c,W&_6^)$xom  f**aTZ C L)) <,I" F,cƳ0r'&ɔl?x,ʨҎd9}r, VXrUK ],y6èMz CA K%-o,nUil;3q\q{$]&ee%7;q{ GEQuA3hw yq;GC-r 7M$I^XӤDA@7LLrX֕ƜjۻUgZ84.)I8cDg@:9ڵ P.+;NgB"ځi-{uw,:=ItX/*޼EF_®_j9(ƓRI!Y >8|~pqd/T`S}[w+}ݠ-IM?QS#|\L\у2pejbvFyol6tl0 <)#LCdO|@64cPK!s@gdocProps/core.xml (_K0C{f*@eO'o!š?$qݾiՎc9KA6Z$)@1ͅK^(r*NDGphQL[xڀ\H̔h1vl $8T7JP5Ya r)lDo04 AyIB׃ 2qJ&t:ŝ9}pb4mY#'sWvUg9@U#R-Uz_ɼaC_uoZԾĀXP|dO%f)}5sս~q9 )tB<_}PK!,4'xl/printerSettings/printerSettings1.binSJ@ҊX,G@ & ۱,&>ѳᵝmQЛ~|;쏀 lx<%R,` n3sV*fe N?[ْ^^`4 n>Cɠsջ?#'p|#v"L#~beS*i E$rBHhckrʞ^!N᭳%aw*EjUh؋1)<]"iSMJH|7]iE%%~(Kwl":sePK!l$XdocProps/app.xml (n0 @V1+:`$]D, k$m=^dѼQinma7?#)}mb2l:YNҸm77oYPRY`HJ~%Vh edRvay;UH|RWpc ,p#ʋbzEkZz!BF+)'_a~ >ѭA?F >NZ+ K2 ?-vi+ebE}̒JkJQ(նIې0ʧOߎߏ?؅ql.k༱5AH8G>U+/1q3NLj/=xncAnѸ/>lBr^띊P!Tth[N-CϟB"|?} PK-!B=n[Content_Types].xmlPK-!U0#L _rels/.relsPK-!DGxl/_rels/workbook.xml.relsPK-!gQ"mzxl/workbook.xmlPK-!d xl/theme/theme1.xmlPK-!;m2KB#{xl/worksheets/_rels/sheet1.xml.relsPK-!~`t}xl/worksheets/sheet2.xmlPK-!~`txl/worksheets/sheet3.xmlPK-!Wxl/worksheets/sheet1.xmlPK-!"~9# xl/styles.xmlPK-!s@gdocProps/core.xmlPK-!,4',xl/printerSettings/printerSettings1.binPK-!l$XdocProps/app.xmlPK pz!xlsx2csv-0.8.3/test/float2.csv000066400000000000000000000002411465173235000162040ustar00rootroot0000000000000048929,4892900240051,489290024005183000,30-06-2023,0.003,0.612554358941478,STAGE1,20.41,0 ,,,,,,,, ,,,,,,,, ,,,,,,,, ,,,,,,,, ,,,,,,,, ,,,,,,,, ,,,,,,,, ,,,,,,,, xlsx2csv-0.8.3/test/float2.xlsx000066400000000000000000000136311465173235000164160ustar00rootroot00000000000000PK:WU; _rels/.relsj0 } {1F^Ơ2l%1-#[3JlGIaRSlh7v{HJ'F" %#eu} S\6Z 8#,16\{F;DzΟ5\^[| {΂ѡdRftFķ<B4~PK:W!docProps/core.xmlmMk@D n YSI`Ca;~&KEzyZ~Sd]ںQ%9qs>ޟ'5C>k2wzq!΄姏VKqgS<%ѓ *FuWNx(W\w@+Yr-B򿃽9ȍAsQ ~2E;$CPK:W/docProps/app.xml 0{"ަz)lڀ Z|0 brzp$ xIqԷgsQ-9bޓG3}-YN0zPK:WjӌTxl/theme/theme1.xml\mS8~& Lok3}V9vePJ~P moLGգdx&e52vߎl0$|;\xGULSjC2cCǑ!46)()QP[g#W2g<8)I]OEQERU!DPFX*$IJg.QeF8B&.Bc+WI]2a]6Ge;GT4W6Wxߵq! < CK_OƧ~mb_d|K׷9k/N@E1dvA?/Io@1K +SC}/-xrZ)s0R%K%rK4"!?RvMUQR {:ӄxNIe#.-g,3lh*fhLy RiĔ-_$eѰ譴L9콲M I*9Z@W)vxŘVyZSyS'jsamڜ7aXDPmɐ0~/TKZk hn Ɉqd֬s{ I>#PLs'ֶ³@ >x6*wzGE.ZLWuqk?ZMݟhsiiPiiW}y3dzM(%pP;τA0[H5Gevo1Rsʹ(q 6O[Ӣ~ 2r٣8;u𰫝uZOrֻhe/{ω;VjEa%|E+;tcA}C`Տ %iɉQ'귣)e[gەܳd.tFZA4Oe[}e0,Vv2W'/Amu & V]ʺ]4cCL(fP$<}erlcUoxeRbfdslh?DP87o`I %xdK~i[ı W3~"Lw E ߮v<̓1 ;U{>tJXѥ{pez̻q]]Է))}t>ZGM0UV"”UCvif_\'TXrG?6ҟ<;May޿tk 6;=kfGަ]Nɪ*x9"+N5vyQ$Ĩ1n!151>Qo 151H $FM$&Ƥ!Ĩ1m1Cb 1jbJʪ9dsSzBY یJ;?|k'`l=lKo8[_0Y 3ۯlׅ OGCd+FZalPK:WrA1xl/sharedStrings.xmlEA 0E=EȾMBIRDXhͤvp;W +ə!s-4" sǴ8%ѲGUZѣ9~2dg=۟-tjBlkC:m?kTpKMat}x@-r-昵V0 TA ͔a9t"ܙX@ܾm~esZ*IF"ln X`;AxtTc|CwkkP h)6u !g5i]â1=u몷No{Uzw7d&x)+6 aq]ή He9茤3< ~ 6#hH@qnș O\iɭ9]:orsμoI)鏝4A{޶n+7?XUI[pa`x??93?nB6Wh˙?C#E_!v{o8싱}PRtU kzzPK:W܊[Content_Types].xmln0E(*1tQUEi-Rxlw @I{gN26j0+9 @fqYGO'NptNb 1+#GSM5-< $Sҁtd4n*7"GoujS+Qi$lXKvR]WYdƖ\nā JaR ay0:IhgÜPuYd{ gT A7mnrepJۻ7pќIdFi@\z:(q8^GSSc.n*UfTj}u`ȩ\%5w/:ܮЊqvAux+sZކw?/PK>:WU; _rels/.relsPK>:W!docProps/core.xmlPK>:W/docProps/app.xmlPK>:W-txl/workbook.xmlPK>:W[ xl/_rels/workbook.xml.relsPK>:WjӌT4xl/theme/theme1.xmlPK>:W_8 S xl/worksheets/sheet1.xmlPK>:WrA1]xl/sharedStrings.xmlPK>:W]X :xl/styles.xmlPK>:W܊*[Content_Types].xmlPK xlsx2csv-0.8.3/test/formatted_inline_string.csv000066400000000000000000000000151465173235000217250ustar00rootroot00000000000000Regular Bold xlsx2csv-0.8.3/test/formatted_inline_string.xlsx000066400000000000000000000122211465173235000221320ustar00rootroot00000000000000PK/JK=tE2[Content_Types].xmlUT ꝲLRux ŔQK0+J^MiG8%&kX{7uM$sR-˶dŴ(EN{cݺJ,j @kբ1\KI^Q8i<*2(Qkڻ.1eyu8xz|BHiͻ!1kBVɭ3hZB~M2^/ZEy h8"GMc5pKϖv0Gn7oRf"uf P 8(&9N3?zPu@~1;rCDU^0{cRÚPK aiC_rels/UT &RRux PK/JK=f; _rels/.relsUT ꝲLRux J1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTu[#"*ZRGDT~h%GRX[RK˰ŏRUZNh1AS5Z׀w/~1Z f%/dVjjd.ח}ji2B1,D$KVxsA'DGHDuBcclkCbniw k\(\640DRbY*m ;n! ~Te=;039gNFxfb_*`A }<4Kd-1fӫ~'U^gM6<{(G=s̰P j*2Zg|Jd+y%2$Z$q5g™rbLaN,:(wG 7**^*u&SKXC&%n` LC!Ӑ?~8bөvddbnB8-u+[n`7nFzF5J7[[3[Ӭ3|I\ABr$U787|oD,VZ V$T]F r"U: 8J0־ϡzP-PK!0s_ kP} W9PiPkPK^VdFșxl/workbook.xmlUT ~dRux RMo0 W/"H8ТXڵgZc-hHL׏Vi'{O^_:`LBYCօm<ܾ_jOkI_mޭw Nj1HҌ 2i)Rm`SȽ/e(zpAV8m2H"z`Q:7$YɐaȾoty-n? -b'GVbEA,HY#ͱ^c@|֒lb1\>Qt)0{ZsܟdMob|S Vm;Y.SYSnf5ϯbx(tڪQwV2:/ yfhDc5hFd⣰/so3YYUPK ^Vxl/worksheets/UT ~dRux PKdVDBFmxl/worksheets/sheet1.xmlUT ~d~dux Un8}W|J$ i.F@hqd8Z|k^$ vfV:&309Jez3煑B?﯎{2I\^B%1`HS& dTd6;K* o=\?Erż։-lĨ~]tZeM Q8ѲQ[|-,m,ܗ`DP`]R7!0.WR”mܽwȨmUEl((z ^Jnn^QʖQ:e~o:PK/JK=tE2[Content_Types].xmlUTꝲLux PK aiCA_rels/UT&Rux PK/JK=f; 큿_rels/.relsUTꝲLux PK aiC AdocProps/UT&Rux PK/JK=Ù 'docProps/app.xmlUTꝲLux PK/JK=}docProps/core.xmlUTꝲLux PK u^VA>xl/UT~dux PK aiC A{xl/_rels/UT&Rux PKAcV큾xl/_rels/workbook.xml.relsUT~dux PKx^V7Y8D xl/styles.xmlUT~dux PK^VdFșN xl/workbook.xmlUT~dux PK ^VA0 xl/worksheets/UT~dux PKdVDBFmx xl/worksheets/sheet1.xmlUT~dux PK D7xlsx2csv-0.8.3/test/hyperlinks.csv000066400000000000000000000003301465173235000172040ustar00rootroot00000000000000google,yahoo,gmail,reddit,github xlsx2csv-0.8.3/test/hyperlinks.xlsm000066400000000000000000000222511465173235000174020ustar00rootroot00000000000000PK!!}U{[Content_Types].xml (TN07ޚ1⥒P3еMOAH7ۺ裏6N౲&gݬ0Ҫr:yLoYA%5 ./Lm0ges%3P~Ɲs1tn& ih9ؠX萌vA#K[ t%E |it2rxE6߫V5RO&yvuYc a ZHoGFL5PMTfRD"$??EQIPV.jjz΃PY}?qG>t-4G6Jykcʥ^L8܇|{됲]؆CNa)R.Al mtPK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK! (xl/_rels/workbook.xml.rels (j0 }qne:A[&Q6'o?C@.$}?ЧjU%)Z(8>< ֶҝ`@CqNsD$%襤`)qm.cuy yeMNQB Je9}{a@N鲸Zt>$0>u1_?-T5"̷5@h4I2eP s[U{[0a qE@VŢRփ#"Y4)‡ȜNp8pn4ngYQVM8"{މcΧX+8Fih)á7%CS>i8{ɲI} >Wbzw1T+4+lJ_?ݧzrT ]bT"Ɠ)_gPK!bmxl/theme/theme1.xmlYOo6w tom'uرMniXS@I}úa0l+t&[HJKՇD"|#uڃC"$q۫]z>8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ_^'܉M01UJS#]flmʒgD^< dB[_WE)*k;ZxO(c5g4 h܇A:I~KBxԙ \ YWQB@^4@.hKik<ʞ6b+jΎ9#U`δuM֯DAaVB[͈f-WY؜j0[:X ~;Qㅋt >z/fʒ"Z x Zp;+e{/eP;,.&'Qk5q&pT(KLb} Sd›L17 jpaS! 35'+ZzQ TIIvt]K&⫢ #v5-|#4b3q:TA1pa*~9mm34銗bg1KB[Y&[)H V*Q Ua?SE'p>vX`3qBU( 8W0 Aw 9Kä5$ PeD)jeI2b!aC]zoPnIZ diͩdks|l2Rn6 Mf\ļ=XvYEEĢͪgY [A+M[XK52`%p7!?ڊ&aQ}6HH;8`ҤiI[-۬/0,>eE;ck;ٓ) C cc?f}p|61%M0*<ҭPK!1#xl/worksheets/_rels/sheet1.xml.relsj!{ sI?(%4z)XU:n+=Q;j}}aLBAA7=KY%l`fNr)'V*!5`r_8OҠCt5<|YOmQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!~`txl/worksheets/sheet3.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!N`xl/worksheets/sheet1.xml_o0';X~/$]WT]jy4߻c.`v 47)"NYR0ےxy_sez( ޾)\ *CΘh3@Oc5Xږ%"M1eOGܾF46b=:9IMinwJ=V*OQ-M˷ }?e+.&X\k)q ʱqKϷ얡RU MIcFYUpto@x1&JRTt\xyPJܯclU 'y5*9 3xx57B> J:r҂p@pId%8'֗:c5 M+v7<)h즎>X>X;3znf 8[m+{G411&xf`~[S \,)iS>PPK!re xl/sharedStrings.xml\AJ1нB흴"dœ@;e:TFD^_ v)LSt F4R =\QnoqKaQ]_y+h>#le,ڪ}'b!03olT!3jpG~=cJE.ǿڱ&|PK!&<ʩ[ xl/styles.xmlUn0 }0. lK`@:`-;Bu1$7GN⵻y)<*Ax Km0ȏ]J蚞3\Ӻ֤Y+]BܫB;\Y O%%#/;}Vl-S3*~!A);ixwߊk]-OtY-uÃVu<ή4}uN'8\#L>yPּe2]Ӽw5(EG?5n82VxHIs]:to L3|V}Y_o6d;:,fd6^כE?F{팭/4n4]O']FR uHBPK!KSdocProps/core.xml (_O M9KٓK?݆KۭD*N1楐z|0iRC`<;?Kx)+0NEm̫obB,߂bvڋ(lH;pJ8&cUO=0E @ (:0:*n_NCػ?u]qeuV nvg17\i{(7(bZ-jYj[%~n[{Qy/n%΢NeN1d1.!ԿQрxd 9<PK!z`docProps/app.xml (Qk0Bd@YcQYҭ'[qeoWͱ3%]. J*Wk{(cuw8 % !HR%mZd\$&q\hNt`#4'nzک/>UOh%1R|*$_ gs'=qg#+i`E#M ~rNqӃBHԿVF2hi1a|j#Ӆ`,rs*yz28d$\"V N zN<1dތsWIZ[ʤ[MJ|oy_՞TZ; g' s|\6Г~n`Ɛm+0azQLf=_CPK-!!}U{[Content_Types].xmlPK-!U0#L _rels/.relsPK-! (xl/_rels/workbook.xml.relsPK-!4`q xl/workbook.xmlPK-!bm xl/theme/theme1.xmlPK-!1#nxl/worksheets/_rels/sheet1.xml.relsPK-!~`txl/worksheets/sheet2.xmlPK-!~`tCxl/worksheets/sheet3.xmlPK-!N`xl/worksheets/sheet1.xmlPK-!re xl/sharedStrings.xmlPK-!&<ʩ[ xl/styles.xmlPK-!KSdocProps/core.xmlPK-!z`\docProps/app.xmlPK ]6!xlsx2csv-0.8.3/test/hyperlinks_continous.csv000066400000000000000000000053701465173235000213160ustar00rootroot00000000000000google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit google,test,yahoo,reddit reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google reddit,yahoo,test,google xlsx2csv-0.8.3/test/hyperlinks_continous.xlsm000066400000000000000000000231041465173235000215010ustar00rootroot00000000000000PK!!}U{[Content_Types].xml (TN07ޚ1⥒P3еMOAH7ۺ裏6N౲&gݬ0Ҫr:yLoYA%5 ./Lm0ges%3P~Ɲs1tn& ih9ؠX萌vA#K[ t%E |it2rxE6߫V5RO&yvuYc a ZHoGFL5PMTfRD"$??EQIPV.jjz΃PY}?qG>t-4G6Jykcʥ^L8܇|{됲]؆CNa)R.Al mtPK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK! (xl/_rels/workbook.xml.rels (j0 }qne:A[&Q6'o?C@.$}?ЧjU%)Z(8>< ֶҝ`@CqNsD$%襤`)qm.cuy դD/ҞMi:vd;{֩Ziw8VFgt8(]!.맻)%s-22zG͢3va̞ vo挹i@4Gc|XEcVsanaR`O$(Uq4_Ry5>(JwQH"#M?lܷRvD e%J*F{gv+Nx!}FrJ-LtSCoR*d2CMgivvE[u/ `o _? O(BEqKPK!bmxl/theme/theme1.xmlYOo6w tom'uرMniXS@I}úa0l+t&[HJKՇD"|#uڃC"$q۫]z>8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ_^'܉M01UJS#]flmʒgD^< dB[_WE)*k;ZxO(c5g4 h܇A:I~KBxԙ \ YWQB@^4@.hKik<ʞ6b+jΎ9#U`δuM֯DAaVB[͈f-WY؜j0[:X ~;Qㅋt >z/fʒ"Z x Zp;+e{/eP;,.&'Qk5q&pT(KLb} Sd›L17 jpaS! 35'+ZzQ TIIvt]K&⫢ #v5-|#4b3q:TA1pa*~9mm34銗bg1KB[Y&[)H V*Q Ua?SE'p>vX`3qBU( 8W0 Aw 9Kä5$ PeD)jeI2b!aC]zoPnIZ diͩdks|l2Rn6 Mf\ļ=XvYEEĢͪgY [A+M[XK52`%p7!?ڊ&aQ}6HH;8`ҤiI[-۬/0,>eE;ck;ٓ) C cc?f}p|61%M0*<ҭPK!q#xl/worksheets/_rels/sheet1.xml.rels̔J1f[4ۋ =xC2&D龽( =|vw”-Vm Z#krQ@Fl__mACؘJ Y0SJ|mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!~`txl/worksheets/sheet3.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK! Cȫxl/worksheets/sheet1.xmlKo0#@B_Ӣ$UF;$V3ȿkBH3dwϱ{\i!qaTf\߿/@Vf,%[ÇO7sPRÍ1UE:遬xIYIU0CjJqEE]QD:$OZ/dR(3CFTz߭H+z~.RYTb)rau0(i]JŖ9~Y]@BJj2j턢>NQ&ȁ@8" ɨޠ?ׁa˟<S_Jl'ӐZ-Yj+<UW2QdtޯXwd|^rC}b1 ݎ$.NhM+~ | LI}BW9Z.N 1C">&H\ $Z""٭s[[;v$\Hx_ڑp#jG£ό#jGՎG;[[;v$\Hxߞڑp#jG£9-ܭ W;v$gBW9ێõ)c}"õ9Q2 %[D͂&ߏ55g8Д)K7CޖyLͨhvTDV[䷵ Im[uu:7֢AW`M=еߥ4F ihWR l\3PK!|hxl/sharedStrings.xml\Aj0}wo䄒 )@O@X[`8qooJ0[*nۀAj9e<ܾ?O`D#80.cD,[xVK-HKrZ.gcQ`Ms%fD3Q~Lx] Y ɪ6Ǟ+UwxPK!&<ʩ[ xl/styles.xmlUn0 }0. lK`@:`-;Bu1$7GN⵻y)<*Ax Km0ȏ]J蚞3\Ӻ֤Y+]BܫB;\Y O%%#/;}Vl-S3*~!A);ixwߊk]-OtY-uÃVu<ή4}uN'8\#L>yPּe2]Ӽw5(EG?5n82VxHIs]:to L3|V}Y_o6d;:,fd6^כE?F{팭/4n4]O']FR uHBPK!E'RdocProps/core.xml (]K0C}~l2Kہ]9xw[IKߛ[L9/I{Yh#*0*.&Oқad,U y~y:a{]ՠIZ['IʉJKjQoHMHSKI ꁈHd$(kHkAK@RC:ٜ1񛸋uuUjw)g @mw)/J -:N.Ʈs{?I_ċb('^zѬd%a1/1$F OɿPK!z`docProps/app.xml (Qk0Bd@YcQYҭ'[qeoWͱ3%]. J*Wk{(cuw8 % !HR%mZd\$&q\hNt`#4'nzک/>UOh%1R|*$_ gs'=qg#+i`E#M ~rNqӃBHԿVF2hi1a|j#Ӆ`,rs*yz28d$\"V N zN<1dތsWIZ[ʤ[MJ|oy_՞TZ; g' s|\6Г~n`Ɛm+0azQLf=_CPK-!!}U{[Content_Types].xmlPK-!U0#L _rels/.relsPK-! (xl/_rels/workbook.xml.relsPK-!|@Xaq xl/workbook.xmlPK-!bm xl/theme/theme1.xmlPK-!q#oxl/worksheets/_rels/sheet1.xml.relsPK-!~`txl/worksheets/sheet2.xmlPK-!~`t=xl/worksheets/sheet3.xmlPK-! Cȫxl/worksheets/sheet1.xmlPK-!|hxl/sharedStrings.xmlPK-!&<ʩ[ xl/styles.xmlPK-!E'RndocProps/core.xmlPK-!z`docProps/app.xmlPK ]"xlsx2csv-0.8.3/test/input-weird.csv000066400000000000000000000000211465173235000172600ustar00rootroot00000000000000,,, Some data,,, xlsx2csv-0.8.3/test/input-weird.xlsx000066400000000000000000000201571465173235000174770ustar00rootroot00000000000000PK N_rels/UT b\b\ux PKBUN:'=C _rels/.relsUT Qn\0c\ux MN1 FyPBi7tP/ϏfGNgcQW*" '#}|6Ց$4U5( ]Z ,`^hrII4t9gd;&U)ś\Ji1;pY׏( 3=4-ۃHi)ki`&iڌFqY> 4R L> Y ;ݳ'.iJ7'gpq]ebZ[?]kյWco-"%b/^Th4]`dX; V98т5 $cat"el9OwXFb_יfZχ^EUAYEj@LV!QQ k@ 6v)e|+G2b6+U͙kH<1&To;NbE=w[Hgc8w8/(#"31l B_?Y2gɟ5 5hvRe=="ĪtKQK0G|gz/w:Yw*0C!䥤GwT5tjw};XvQoEP]ZgOȝwE U GsXI7ıV$,ٶ4.| Nj#i MC8)M;z뺳0ad9Ġv&6$_gEjV⶚—}sK$96Nʿefo d7M3_w\PK Nxl/worksheets/UT b\b\ux PKڭN$exl/worksheets/sheet2.xmlUT j\j\ux W˒:ߪEVcIML2]WOʴm7}gbtGALN 3MͩTnCS9;vN/Py 7H?hM&.5G6m瘜 %YC5;&sE! lv\bqni3M=OFe*m^Vnu83F :V:ѬVxXc%[af (Z޼]EZ'$*&edT(VxJ557؍FVN~~]X K{ Z 7{AƠrgqnw>_4N4|Οouq|b ~f@q`D)AQj r\4* oa.T415z: ai$dH N. A^9X+ڮ@$e+SIs~QT^<%Y|[}ߑW+Fr`a3}oirFx{cA9nr:dx\>5^VPK孁NU/Sxl/worksheets/sheet3.xmlUT j\j\ux WM8ovalwIY8\rQ@Uo96hb[͓}B2/ ly#n~ׯ~eqL(Ur4dЌH4(0$rl{feF1H%}jFmO|{LQ&arfeIC3qGи ;H㛮i3䙏Ϭa 61_7$(gӑ=RR#}9EqA\)W+\<"$BrV_yl;߉ ,H,&K֠E96[w:}Q=i'b,YNP 5,-n끝nk״_cz΃8I`?|䇣{'~8ܱб 8%^h!PG3&l^wá]v o?)ل7 c54rK"%b媞3#E,"\W3ټЧ6\8*4Tc)הbI=Y]JuiZTF{6PKBUNެ&axl/workbook.xmlUT Qn\b\ux j0_Ew;/Y; ۛ%А^5EeHJu"C)!4OgFX*IS:ŔΌz҃Ͽ-)qkѐ8JImc Ki}"Pr72hƖch,p _<*Դ#5 2'JоXPܣ{W',O`*̝+=Upo mn7Tv>Wv:ɥ]7FWo^%;SH"S M {~jYv:;ʚE>yFXLX?}ʳHE~g{ցG!#yED rwuw`F|r`QM#Z/=/I*8\Ws{rrwrJDxTqe.CT%@JV$ެ'c_I' %]{j%So!Nuۮ`o8lvw\ aI͎ iA8?@볟<@?E~^qo<%k5=Z``p;C5n!·)jkj$#x%2)ngW恰5%uLL2N/#V"j֘}9 Ь;㫦II_ ] O]cJ[8?PKBUNLldocProps/core.xmlUT Qn\1c\ux mj0 F_>Q!I_nvkl55ԥ}a~V0@[7(h]ȩzŢs 4~MLt1QG(pgg!9\"RdocProps/core.xmlUTQn\ux PKYxlsx2csv-0.8.3/test/junk-small.csv000066400000000000000000000000711465173235000170730ustar00rootroot0000000000000029-Mar-1940,25-Jul-2008,08-07-25,08-Apr-2009,test,FALSE xlsx2csv-0.8.3/test/junk-small.xlsx000066400000000000000000000131411465173235000173000ustar00rootroot00000000000000PK/RK= _rels/.relsJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTu[#"*ZRGDT~h%GRX[RK˰ŏRUZNh1AS5Z׀w/~1Z f%/dVjjd.ח}ji2B1,D?dn.:o 'e,2F^PKpPK/RK=xl/workbook.xmlRMo0 W/hAbhQnڵgZc-dHt׏V6"Ίhd1˥@6nSɟ7RDz|(/ןV{[.V%YUęq0l[DlV<8y`XMc^{5t@ؚ>1WXX%AԠCJ6`#տP;k@X\ O1O>G+ɛmL0n [ JRR{iQq ̼7N37MˣE9垍=?[S2yy{Q.-i<^ifL qig- KÅpˑ;9+OϒI[W|=CtQk9_O{YEε PK]z PK/RK=xl/worksheets/sheet1.xmlVK6W|J&̐MLlUn–jdɑ̯OK2%ݭهo uXH &`V5s+ W,f'.^drɹ[+y,j 9-fhGd+0*ͥz'^s- ^U84) "0E —5iO©UX|%]!*1Z[Fjo1ˋYI#p5wU-_rG9wuJ\U R.|*q#Ⱦk\KG & m-qzG(0r m1Ņe/h)YLΉWpH/:}8 Ͷ@ T~^Jtܹk.~HQC5 -Fo2Z+ѥTC !/aWW.Jj8$<,vaL' 9ꐧc4R?βp߆wq<IxF ( 9鐓k188ɒ09푣9ģbLoC:r0}oC;Guaa3n Rh1tWq7+P ?b+*сL]Ak|ԼB J:g =.(wAvVYdd5͓8ZZUvaգʍ4VŪ7&;0`㠞9VϿ̼>[V6a$ T:KK悼q]a1j!p" ϒ'$SC2$<-KBW5I<"?L(+VAqqe\Uy= ZgGQrʯ5QxIKh`;\@# JC3.] 4CK`i^CZ.@Di0Y @+Z,ͮ*9⽃ī1uIO}DP'[ߕ)S3e{xS]xY?03-3x-PK!1% PK/RK=xl/worksheets/sheet2.xmlUKs6WppȩI%~!qci" "" wHNg:AvU{X'Y:KX0B}ξܯ~d\ =cdGc\#t]*8vE5w3ӀFMil=^>v.£Z$9k.5<\Ô,m wN,(1}WƱE"llTJ~2.ra KlPpRNj,/2!1Y(sv^}H"%&0?E߰H@[R,I3o[` CBO!#W lw?NInB9b0rﶠ `42Ytr uŢ7x|Hҿ#yrdΓ1 M.8{.%oi]B 05p 'FcN$3 ;}SoJ c5N)(i:hpBY:;xsL^!v#D/2k? WΛzL+i Gt4>:h.H^H@ ^Z>וX U5#k#cKpNOF{8`'xx^b`']\^C5^ a/3Q #3:( 2}hhxpJz;\$3$ _adKi'ߵ.a":u<_{~Mid^ n cDamC=8FTIр'X$KVxsA'DGHDuBcclkCbniw k\(\640DRbY*m ;n! ~Te=;039gNFxfb_*`A }<4Kd-1fӫ~'U^gM6<{(G=s̰P j*2Zg|Jd+y%2$Z$q5g™rbLaN,:(wG 7**^*u&SKXC&%n` LC!Ӑ?~8bөvddbnB8-u+[n`7nFzF5J7[[3[Ӭ3|I\ABr$U787|oD,VZ V$T]F r"U: 8J0־ϡzP-PK!0s_ kP} W9PiPkPK7Y8DPK/RK=xl/sharedStrings.xml=10 НSDީ B(I$NZFj6vܞ0>}mNyQiy<:xo3C3 t~gEyc%0uu\(iB\g.)heQBaHӌǶ=a [ުWX_PK깽PK/RK=[Content_Types].xmlŔQK0+J^MiG8%&kX{7uM$sR-˶dŴ(EN{cݺJ,j @kբ1\KI^Q8i<*2(Qkڻ.1eyu8xz|BHiͻ!1kBVɭ3hZB~M2^/ZEy h8"GMc5pKϖv0Gn7oRf"uf P 8(&9N3?zPu@~1;rCDU^0{cRÚPKtE2PK/RK=f; _rels/.relsPK/RK=}docProps/core.xmlPK/RK=Ù 7docProps/app.xmlPK/RK=pxl/_rels/workbook.xml.relsPK/RK=]z :xl/workbook.xmlPK/RK=!1% xl/worksheets/sheet1.xmlPK/RK=&cKc xl/worksheets/sheet2.xmlPK/RK=7Y8D xl/styles.xmlPK/RK=깽xl/sharedStrings.xmlPK/RK=tE2S[Content_Types].xmlPK xlsx2csv-0.8.3/test/last-column-empty.csv000066400000000000000000000001261465173235000204110ustar00rootroot00000000000000A,B,C stuff,more stuff, things,more things,even more things a,b, one,two, 1,2,3 xlsx2csv-0.8.3/test/last-column-empty.xlsx000066400000000000000000000757471465173235000206410ustar00rootroot00000000000000PK!t[Content_Types].xml (Tn0W?DVp"~oKb[^C1( Bpwf2;v:Y7u茍@F*=%gzm$Jg QƌUα *q܊b!oG;^Aط,OGkUB,zk2&U!< m wJB4οvuͿ[|HAVZvƦ,Uˆ%ho$I#G/@w=}Yw,SMky([==j JYܩgX ; m9>S:#mCj|ֿ4OH鿽x[ |HY:s$nPK!}T  _rels/.rels (MN0H} PnRwLibv!=ECU=͛f0={E tJFkZ$H6zLQl,(M?peKc<\ٻ`0chGaC|Uw<ԀjɶJ@ت` %TKhC& Ig/P|^{-Ƀ!x4$<z?GO)8.t;9,WjfgQ#)Sx|'KY}PK!nxl/_rels/workbook.xml.rels (j0 }qҍ1F^Ơ-{c+qhbKɠMt\ 'g&WP%&w >׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK! xl/workbook.xmlRo0~GN*46&*!4={Υj"!ii/ewwW\βA_Br^cm?om9IZYPgz0|,yR" ST0D:Ypx>#¿`` ר{> J4~lMyU4̈=Zάsm%_SH;U7rEm`J($)K1%'T ьԓ3hR`N!q(fK/!MڒRҋ9̡M4:'z zC_6[ߧddė3}oZYM'kIivpEIטin|TgtMZhtb'݁0jg=E 7.nƪ-bp$yTq>PK!oxl/sharedStrings.xmlln0 Eߑ#iBi YHSb'l&E}50;&jX*PHMl=]kOoXn5Fә=#r/~[cVԧǨO2F{ur&)e}U|~ZqSؒⓦiiuh il^30r?m*yX?QE7mYh !HZ+j径qR0߁s'vOg׽ x+)(4<*[]w V\+*$mFc ݹlz3 ם- a.bA=RrZׅzv#c"w8 g<._|OYPK!{֩xl/theme/theme1.xmlYMoE#F{oc'NGuرhF[x=N3' G$$DA\q@@VR~MԿ;3x8!zgkf㘡C"$I#^$!d:W$N4 w߹7TDb>DJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK!^xl/worksheets/sheet1.xmlUN0ݏ4y9M_5AP 4t֎4cl'|\;m 6`ߓ{}vquRm) (ȂM;DXhG ʾ[Jb*Jm ¤V%qlHE96c Wމx83:DC%#VSa;Mkl!~S1e8 QgDr9y@Ӧ"٧u:cF'FH[oYijn鵵卥P%&?PEXH5yRW-(jktlQ0Hu,ҴL(YΜݳ>1jΑ֔X2BQ H };X^R8{ {aU -w.zH-dž.e [.W7-_R,X'![lq59(nFEcfE܂ BXH kkk+(,_-~_wqA.wd=Rbti?!Av}q=PK !5Bt[[docProps/thumbnail.jpegJFIFHH@ICC_PROFILE0appl mntrRGB XYZ   acspAPPLappl-appl dscmdescogXYZlwtptrXYZbXYZrTRCcprt8chad,gTRCbTRCmluc enUS&~esES&daDK.deDE,fiFI(frFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR@zhTWlzhCNruRU"plPL,Yleinen RGB-profiiliGenerisk RGB-profilProfil Gnrique RVBN, RGB 000000u( RGB r_icϏPerfil RGB GenricoAllgemeines RGB-Profilfn RGB cϏeNGenerel RGB-beskrivelseAlgemeen RGB-profiel| RGB \ |Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&ltExifMM*>F(iNHHCC }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?> t~&H<.%VR^^麎jSfy !6uQm&I/6JJ1rwM''d?6xR~Ϳ`|YH<ï~ ywڧ]5y̑\|;牵ϋz Pͨ9?QU_!)'Jj۵Oy(m)]_\vU]5%.T*ownDj_Ww4-78̲A?otS@֯Xү+6awuKX.mnXy)$(TJJP\zݤsz-&tTR}%NK'+4V**Fg^ң*|Q]> |?|5O^khz7ֈ4:aז&6y$֞a$'5%&M_Fw;m&՛I_y /O Z D2qXʞ U㴹izp!e Pr I&({_5kš-= }6[tYf[y$yvyew,I'5ъJ8Qj$JM$NXzrAn)ն[Zw"V~ cSVm4#O_xzd e[x.$y TG4g~LwUi(𓶲sW- %J hPz]ݗWv&0/?w~I4'4ObԠ@KWڅq;kP5QۯeJ8Z>5*[.{kSg,E_N 4\h7~X#ZkSgDe|6JҘJ&72pv\ygP789)Oڴu:U BU155N0|Mwϩ~nPx㧅 \:X|~8^!3iދ0G? i7c>rl}>>3_SI I:x'Ŀ*GDEUL UP@;N' 9? WßuM5|Z4xxķ,49MwvwnfaYYF®*9M4֖a{_VLasrʣտzvM? Wß(? Wß ~Y⺓&%72h~{U csd#;'}{? WßN' 9dhu{鿶Wś='v^e~'Ě)|- K_FKI-n+;ik ՜S<5&VTc74g(4ߴN+}vvO*ZG9մSY;jϬu[,/ x˵mQׅٽ@#PM B̙9R&v]4mXN#.7(mߦ >MMC# W)N_4?bD6:(nx.#ҷ2+&27 ; UUw>ʪ7x}+ WT4];~1a[?/Xؾfa9ol!ҢC.iKFH+)>"7¯ u X|M?*w;~}J}&; .ID{ñOYKgMrKqಬ^V?^H4=z&R˪f0*p1CA{_;GqxP3]R5 КJ ydk<"3pk?? ;7džm2߶iE>]G4Rj:oIԴ=05/9!~Ϳg]?C\5ޏ|Bn.?hV>5 OU}H/}_j%^z׉,t@ּ;O [:MEխ[I@=EZ_t `t(ʪ7x}+ WTMk0xdYe?}Cۦ6c鱛kr:; UUw>ʪ7x}+ WTnW* 5_UP_j[_C3x<2biQSYJ}=E]1>>Wa@NϿa>nW_ h !t]4ZjCfo"Y۳g!YkuNIEIt1swj)O%u:_{$յ?K㯊~9]c#{mM 0xHK u"'4} EI5 ոiF#F6ԥ߽N3eJU#^)Mݸ΢ۙkz+7/(uφ'/] \-<$ -8Ro }uݾu%:J1MM~ ~!>PRMAIx[Þx> +MM{w^K6[Imk2#dj{w?`jqM{Ě}{ [ŷ]ih:ZR&=3H"bO^ӈM?٣:{"E} T>t1 #D#r׋?O ]@׋?O ]@׋?O ]@|(vOŎhph0<]f$%y"6@>J_ωuO,Rx[^_hѼGO?*JX|Q6x~+M+T'N'k-}6Wo /@|=ux`?~(_ڎzޝk},f;0%^$O"_bC ڵs>,"!}BuNGK֗0Id&'l썵Օ O /mx^*6<0F[ 1MBIq%MBŶyf!^%Y<+ihG5ѥBF#pS!<1d\n-:AkϹu#ě`ľ"u>jnA=m٢ fhgMAZ:ejwgh7Zϋ,ҭ~wq";8{b@= jxJM?ľ*Mz7] ?iiL'ӯ?4Z͗ڒ[9cuD`D|Ck\E  w2K 8V }<P^>2 :#>[g+ᧈ<1kW5Z]ӯ5NWzK}u_do|3Լ|]O|+zܚ>*~2_4?Q_<3A1xrok &m?j?=bkF f/j?=bkFi-C3K1|8Ji~^[jillnnϖɂYep8| cYeO^\I/σxO׬.u?:5;NIl~+k7:jYWZ-ugAiZ;|#Ԭ5 K߇֚ Okeq oZYwNctT.|JE^{w?ُ͟OZ뿳]gn ~ Ɓ>YVM#Dڳ=N<:;d&wĽ jZ[in~Ehut{yJZRYvkx{~/V>!x/]jOIs>kiwƛv7?cW'4= -WxkM#n>i<_jڏn(&ƭ9O!S?E!⯈;zfgbԾ-w~9x>3_\M<+7č3Դ3Nҭ#ɠ.d-mPJcm?j4lh_ xrxG2?i+i2j!A^m;I>t - <|4_ᯉ igٲG5Ơ4.gYPx[^FLX6_c='x[-NJG.oυ>!{_?~/<]|;|A j%Wʾ7-~"|EtMH?sW,~1 w>#i7viѵ/qj2W_O|%A_O|%A_9oxj,hjHg;]mc b SpH<=bkF7-15.@%͊*`eĊ1ӳ]w_~tW~ψ jjgk;&i6:7u[yuC꺖veh:WuIPxHSF\(.i^OX4}RI4|UI8J E7*meϽ_{K|:U֑<\Y4>̛[:TgǟO?g/>9IZx;>ѭ? q/H5}s+G=3[Xxb-eKSG5~oK@oK@oK@!zW|"ٟ~;Ų<7ލ÷FOX5ì=['u*ZEk5߇(-?.k|I<;^SzKxU[k@'4{-+G]_Lu @/G}-/G}-#LbxG2>3@voK@oK@oK@ ԵKN:,Ws=ؼ+Wowo 3vG~653\35 @aWi/|)UK]uGq ῃ!97\h-I!] ?W ȴ <1/h_(xc:_"7PtESOg>'+Ɔ-¯Mi8YH%tCmA~c(NрoС@ C!AB?C-x+ KZ?W ȴ <1/h xF~/G[ahzܭso t>ZNH+ >}J<ʌ5OZyu s{Jz:u}OAC?'M?aw<\1x K?b@!p)/ƀjc⿃>LĺD X|BU)Ѿi6C5Ž3 }e7]C?(.߷|^9'ގIqvAcghN6Mܷ}]Va(Wrn5i:*V]+c/M7}|% CšNj|[e{w]\%'eZƥa֚oJ+옮윩<4&̣N՝W*|VNɨ%&r"QRdӓ7\;_O_ QӼA |G.\in/[C.Hvi8dpK.x*N-B+gqOSySꤡsOgdl>- ˊ?|[Ced?'.(o N\P|uk^񆥡#ӮtAռ*:fa:1"1V$Pᯇ:| 7'O x?_|?xR; A-o&KӴՌvi';dʍ<=?'ſ6Y8?q@Olpg>- ˊ?|[Ceg|n4]o_?[k}R-qڎ4OSJ]4^aomW+l{zޕgHҵ>J׃,,}$6vk+8!Y .ˀv>- ˊ?|[Ced?'.(o N\P,0)y-W C+]OPiuή$:4S>Zjy+'~W-cmd}" V|qu>- ˊ?|[Ced?'.(o N\P,'ſ6Y8?q@2(CLq7V>2j2@&:g|߇~oMEEvc7V}̚L:]tԡr_Q7욲5t'-dHƒrnNQz蚋ѽRo_5Gu|?HdGھQXVܯj|MB|<€П'4g'7(7 M ?|MB|<€П'4SOռD&>Oi@ωOoPol?yr~ռD~_$w5C/|8lހ:П'4g'7(7 M ?|MB|<€П'4g'7(>4w/ <ѮkZz ZLJwv#:П'4>d ix~6n|-֝rj41Rc@TJ^Jv}]t^ʻjn+ᯀ>OM7^8_.ϊ!g2?ڭ|3<:<1?~4[ιqMenSb9'*qfgwyk_N*N:5'Nu%%u_=_ݧA X #J6~/ּ3hz>Dp\N"2#9I<ΥjSZuw;YN\δowy厞|WӹCBK'C(__ de +,zL%P ?/?2O=@aozo/I湚gr/'D%丠(__ de +,zL%P ?/?2O=@&PпǨ[`t AHd_*e|#Iu?CBK'(__ de +,zL%P ?/?2O=@<[ K,^'7z߻m"^٠(__ de +,zL%P ?/?2O=@&PпǨGa^(ǢiE;)u?CBK'G~SF>"xOMlt}> Z.mK+uxfM,n$dp0"X|DhVMISM=SME8xUFIӜSMnn??=c? |a/U߂G/xwO h ~𮥩h_xZ.x~4}.ѬO _W*&EQk䊌rRRqJ ڽjnNԯW\t=|dS}{ xSTw0ǠIr@$$v "k͝ RXE4NqW{+%w"IrӫNrw|dnɷS?:_ ŇCX?:_ ŇX?:_ ŇX导i'_h?j&4k 4(WaW;[O'^ ÿ8u<;?@'^ ÿ8u<;?@'^ ÿ8u<;?@O/|O;xAXe*Juk $29kbXˀI_1wcpX?:_ ŇX?:_ ŇX?:_ ŇO~3#ĞwsGjIC$7N7F%\eXr X?:_ ŇX?:_ ŇX?:_ ŇW43Ah=5%]Z$0ӆVSR@W'^ ÿ8t6:]쫨>&OPۯ%,~;{0 /G5D,A=DU$/}ywu-=߻u=[޿-dk eѴ/"?^gCW/NAA=Ւ\ , |GF=K^">Cux<2t9^"JyR[ʥZq-Ntw 6ʅ5Z7R9dvk Zu웚1>+T:r0)OQ[G >_J>_J>_J>_J>_Jmមs?YPPPPPP!w@'u/?/?/?/?/?/?q۷3d?v/?/?/?/?/?/?r^Ws`qmc41G~zOS>^?KGmtE\՗v4M\Ed cub9R${rͷ]Z(rԩ(2.'9)%j ~$W=7)˙ug.7QSϒNO}9ghTݛ]-z4G8wB&*F[<^]LEj7(j;z(R.hAFZ]^¿o,9bj@ /=@+P ¿o,9@ /=@|$1Vb"f|4_xMbc:W ?eǨY~s?_7_zW ?eǨ '񇉭C0ãZH3ayIr(eǨY~s?_7_zW ?eǨY~s<)o N]2{ՎI4¿o,9|_wk_^14R_S|)KG>fwisB9_WͼKHJR?8{EVi2ѿj~8'ūj]i[kkQ9*]oř>j ?/⯅~!_Zo : ׇQ><4:oou-KN.&MJ^޷,G.y̽]7yZ/g'mԳ"孾9m^?n]ℚ8mmš5ݶ2ݳڴrI%1meyA^dJQ(J]U!V2[ǒ}73SۿSCr+PO oL?7'm2ܟ!?SCr(O oL^J QTV9D[ Pڎ0lp)c9Q6@?nOe)?Cmɔc &P6@?nOer~C"VUѼ*d؉'>{\/chU6@?nOe)?Cmɔc &P6@?nOer~ҼH~_V=,LvJCOCv?7'm2ܟ!?SCr(O oL?7'm2ܟ!xᗇKMi8m!MxM8@' SCr(ǟg^>&ofƊ8)8_Ȅ1`1~jms_{TiZ]g.>Fi? FÞ#|#.OzhRSWMRuԼ5gZX_+6+mJ&CI<\7_ݦӝ5%)E٤՝zɻ{WXy5MJmVt~j|hx1hJz،LBgg7yu=/W;vWo {ꚎrrMީX? zqޭ@^? zq/~,ѿfJº<%>$..^ki۬[4ݝRʭɁ]4se)*^h^ϲRױO+r,;> ]CÚ]&}φV:}SM|3?_MmOak^hZxR7'?bUβTJեQuZNM++% T=;A'ne{+uݟό}k>hA!:]nWCK4-a*ΒI/XL%y8Ÿ}WyI?gtgRRʚu!/-?@>*C_:OמGԵ^<|%uuq6]3i@J Ǧ 7 R底B3IT}ԒiWZQyFMp:5Z?f?W#_ߊ=c?_whwcK4vZΏ};M&R-SgqkJ6&T)BWWޒgPNuԩFW.PetIE-:ubߊA K  ~0Y5o.`h qMqt2ȢFU!є#IhVRZ/Wk-B*K*vnV ON z+ݽqKTV& >)7_M/|)7_M/|)7_M/|)7_M/|5ķߝcCŗ\TLtU;kM 'ުo.c{Cp^PZ8뗁zMf?lZP= ?M?\/Wrv|L_ֿPK-!t[Content_Types].xmlPK-!}T  r_rels/.relsPK-!n^xl/_rels/workbook.xml.relsPK-! xl/workbook.xmlPK-!oq xl/sharedStrings.xmlPK-!|z r xl/styles.xmlPK-!{֩ xl/theme/theme1.xmlPK-!^xl/worksheets/sheet1.xmlPK- !5Bt[[docProps/thumbnail.jpegPK-!F!GssdocProps/core.xmlPK-!޿LvdocProps/app.xmlPK  yxlsx2csv-0.8.3/test/namespace.csv000066400000000000000000000011071465173235000167530ustar00rootroot00000000000000Case # (aka tissue code):,,,,SW101014-03,,,,,,,,,,,+,very light Injection Site Location (PHAL/CTB):,,,,VISC Visceral Cortex (VISC) encroaching on the Gustatory Cortex (GU),,,,,,,,,,,++,light Injection Site Location (BDA/FG):,,,,Ssp Primary Somatosensory Cortex (SSp) Layers 4 and 5,,,,,,,,,,,+++,moderate ,,,,,,,,,,,,,,,++++,strong Summary Notes:,,,,CTb and BDA did not work,,,,,,,,,,,, Atlas level,Data section (File Name),Data section (LIMS),Anatomical Abbr,Anatomical Structure,PHAL,,,CTB,,,BDA,,,FG,, ,,,,,Contra,Ipsi,Notes,Contra,Ipsi,Notes,Contra,Ipsi,Notes,Contra,Ipsi,Notes xlsx2csv-0.8.3/test/namespace.xlsx000066400000000000000000000133711465173235000171640ustar00rootroot00000000000000PKw KD"hxl/sharedStrings.xml}N0_eTnZ] HRAHYz z&=nieɉ=)zg4٠NbݐE>y2wHleѸAY) )JBmB8o&U]I2ib] Q yg32 A sO}MLL pfZk4V8\.L2d~LTF^|*5!,U<#]{!N"eq|ǿwp [XM}zaUu#X+eg&le k q>m7tt@yc`~]Bk֍ƍ(ٖ)}G|PKw KDx9HE[Content_Types].xmlTn0Q1\ ]}ׁ6J%P%=3c31fkNy>k0U Vb8F+$ƍRmd,wƔx(fu 'y.C0ZIމƕ*jg9 vZFz)8}b KȚhlTrg&Lgŗ sFn>Mu n+17֬N3t%XX]_5>n?PXB9#~5({JW/S-#wgvRQ婙ù}PKw KD[E6 _rels/.relsn0 E|= ;SlE`$[@pБ\hF9aL,a.nyljbv,CB7aO{Ӭ[+'g3JOe tfv^~snttd( ՆoJݣp8ׁ@ EW6$:RYѢ=X>yPKw KD}H0xl/_rels/workbook.xml.relsM ཧ ոhZWnU/@)4@1.%[J v[gɴĩ,e񾐆gTMG x J#I#W!xQօ e=bF.х=D&4v?4mkWz _MDFZilS ?c°PCꕒ۷\M.PKw KD]ҡpdocProps/app.xmlSn0QU=DJ=*]gC,.$8ץdxDa/6`IP;pD&f E%ǡ(Wʹ-90eR\] 8 T 隆 &ѳ1VɻV(x (&EJ:$QKC3M2^ i3]ޤY9'k M-g6i7|Qw\m ӯ`4Frxy p,a唓SZr4`re|tA"aUs.djXnӭdwOñE+nYig$Ȁ4I:z5䥩lqi冻]5Ѹ96Nah4[ HH$kA0솝 ,͌(5 e x(WDbsуu K"9{` (> YEpjIf΋X(d0bN׾zëOѫON>;yɣG'18o_>r0N_bB/z'/pҸ> Hnc߶%7}L5(bCt!nO1D]֊>s6M?6vo*1ҺO $ *V'=I M=$$9~H R|v'xGݣݐ}:f AO7iݽڜY7!G:"3&ipO$Zဥ!L\,Ƅq8M IYl!r sÎȮ 4"=.q=3,W{]J&7;ʔ*]4\t1 tmtm=ق-S;xɋ*uQ.[TVf׬Mz5g Vb#؁2r+KZ z{0{::O]bßZ%#cA$JTq2;cM(x ͭO ]7{yDɢrGrgjeDžqKJBjjMQ|^jTfңR_Ss{-=f#7S8Aiՙvrӌ/C2wzV6)=j&<"x8k7/r WprF.AŪb6['E6LEh}gL_`ь˦ef/(w m$bcFZSU:U鬵5+'шx婩ֳSIā?߇C{yj_FͼVjoŻAGRV}m fP}>  to=ð7!+׬Q6RkIv+Kj߈;Mq=ut5eob%c]HQf њp7PKw KD,txl/workbook.xmlQn0 +}15G۠=+6]ECn~)5i=$ ) g8\(>mAdFǟhDa|,x:dEUbt1\"#/Xt(5vvpRt5O`Ul;HMKm}Úz7{٨.eUi{'|BƵϰqƖָY+zxE' iM./G 8k}6WjO:+U=y(n Rcץ>#=滇?Kj(Gr>`ﱅkj%'9ؚKqɁtYvQ/[t)=>D۔Z6tcS ZnqJ<PKw KDW\ xl/worksheets/sheet1.xmlVr0s=&iwˁ W&"0T /ݳguV0k>xJHe|y7fZUe$%wL9QVyd?3mQ[mVl=lir)HYu"h(l;, ʳ=i1oei%6z8fMވ6>O}}d&oIAk'PKw KD"hxl/sharedStrings.xmlPKw KDx9HE[Content_Types].xmlPKw KD[E6 0_rels/.relsPKw KD}H0#xl/_rels/workbook.xml.relsPKw KD]ҡp"docProps/app.xmlPKw KD[DdocProps/core.xmlPKw KD*&3xl/theme/theme1.xmlPKw KDM1{ rxl/styles.xmlPKw KD,txl/workbook.xmlPKw KDW\ xl/worksheets/sheet1.xmlPK cxlsx2csv-0.8.3/test/no_cell_ids.csv000066400000000000000000000002501465173235000172670ustar00rootroot00000000000000,,,,,,,,,,,, Date,Agency,Customer,Campaign,Publisher,Format,Inventory,Impressions,Clicks,CTR (%),Price,Price model,Revenue At the moment no data for report,,,,,,,,,,,, xlsx2csv-0.8.3/test/no_cell_ids.xlsx000066400000000000000000000146061465173235000175040ustar00rootroot00000000000000PKX_N@P _rels/.relsMN1 FyHݰ!.`Ϗ:G ӳH\EH2)ߟ_4S%XXV5N|Z m`R4H` Gΰݬ_x -Wrl #d j|D̮r%C4FrL-Fr{jWu}/L/c{-M;~w98(dJ-iI7}Uy2?GVN/b*1%K'/EۍÓr/;Q'%}PKX_N@BR@ydocProps/core.xmlmRN0 HEI*qR9p56u?doHm$~mq̎fwUlΦI> Dlɲt)m뒵_=$J4BzlSx C@ 1!sKv@9Qw$j<z P&K%gK߆f0PC,Fj6 ̍h=M4ŽVr$g9Yu]1(߶ϻaԕMI`Ud Wlߏ q,π@ #1Z Y Qetcߢ@FD-S?:].)j& GH[~MUCq,KPKX_N@^}gdocProps/app.xmlAj1 E2xxEPmн5X2&dΖE+Ti__ofIcsR#a֭j=C&W[TvH52P`ԉ9ﴮյ(IO%9[M}= h0`!_h ݯ~,uyyޱhDmkokdgn"z2Z PKX_N@5eUxl/workbook.xmlQn0 (R4iڤq6.H*N)|œVնN篏ZvٌO' g` =e gU8 z9Ν;3[xB j׀J|-Ax +P&ɽ|PXh|Dѧ Q[庌3F4M u}U*E1^@EҐo2[_zk2;n-ML_j VQL󊑧TcV ߵd:Y9oPKX_N@P|,kxl/theme/theme1.xmlYOo6S;:A֦ bCLKl(Q$lmV`u؇a|=Ltt-!{|H]ݝ"rVP |DӨ<nm;[2& AN- b) Crx:i ԡ1>bõk'xȏlj<Z˲`Fa|[SǵIղ F8b2JHcB<=Ա X1d@N ͈i~tW;9xڜ#'.33NmX>!Sڸn.auG$}4k9>:u&.RHzsn#q'Ii؏cQ!j ~Bw?q1fL%h&43 U\wa+һ/,{x z vQ./[egj[)Srȃ\9lL>U,Ǣ;H`MRcAO]G(/XG9xg9=^@_.IQu,X[MϛB)oXHj5-.ujʠ̼jZš} Yp$W,)tqQQ$#b\L[iߕ!TFu7( bKd03JKR;XN[APV0S(<&8-Wf\܄R6u4n v8yl|_bZȿ֨`{7 @} )7!D6)ծkxLBi;ۚQ3"wDяGh&J2A'͗k}ƙy̲Rݜg:*imf_.w*j;SH9$WV9T,aO-p{ L"'9C5XreIG5jcXtDY{HNjpbu]M2qa7TOm\L2tw5.^w_^̺UYlc*֜k;jU?] R`"d[Pj+OfFշTUS!]M1&+B(.Z=&]ūǛ0ck3) S9D;F3pOrg0y ]C>,7rb#::+RS56V|UUCKX;++ 2X_BoZR,+&[Bxm9yY˚t[L]mR`i/l:&un PKX_N@<*Bxl/_rels/workbook.xml.relsN0 _%!l]v^ jܦZD8HVNƥH'?_Ыw`*JP8rsg{|HG 9=kMR41EV'[lzU:=S흁w1Iޱiw>J@DzTiVK o/mFYV=ǘo<,Ir3x$W/n PKmfL͂ xl/worksheets/sheet1.xmlVn0, DHZ%RXl_C?P۲M@ݨ}As90g|XW%صepq/K4J5[ۖY 5oi&J?-$oIue{kBo4xQ xND@EL8s1P$훿R8=R*:}Lbw^~(|B]BU9e?{FE %\ Xʋpa ?|+~gQx%+)k#cY'Z'bl/׹؞|ױӀ^? xIA(VG^ F( aO_r DG,6fP7k?;޴R>f$s+H ~@cii$5d~]z냉ބ掴g7j <C<\g[]0__MI?Huj;0N~`ӸM;5֐\LJQ=PM1 эAض]ݵ>*04^p^ԾA%3EtEo҇ %U5qKfM& PKX_N@Zn xl/styles.xmlYQo0+RZV&"=L$&AJ;%fUeZb>_~^oz8ək["c^ݕmU9}~E@"{%eq:%e@I(X:U)(YTTιNA2faʙ9_3ٗ(yHTO܈j.%Eo^0-2gqoOМ\Xb9Uk)8WW@_r~P7&$RR0@79zvV-!▂l'ʱqT<ttwz%gVS2lB l)`Ԍ$JAOaNSrE\KK |[ddv7lOUJE\xB?!jȢPiLr,T77y~}IwsMju1-'yׯZ!ɳ%+(Sn.t.ۥcDE2ޮSR`,nQ4XvSw-"5~䡓tޟ RK]YRA:Tow_@5|-G@q$HA2Hn1KNUwԋrkj]M -.yUjtnFM܌;j#u*eBP=nǍ?<ǁP:v^|6B :}7/htc fD7ڶ|ݔ)lY_oKyQv t '8Ki][T{Њt*tGII&>dI.gA2p!#ɈjCw/݋LWä+ `B "+ǰAyN@$49I6 4"D.6c#=#1?_τaS.#Ghrc].1LcD!. 5ɞ3DH # tP| ec aŽ P.$yP;Ϝsv'PKX_N@bPnxl/sharedStrings.xmleMj02 Qv)BT{bZ#W3 ٺzɦ <=Or=0TlTQ X 5:#uU0 $%q:a5:3? H*Cyhz9?jg,)}$)IA$q{Fتl&n#w&ܸؖrM&'K}G'$a2wR\sͶǔ.o[O^ 8`0F@Q] i=p_.ZPKX_N@8`[Content_Types].xmlTN0WjpJ&4VnKm$~M6G3ٱ^^'M 9GR/~QU٥H킇Bnl:yF@ Y+јWM ٚd Nt6Nq#ʖ`Bj؇I=uGsaL Ը9SS"F[?(mQqVm ,2$$ƷB}]aJ|5O؃Bv(CePKX_N@P _rels/.relsPKX_N@BR@ydocProps/core.xmlPKX_N@^}gdocProps/app.xmlPKX_N@5eUxl/workbook.xmlPKX_N@P|,kxl/theme/theme1.xmlPKX_N@<*B xl/_rels/workbook.xml.relsPKmfL͂ $ & xl/worksheets/sheet1.xml AU77PKX_N@Zn xl/styles.xmlPKX_N@bPnxl/sharedStrings.xmlPKX_N@8`;[Content_Types].xmlPK xlsx2csv-0.8.3/test/run000077500000000000000000000051511465173235000150370ustar00rootroot00000000000000#!/usr/bin/env python3 import os import sys import subprocess from io import open PYTHON_VERSIONS = ["2", "3"] """ This test uses sys.stdout. That means this test doesn't verify: - file output process - differences from sys.stdout like line terminater """ def compare(case, arguments=[]): failed = False for pyver in PYTHON_VERSIONS: ext = "xlsx" if os.path.exists("test/%s.xlsm" % case): ext = "xlsm" if os.name == 'posix':# in case of Linux command = ["python%s" %pyver] elif os.name == 'nt':# in case of Windows # Use py.exe http://blog.python.org/2011/07/python-launcher-for-windows_11.html on Windows command = ["py", "-%s" %pyver] else: print("os.name is unexpected: "+os.name) sys.exit(1) left = subprocess.check_output(command + ["./xlsx2csv.py"] + arguments + ["test/%s.%s" %(case, ext)]).decode('utf-8').replace('\r','') f = open("test/%s.csv" %case, "r", encoding="utf-8", newline="") right = f.read().replace('\r','') f.close() if left != right: print("FAILED: %s %s" %(case, pyver)) print(" actual:", left.replace("\r", "\\r").replace("\n", "\\n")) print(" expected:", right.replace("\r", "\\r").replace("\n", "\\n")) failed = True else: print("OK: %s %s" %(case, pyver)) # test STDIN, only works for python3 if pyver == "2": continue xfile = open("test/%s.%s" %(case,ext), "rb") stdin = xfile.read() xfile.close() pipe = subprocess.run(command + ["./xlsx2csv.py"] + arguments + ["-"], input = stdin, capture_output = True) stdinleft = pipe.stdout.decode("utf-8").replace('\r','').replace('\r','') if stdinleft != right: print("FAILED (STDIN): %s %s" %(case, pyver)) failed = True else: print("OK (STDIN): %s %s" %(case, pyver)) if failed: sys.exit(1) compare("datetime", ["--dateformat=%Y-%m-%d %H:%M:%S"]) compare("empty_row") compare("junk-small") compare("last-column-empty") compare("sheets", ["-a"]) compare("skip_empty_lines", ["-i"]) compare("twolettercolumns") compare("xlsx2csv-test-file") compare("escape", ["-e"]) compare("hyperlinks", ["--hyperlinks"]) compare("hyperlinks_continous", ["--hyperlinks"]) compare("namespace") compare("float") compare("variousdelim", ["--all","--sheetdelimiter=x33", "--lineterminator=\\r", "--delimiter=\\t"]) compare("utf8") compare("no_cell_ids") compare("sheets_order", ["-a"]) compare("formatted_inline_string") xlsx2csv-0.8.3/test/sheets.csv000066400000000000000000000034151465173235000163160ustar00rootroot00000000000000-------- 1 - Реестр №,URL,Название,Вер.,Сост.,Аналитик,Заказчик 1,url,<<Шаблон сценария>>,1.0,Подп.,Фамилия ,Фамилия 2,,,,,, 3,,,,,, 4,,,,,, 5,,,,,, -------- 2 - Вариант использования №,Элемент,Описание,Результат шага (Выход),Ссылки 1,Номер,Полный код (номер) сценария,, 2,Название,Полное название сценария,, 3,Описание,Краткое описание сути сценария,, 4,Тип,Тип сценария / Уровень сценария - можно опустить из описания,, 5,Наследует,Какой сценарий является родительским (базовым) для данного сценария,, 6.1,Актер ,Кто основное действующее лицо. Если есть еще - добавляем,, 6.2,Система,Кто основное действующее лицо с позиции системы (продукта). Если есть еще - добавляем,, 7.1,Цель,Одна или несколько определенных целей для сценария,Целевой показатель, 7.2,Цель,,, 7.3,Цель,,, 8.1,Шаг,Описание шага - кто что делает / с кем-чем взаимодействует,Артефакт на выходе, 8.2,Шаг,,, 8.х,Шаг,,, 9,Альт/Искл.,название альтернативного потока / исключения,, 9.1,Шаг,,, 9.х,Шаг,,, 10,Альт/Искл.,название альтернативного потока / исключения,, 10.1,Шаг,,, 10.х,Шаг,,, xlsx2csv-0.8.3/test/sheets.xlsx000066400000000000000000000372651465173235000165330ustar00rootroot00000000000000PK!錌~[Content_Types].xml (Tn0W?DVCUU]-L<Ķ<$)Ti$.m~t_gS1L"9m:ADHjU8 8f8xW[LEN,Ra<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK!JaGxl/_rels/workbook.xml.rels (j0 ѽqP:{)0Mlc?y6У$41f9#u)(ڛε ^OW 3H./6kNOd@"8R`ÃT[4e>KAsc+EY5iQw~ om4]~ ɉ -i^Yy\YD>qW$KS3b2k T>:3[/%s* }+4?rV PK! xl/workbook.xmlRN0#?X/I#ʢ)gO ǎlioy> ю7N7sZ+`;TPOQbSI +tmkjs}5AesZ9׌n"65sYb 2t7Pgpb^r=ʷh,K!ᢿjԽHfxNw0-l̼9 aKǑg sfĂ+t%K7ŃdY \hP\^mdm.wN@*ӽtSpbSvӲh0.xO| f$Üȳ1skwGsw~?+YVS0Y!̓l#Ǝ4PK!E&$ xl/styles.xmlZ͊FBI쑃%Yb$aag!Wj"-{O)k,aW(d˲=03bj몂)q`nw \ c!Al J/4-.$Dܙw(Fs-#13;^3Xe@mL/{j`)GxⵃIfᵸv 'O>TG75ej{E!)a|b/{b.%`q0 FСENqBPH Y^}`e^_l ~֠XnZ|Ih\[sQi0|؃p2e ̮a\{/83~kE" w=P0VDtM݅hxȜ'+&D.ܬ:(P\ 1Q7_wB(%>3'P,{,CU4QJ_WGɆ ^ķ#9:ZC%jY'3"@ 2k=~\p~<"2?VyQk"9 9S[V~內`5S?7Ơ%Pv+=5Fw:`Hq_g_Xy#ލU1̛P4|j'#l%K)[2BN2 U0z5_h2);$z On2ku% Cݞ $:_)u*h#HYBG+e=Tn\vW~a?@ݎ AiBMա_)gPݎ A]#H2ݞ *P7;߹Ҿol(["#/%yNIJ>%6eUM-waWdaLN7G0~N>f0Kb%7URgbR0fk -}D(Voιo7PK!,B#xl/worksheets/_rels/sheet2.xml.relsj0D{$;P%_J!&E^ۢJh%؄Bc0]Yc" n@!4D,|>X< ~IлKZ9fVBlaopqSFdLeRcLOhvM7ܝS 0N\8ƀ)Hτ%`9H=U˄bAGw swPK!;m2KB#xl/worksheets/_rels/sheet1.xml.rels0ECx{օ CS7"Ubۗ{ep6<f,Ժch{-A8 -Iy0Ьjm_/N,}W:=RY}H9EbAwk}m PK!P*8pxl/worksheets/sheet2.xmlXٮ8}i> fɦ$fiM?4;38 j*l)_B8kq*睷]Y.[xE}*ߟ~۸N');?x~8Q_+ ^hveW\-u\\m{YvMS?V-}[-oyyw]36,xZo7~H˫\Z6{ܟJx rZ~>.=wyS[GgwD+^~쵮 3@z QWMpW? )z0ߧΉJU?~*`bBQW@_VbH\ʓpBoGoooISf_C>.6Q60`fyb"P&L7hPzj"T&Llz6@n *-M"ϗ*;WfԲ.]#"?@]cҳ]Q у nhbҠPX22aLR4f,a zղDae̵/5VS'#BŁ`DN9L!L ǢQк6&aF&58#b5G[&X"JFIb1R*D+Ys9ZD,Zq'3DHUS*DQL!ITsTXBZ"J2hZo8$Sb%b 9i(K<+)'QVTsVXTR!Z_e$J9ZD,ZE+T+qH8VR~E!!I&9 O ra8)H0pte a'{l:1S$5:x>5la'G>Iĸ Jv$HP+Rj%fi3_6"T?1'c_LǓ}@'Aje˟ na(HƹIL2fIx ="P ^@~,x,@2cJG޶ʗðSX$ЎЏYY+KcøRZ,e gHKKFϠ sࡥl'X" q:Y(+kt ق"aXhVH<4F8e3(yС04 .HO>!|?Ao/Ω-po廳u8վ^+|u l\ -p8M/-BYV+\TiS6 ( iwඟO=R+9PK!.=xl/theme/theme1.xmlYOoE#F{oc'vGuرhF[x=ޝfvg53N[qA.`E\~@_73N!Io^ bhIy\ʗK"4ޝnҊq37"һ;W ID*{R‚a2-Lb%DGS'٢LƓgl26+e#daVqw!W2?oa^M1uܺES)rR1oLZVU3%O^)729},UK4'shTk,~\Y_td9|l.;x9|Jm (d4ޝCk))df!|+>CA4LcMX-"|62%d}&zbCҜMT{?03z{u:<=:ѣ,-g&—|O|bß}R |IO/>o]n}#ƕVtCL8[*tF5]x}xߑo5(4 +g0a^&׶ T,(7C∹pp@b㻄hwRǮ[\B(j`Zh.94[I#˨HgpcYdEBB`V |0njPᨈdG,oXEBvFZR8jEkn 7W۷(rB"71ym8Jy{rBm[~K 8"D %mF4b(Tcoq[(%6p»6XxݷuݓrvV`vɦg2(c5b4]߆AMŜ&@zl T'q=M$)@K8B]ƪ>O };cÔـsR-iget%% jF4SnSԚГ dp׬ᤂk8sEHORi}T6Nb\@HOZ[M}ngqR]vKYϼX:8,FuV]zI!.uYI6OMf3o2$(-NHTX64T,֜U0E)`#5XZ`Ǥ;%Uٹm;R>TDt>걡~OJ0A5rst-%!N˭N,-Tt+(w~UL_*0$KAeݐN.M-1`e}rk!6/XՒ3p#>y}'@5)Paq u !TՍ0ʕuM98Ai!yx4=V+8y/t6Q:)IR 0361ApCbC ѝBU)Q(#@\>r̯ncVaB焊c, a (wh_q0h5fP+7Y=L7DazPK!E:xl/worksheets/sheet1.xmlU͎0#=ߦMvb9{q-'ē^!}#I&M⒉o񌇧wQ, O)]d:RH13}3y %8qb5Iy"`SB$MKD8UYBbX2aC>҄NQ"LcT0 pzd̼EDbQpbOh4))L]tf H (YE䖱\]CJBIJY .:7A9'V1诸)^5[ tT{dXp*#%w]Q_.Ԟ-@C!d]xT}1JVs R2X%ؒ9YQNvˡmm@ `K [ulujb`K Coy  -HJv-g'H_5:z]dOk5 \o'd-4MBvтy߯!Rg%3JH{]Myٹn޽"(Y]L<E$NvC?BeW%a\pLPE/I@PK!}n}A'xl/printerSettings/printerSettings2.binVkpl 610MpjAhiIHڵVơ!+ijH0ЦMɴy'KKɏ)v:eh ܻ+ d&L{=;|眕L`B,F}%&pXhDžl ,_M6AZȠg,ߍE:@|M%t?ڏ߻\9=F=Jdڝ9S[zΛy5_܀sA x,#rEt OIb Ez}NAZ߃VAhB&lV=@(\$ȀկdC@Zp#~V3GX|S$e幘LSTS~A%LyoUmx0[n}]t,.MSGNMۯnPX;g$gQΪ<͵3W.XPb|}\hpPPAcȔ]}:7ιsapnP篼7\77RXpí:eݜ8ѹY۱1|wmdU3mSW:n>~jÏ"}$m;?Y4@7_:OVV,ߛ8ԊsnyX~ؿ9vṷoH~x`Gߙ*V=.:ux)-ֲo#}]Y~G.r}˾ZkwZNtDժ.EwEwޝ3r8O^ۣ>߱ w^n^2ח"U5ž{x׎'M⵭[_%&rYe_yvMx|_Vv               7PK!/'xl/printerSettings/printerSettings1.binVkpl 610I`$Ӓk!+ijH0ЦMɴy'KKɏ)v:eh ܻ+ t&L{=;|眕L`B,F@>hlc er+|A;78Ngiyf 7PSK훺&&3'^6pӹ*?~rFd<+skwBz:Omn"cK;o"?| nLpu@hH@4ౌs%>&PuT"Ȧn8((!mEb5Qia5h..! Pĉ] v"@ CadHH,\x6L)3ؠHFiWGUJ$9DGx QEt؀ıPz0բσ0E|f9!dc?d9:,B`U1G! 6HTŔvZ::&IB!%Na˲To8$^8#TdㄔEJ1I>мӹ &*xYu 'eīReY+r;eosDv$jJlPJyY= Z} o5h0.uqhdc`&Y@QsIvqzF줳ڌgzJQ1{3> ^#'t ;BzJD8qJ t tD_+!4# gž`ݿ|GX%ޠF"cnKy C;D%hIda]H֪C)11G}J}29n*PQdVvG~>\8U_{Lzۣ ip=0>.9FF?#eYJSyr.Y(s ԅ\8$ΰ2 RE5a>B QG~'Bբul?}ZaA\dT\M bBR3MRMV#0qUYl uZU|4 O鞎;5mBaiݫUylk[;gu]vJSM;`Edǐ)y+?!)=t4kosq皋ɭm/YA!¡/\yqwۯ;ݹnne[uD6.9+qswҾwb%b?Ȉf >=uc|ՆE;xd͞Kg]37t73W;w6_W*ϕƙ'OV F"Csl&E4(0+ͦMڏkĩ׸m#*=b5m]EC_6~d[rzGmA>\܋|*snmWO  7{J] ?Ï- _z)+86z+wZͱ9"- q d)MBsκwG!~ݽ PK-!錌~[Content_Types].xmlPK-!U0#L _rels/.relsPK-!JaGwxl/_rels/workbook.xml.relsPK-! xl/workbook.xmlPK-!E&$ | xl/styles.xmlPK-!,B#xl/worksheets/_rels/sheet2.xml.relsPK-!;m2KB#xl/worksheets/_rels/sheet1.xml.relsPK-!P*8pxl/worksheets/sheet2.xmlPK-!.=xl/theme/theme1.xmlPK-!D: xl/sharedStrings.xmlPK-!E:!xl/worksheets/sheet1.xmlPK-!}n}A'%xl/printerSettings/printerSettings2.binPK-!/'z,xl/printerSettings/printerSettings1.binPK-!#xZ3docProps/core.xmlPK-!^W7docProps/app.xmlPK:xlsx2csv-0.8.3/test/sheets_order.csv000066400000000000000000000004621465173235000175100ustar00rootroot00000000000000-------- 1 - b x,y -10,-1000 -9,-729 -8,-512 -7,-343 -6,-216 -5,-125 -4,-64 -3,-27 -2,-8 -1,-1 0,0 1,1 2,8 3,27 4,64 5,125 6,216 7,343 8,512 9,729 10,1000 11,1331 12,1728 13,2197 14,2744 -------- 2 - e EEEEE EEEE EEE EE E -------- 3 - d DDDD DDD DD D -------- 4 - a AAAAAAA AAAA AAA AA AA AAA AAAA AAAAAAA xlsx2csv-0.8.3/test/sheets_order.xlsx000066400000000000000000000302711465173235000177140ustar00rootroot00000000000000PK([N+MdocProps/app.xmlUT lv\rv\ux Ak1BC]gAdW SAdVLHFԖsxfsIQ ɱt۸?iUŒ {}Ū7 g,H^Twdajd⒬X;%$Ǯ[^ɣ_6_g|mRfĔTYlC¡3p7s J{ex wA{7 OPK8[N?\adocProps/core.xmlUT v\v\ux MO0 UmڮQh'&! -$^h(ɾ=ivodhk(֌2Gܟ"X"j 9:AfQZËhx$MJU6֪cC7 BւX+BI 8[,F, W=HU `C58 "|Z\mh+઴+pq+u#x~msrl&9HzUƏO9*0؏4M4N>2Z{00Tseيr\W j51vdq$IziQal?+,qPK[N>oh'xl/charts/chart2.xmlUT %v\%v\ux Zmo8\ԯݐZ]:-{Wmᾙd:6ןZ܋V=~<33<|Xf{ }+dR1hGrN(4eG9ODFrC8; ES,E' nk) L+ErYnH#V+'GݲT)#)ҖW+“m|L݂Z]UusE'4I)5Ub6B4Z^4}ԣ( ʼz ST?z2,eXVJˎXeNKDEy%~_o޳X-V& -?1̀%`Ué7BdpH1b b^l DEAST6la,?xxQO#Lhz8Dm0s6^hC 9{.M ;.m [.] Ð# *NLXAn:c$tsio sЉ!FBb$tu!FBb$t;S0JB'F C'F C'FQ7פR.۷#S~$ϻyG&cAs?ȇf\O<t;"}eq.ՈZPdkRJnnN6wE P[1EЫkS`4e]\dQ&*g)L (Hl-__NNLz/_绾aGH@V}?Q9_HS,eU1rR't,s཮2i@"F_[4Udu+wܤ?7-O$0&ZuꊪHA;eG RXc-ЉPML]ŏ]# [Iyr5)D`/Ka6fqgJ^uĂղ>Hm%d! LR !%YnQPXUߍk>4mtd/Q<6hY-EH?&']l}aRYVlUV|uʤl]ʖmh{'؞C8y&wМ=ywFW{#}ڥ_m~/.!ٖivwݪV׻|7PK[N/ xl/worksheets/sheet4.xmlUT $v\$v\ux VMo8@ӮevvYo -7ZYD(R%)ɯW" z9޼y3ݷB=hÕG0" SŸͣOw"b, %a=]jvP 4(¬Du5i 7mRf"K-=8o28kKh;a-MO3] 9AJw]S3m4<2NNF[wՁhVƪ"Dh j r {OquI[WƟDb48ms'/?y|?~'/׷RsiW$6Sk[pN4=0W?*iXݻ8F-OQ_T7q>R]<N-Y&~\ wl EY2[a IReXQa\W^Ni=[Zo4AkrNT~;osLk^cWo&l\PK[ND$xl/worksheets/sheet2.xmlUT v\v\ux ŚMo8; =m3d6M$J{X3XLgɧ_00uB`y^~&lupАdu %4+,w=1bƜ秞W1NQqBsqq^3Be&"SvE$4ؤ8EEL9REcND#-rU+HDnOyTrV98u[ow>D]H\1]mTT'#5ɰ(lSM> b+cџk%GO8qS OD&GhpGپ|+r39Is'ga:vWJӇ%*eJnVβ'JeOU#95t\-. . JN] u8̀y&3#1$.2'z6<%!nfB~NÉI(oIOr !E8@tQ3Ope}tFwSMiZI\Kl\UHr8Qүf\CENVoKo۴vb]zZ@]*}_i~Gۭ#1Q;Zz/&Blڍ5@#lo3gX36x<@|&6>>h<:t >Sivc&>l|Z05vc=`m|ϴŽ b < CXó0^-O7|Kڭ5B7!jy? U#vj 3D4. m1Tt ;'Dt36 :ZCJBzYu>&%66ݹq&GD4.m1dt/ >,:!R&>-:!%Ц,bIJZ Ciih]cIJZM-H۴t+&1oEUOw j(GMS=+FGjh`{j86] Zgd`CZá5IkХ-:#q6eHosu1%ui<`E)#4(`Ox'畇 &"z|66KNsucg?1Oq3PA ^$ ɝ=W_M˭gu[]]#2@Hwc[B)F T) :ɑ܆o?%(x>o1yN #$<ϐaJO|v;܏TSМrU2R$DҌ(Mb0cbHðÐ2FD<ڜ.4BF*5 TBf\*UQɋA~a*[H4&w D̴.PK [NU xl/worksheets/sheet3.xmlUT v\v\ux VMo8@֒qS;E؈-,"W" z9f޼B=hÕGAb\iDQ$̣0^Jߛ <ʭ-ؤ9 T w2 jqw)5P*D ?}}gҮJs$G @$cű5߹QIKto qj+K28k8=b<:k?VY$W;AP%{L*qޗ7[丧1:%-k=Be;#ܮ -r+ 9RAZJ[M9Ke`**h@VR9Eieh ww1NI%xcM*9dSΒ[K$a<˰(Ƽb}M+*M5-w [;r[UP-æ?7Yܹ`ױDw^ L?owI[ūPKK[NExl/sharedStrings.xmlUT v\v\ux MN0}%`͞:U 8Jx<=C+4o3zwN;aᘩղ>ұϏp,0f.Ȱk58 "{LyBқC.)nT0< J} uy& hs5յnSc9!^n b01:3) 271:XPKʘ[NMxl/drawings/drawing1.xmlUT v\v\ux Tn0W|oJC1M߯$ ݮޘ7ocon[U+b$47Ի <_`d~?.6mnymSfrI +ŜaG `OjQۀ`pP;M1Ɣbk5s [bR)Ntw6ޓ.pxpSц?e/eBO.3A9"Իy1PPJO!5Rck\[&Bd(o>yշ5Q Nգ Yd cD>@MiF9}[s/j5Jho^ƫuDgY*Z^$uށ8s!Q{fJ9$1 +X=/Op٬{1b1L8w-8娥{ ?;Ha~PKϘ[NzP#xl/drawings/_rels/drawing1.xml.relsUT v\v\ux Ͻ 0;M"bER פ|Dѷ7ǻ}{73a*ZA+0Y[hU?,Rz%9(5hs2`DeP y Y] *! t ߍ$ՠM?0EHAa@ jA "[OPKš[Nx7'|xl/workbook.xmlUT ;v\;v\ux Tn0?ZVWəFkH:[;ZMc 77BІ+PR2Q)~}zSJe2eBI ~w+$&qLCL_ ђ)]08RB8뎝qIeC?O; <t &b܂F`vUА}T)r-=zW ,þ];~0+J WG$x9(i?c/AnGFԛpmS xl}>4׵:]tй9s:_PKI[NAy xl/styles.xmlUT v\v\ux Y]o0}G?XyM"^bCBB0A_3OͳB1nO "푡͒z_x9uwm6t=K޾.k&^2/]X!\)[p;6cxsƭRTEptkŽIōI?P|Qo|uUv\/ELqGy;h_ƬE[,pquyqY0?Ă@-\ bAD fr`. mOBspcp"pEbu{{zt]/{Qj`z촅{d( jq @ XtbK` ;pEqE Pam@h?_FiHDP 7@=z@-v" jwmozPK[N#+Xxl/_rels/workbook.xml.relsUT v\v\ux j0 {a`t_]%n/c=q84}1XS%'#wЋ7$SPd9tםkoaYTOΰtɱcH9]i< :Z9ekI HB\}up |4o^tg$S5|Y!64{:EgO+ bRYTNV3EIl5a)HgQ%/>v PK<[N/M _rels/.relsUT v\v\ux N0 x5ݐBvvCh<@H6jGD\8&f;OzE΁UUȇx:/oaZ48Z)܇U)@/ήOVʑ;lz]72P:᪽7{uxOx 68ܑ{0m% rb`L4T JZ_.t~`=XojGĥ%`>:yr:&5,=߽lJGF|PK[Nkx5[Content_Types].xmlUT @v\Av\ux ͖_k0߅}Fc0&=,`$Ϸm*K/{yuYDKNjA'(TM{2]ƀYޛJϡd.2ӶdvN 6:(ʃ4EQV &gVBF軅Ѥzq;TfSHY.,[r5F c&g Lc|&% ܱh ”tI~3!frs!r{NmKR]lmu4|z_PK([N+MdocProps/app.xmlUTlv\ux PK8[N?\adocProps/core.xmlUTv\ux PK[N>oh'xl/charts/chart2.xmlUT%v\ux PK[N/ uxl/worksheets/sheet4.xmlUT$v\ux PK[N%  xl/worksheets/sheet1.xmlUTv\ux PK[ND$xl/worksheets/sheet2.xmlUTv\ux PK"[N}a"#xl/worksheets/_rels/sheet2.xml.relsUT/v\ux PK [NU xl/worksheets/sheet3.xmlUTv\ux PKK[NE xl/sharedStrings.xmlUTv\ux PKʘ[NM+xl/drawings/drawing1.xmlUTv\ux PKϘ[NzP#Gxl/drawings/_rels/drawing1.xml.relsUTv\ux PKš[Nx7'|Q xl/workbook.xmlUT;v\ux PKI[NAy "xl/styles.xmlUTv\ux PK[N#+X&xl/_rels/workbook.xml.relsUTv\ux PK<[N/M '_rels/.relsUTv\ux PK[Nkx5#)[Content_Types].xmlUT@v\ux PK*xlsx2csv-0.8.3/test/skip_empty_lines.csv000066400000000000000000000002551465173235000204000ustar00rootroot00000000000000№,URL,Название,Вер.,Сост.,Аналитик,Заказчик 1,url,<<Шаблон сценария>>,1.0,Подп.,Фамилия ,Фамилия 3,,,,,, xlsx2csv-0.8.3/test/skip_empty_lines.xlsx000066400000000000000000000554721465173235000206160ustar00rootroot00000000000000PK![Content_Types].xmlUX 9MQTn0W?DVCUUI8t9H0X8(}tJŖc[fI::ڂGeMɈE` +Yee߰I)5= bm0c ju`Mi}-(;Q d45bj0XC)6])Y*â]C1VpͷF mY-6uIy+u H~D2W$wSp:N -U;!^=0I0 c7ԟWKkJ'P&!xC &!d$xRU En3'Dç:|3go/z8]av#iPK錌hPK E> __MACOSX/UX 9M9MPK!__MACOSX/._[Content_Types].xmlUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKPK D>_rels/UX #MuMPK! _rels/.relsUX 9MQj0 ѽQN/chCn]aGҧOB_eƏ<⇄]dv TPKU0#LPK E>__MACOSX/_rels/UX 9M9MPK!__MACOSX/_rels/._.relsUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKPKD>__MACOSX/.__relsUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKLPK D> docProps/UX #MuMPK!docProps/app.xmlUX 9MQSj16b iɡ;ڷȮ$$e{JKz'Bhhi Uur(t/;o0ӓ*Jfh$W ^@uLT2'db$ZHsz ĶBX9VE!8*~Vtx1,=vk+'~Ժ8%}+QV.yPoh4~f[є~I0ƴ`9ڄ c)ݨImB'C53IֲuR[g1| },a+`W( W}WLqf@ 2SnW:rpp>iDˣ7iJ3׀;FS{g9,e$3=vKrg3e/C__MACOSX/docProps/UX 9M9MPK!__MACOSX/docProps/._app.xmlUX 9MQc`cg`b`MLVVP'f 2CB\ľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PK`TPK!docProps/core.xmlUX 9MQ}TMo1WmlZUeIE=Q @܌w./in . EHiihhI ?b$-8~xv;'YJށIw伈{Gby"7Dkm^B%$ːX2TcȘl #Q!2p+zdz@[@)F_VR2d992ȕA#w\"&H%jTƒUbȤ"pQ@_??pIn{1UR%]$I'D@/M+͓7oH3}zjNbo,+*Da!b GmZGmnV[}m>z?\֜Aƌ>GGW3q.E57̼dRr{dO Z*8Z7Թ1_І02E#Hf>"r':\ xX7\7MT}%?Eb!\'\*rcYwϋA෶A3 {w*MA7 [Appb)7 ]|(2B;hA/ PK#fZPK!__MACOSX/docProps/._core.xmlUX 9MQc`cg`b`MLVVP'f 2CB\ľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKdPKD>__MACOSX/._docPropsUX #MuMc`cg`b`MLVVP'f 2CB\ľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKlOPK D>xl/UX #MuMPK D> xl/_rels/UX #MuMPK!xl/_rels/workbook.xml.relsUX 9MQMK0!ݦlʹ)&!3~*[X)晇a6ϡNA tUAѽw`Dmuyy^sj"HeRRmqД.4>S >ew221(;s b? 7MW㣯t|fԋ c`"K05>| __MACOSX/xl/UX 9M9MPK E>__MACOSX/xl/_rels/UX 9M9MPK!%__MACOSX/xl/_rels/._workbook.xml.relsUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKiPKD>__MACOSX/xl/.__relsUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKPK D>xl/printerSettings/UX #MuMPK!'xl/printerSettings/printerSettings1.binUX 9MQUpH@!LmH@~^T}weo߲? %@kk6:-H ,ȏR$BS5LIehSJv. 3vt?{)OElm,,0{Ҭ,.\V`vF̚YA[p{Jhk;!w;zq@Zܙ>'3#R@EvO13r'@C^m?\$j8P hc+;S(,&PT"Ȧn8((!al)# \U \4/C@"Y*+(A1Hq0}PE643AX% %? S 0#6(+7IJ )q [|S76y.qMoZl:XXs>s ;.]}^wo, \ِ4ߖkUO_:M sγ<=c:?{xk;_=R@gOs6|W+W^+:{m7-qٵ_;yw]׹9ss"9eG~'/tgߘ5On{_(Z2ڵOZB/잹Pm3 ǵ} 0` 0`M PK/PK E>__MACOSX/xl/printerSettings/UX 9M9MPK!2__MACOSX/xl/printerSettings/._printerSettings1.binUX 9MQc`cg`b`MLVVP'f 2CB\ľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKPK!'xl/printerSettings/printerSettings2.binUX 9MQUpG$ JejjgHEww[-#Pe % ?J) MQRj?B \3% Mj*۽`03mٛ}}=L`\/du%&po,eig/cL2Yb+7N@O.ms'so%3&^2,pw~tƂ!F>F`ܰTj~nPWOƹ f $ F= KIbjcZibN6CC"RuBu')籵tt^M'(`CJ–e?-47q2H@ fU18!eRh$bRs U4↞ L%%iD-+##AVPTCRsj4VIDVkxnG6 DDXYgE.N-8)Fq60P\]^;,4t(Ei,LQȻ}) /u!@)NA될q3Ny %$jT%:hּ#Z ` I = 9}kC!(vr;\*BT \Nf9oa*EB~S ΄*47ٯ5p8Gk=@W{fƴ8Bq%u̷UIƑFr|7"> mAMUIae FgfCa} UA XZlH>>~z "⶗lH<s  G5)#Ұ efKح2Ye-?<5{*lzy]CYSis{F--G׽bf޼eM0}oemݯc`Xʓosx'7D׾FG~g;;_Ζ_}x}Hekb޵6i_p}FD%=NJ9~Ε!WՔi}]~~G>u?,0vE;܆\ݺUm֙ލ/[vn]UT㚾X$mێ>Y0R_w7i+z-}_9IJ6Ů_x3,E{PO%?ݷ-˚j=睿QYS owvmۖ=';B/]Jx[jOv<:+Gxl/&gbyMW~}~x׌{o:X8D0` 0` oPK}n}APK!2__MACOSX/xl/printerSettings/._printerSettings2.binUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKy"ЌPKD>__MACOSX/xl/._printerSettingsUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKG0PK!xl/sharedStrings.xmlUX 9MQVnP#W^TdQ;)4} $V(5m S.M_VCx#) y;0\7,,3sgΜyةłش+n䤍7Jkyg=m>;h:kBɱ5V2ׯ\8ic˖6b5KeہaRzx[nbg k.OZl1DTu\2D?w|Ȥ|&e~LY^&ek ԕ[NmR#eTn9Zuʦmd|@ք-5hD]jԧ yɿѵi$am",$tN3{C P-PG|%kQΨCͿp3,HZ"ISø[-DYi놚ESjWdu]kW)xR ǧ@kqQͬVr3;*sswآ @C@Ԏ¢jpr Β^1nk4j:௃Uv.S.35 :r#Ju PͤBio+00׎^)"S5ݴ{!4h:@ j*$wE< =S' c~q㸓>Ӡc0LСm1hgxq|S ml ѝBUu27DGw~Xy$GZSκr ѼC<⪧QPXZu4.u>D!sYPKD:t PK!__MACOSX/xl/._sharedStrings.xmlUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKq+PK! xl/styles.xmlUX 9MQZ݊6/g.Iv@- ; Ub%%c+dګ^оF),R}*qLe}ja &)[A2!"׵L K÷SMO0t4Hi 2IM&F'PagD}SRmDguw51'9/K747ω"K $& BxORo gLWI+I#G}mǞվ8`KuĠ`B?.bOxfIݩRBb촫k }'xv[KÕ8"!ð{%1r庶ކt;c-5 ̂{C8߱y tSB^&$%|sc4+шB&, ּ"/9Q l*~RdGj[rgGAbqI܍r1Հלx]xlns>,z7OC^VL~cV*i Y4Ƀ|%̊JjmhB"HJ oWVQ;A!"dF4^j~|?ACTm>>'*4T6[>cv[/ kaX]?I;igmO XHuW/t51R/#S\Tl)2:9C[[vomNh̭auQ_ַFz5TeFh:B㵜6j[]h-gς8-wG]G,puP7vP7vP,.ɞO٧o3"y,=fΞrՏ\9Xl9p9XObM0{\?w:XKAO6o1I) PKE+$PK!__MACOSX/xl/._styles.xmlUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKMEPK D> xl/theme/UX #MuMPK!xl/theme/theme1.xmlUX 9MQYMD#F;ͮ6٤vnZęӌ=dU# .H"?aԿ$fͶ9$~CDHúa],.Ы; 5If<$ucDqe.u哀 :RѺiJ#½>V,JU344P`;vh2F}ccʿ+T2ps7'ɓ~:'ȑl21 :2RQJ>qٜ16GN>]F:ugV^5_N/ZVe%`51%d9Zp o/kY.9YԿlV xg.֪ۗv|F:,23HkZx iQf.RPyEI!R TMtű8NpNʅX2F fyyˣ/!C/OO/}<?gz1# |Snޡ&9@<4HWcZ> 5 #t):v^+狡u?(9g .\e^qd7O5 e'5wD{$$  ]J ~ݦKQSK:DhqP|}58ӱ"E$f:x7uJ[pTi0Z="Խ/iþFA)70y4}DZi(F;\i . J6|}w"f(twx ߄G$Neap@wv` V=5bLzmL ټp /.m #YUB,~;J}+69WCBS dGevU?_>3SWFo։o M2G$A3u^2>gE\= L3>jzʏ"(Ml]>MB-+ft匋Yc<%>3g.h|jsDܱ&Y-EŻ@L}8x6'sN7PK.=PK E>__MACOSX/xl/theme/UX 9M9MPK!__MACOSX/xl/theme/._theme1.xmlUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKTPKD>__MACOSX/xl/._themeUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PK 1PKE>xl/workbook.xmlUX 9M2MQAn0W,KBD(B$HU[KŁbؑ}I??G$M 3;L$;0Vh~ϧTP-FXgR+,Ʒ7JZ-Ae#9W=&t 369sƳmr?r&m?:ME:)sP1 m& KI*$,[G+q、D2랸p#:@+"LY__MACOSX/xl/._workbook.xmlUX 9M2Mc`cg`b`MLVVP'7 5!!A zCu4%LPq_\ĂTĢļ̼T#+P&&&%'0IQupbZbQPe B.j.sJslĽ"9@\PK7(PK {E>xl/worksheets/UX #MMPK D>xl/worksheets/_rels/UX #MuMPK!#xl/worksheets/_rels/sheet1.xml.relsUX 9MQ0nzeiE>@Lm(<7>OꆙC$ @!,voP,:7EB dش怓rcHBlaI?ưqvcB*M< hVU6틩jPGO6$0)G).(~sρyY>PK;m2KBPK E>__MACOSX/xl/worksheets/UX 9M9MPK E>__MACOSX/xl/worksheets/_rels/UX 9M9MPK!.__MACOSX/xl/worksheets/_rels/._sheet1.xml.relsUX 9MQc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKPK!#xl/worksheets/_rels/sheet2.xml.relsUX 9MQϱj0ཐwGr2R,g)|E]KX~;|'C$ ]B 4Xj?Xund87''ǐX(ތa?XDŽT>Iy0o79V4+S]: @Kg{?3¤H0_Q B__MACOSX/xl/worksheets/.__relsUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PK^PKKE>xl/worksheets/sheet1.xmlUX 9MMˎ0HfV~kt4 @B 'qIlw:exFB+o$lj9&K5fꋐU}BH 9`*/*7s(S%[ h~JV+H8QK俲Lp}).zAsW3JVf)K4ގ-n[)?eCM=QE^hKmG* DlFrR#__MACOSX/xl/worksheets/._sheet1.xmlUX 9MMc`cg`b`MLVVP'7 5!!A zBu4%LPq_\ĂTĢļ̼T#+P&&&%'0IQupbZbQPe B.j.sJslLL9@\PK(PK{E>xl/worksheets/sheet2.xmlUX 9MMˎ0ƛYU\0 $pY{vFBIFl vv*?9ۣY n1!45G4&,o^Op4!\aOG%es`,<Py q83S2$t^0*(Ku0<=C$5aà)E a8EBRp8DΩ!<5ǣ*[j!7*! 8RHdsq̒V+o蓪 xxE1%BliMy 2 CvIb|R-wab Afjـj  nc~`Z22<04+pM׳[ -u+EƮ~nfW=;x0duUTE_h|%`U^ u̡,lMDBUcdHNUS6rN۱1oUq-9%¶Z$ӕ\RAWlO^-Dە\xJ^=:u̱jszE=[I]no獦]mIeWb&X[IkJ㐧Cxw_X[7ou`Fɪ,%`soFs{yTޗwPޯ??l '(ń)Zp갶3h_ 6#9)m04uY}A UW ،2bFro@X, P |97YKA`pH3ƮB>PK.VPK{E>#__MACOSX/xl/worksheets/._sheet2.xmlUX 9MMc`cg`b`MLVVP'q{!!A zBub4%q\ĒbĢj.+sJsl̍"9y@5W-PKkPK{E>__MACOSX/xl/._worksheetsUX #MMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKuPKD> __MACOSX/._xlUX #MuMc`cg`b`MLVVP'f 2CBľhJz9zEy%y @`mblljjfXiddndbibkbi`khdah`TlY0PKӠfrPK!錌h @[Content_Types].xmlUX9MQPK E> @A__MACOSX/UX9M9MPK! @__MACOSX/._[Content_Types].xmlUX9MQPK D> @A_rels/UX#MuMPK!U0#L @ _rels/.relsUX9MQPK E> @A@__MACOSX/_rels/UX9M9MPK! @}__MACOSX/_rels/._.relsUX9MQPKD>L @]__MACOSX/.__relsUX#MuMPK D> @A7docProps/UX#MuMPK!^W @ndocProps/app.xmlUX9MQPK E> @A{__MACOSX/docProps/UX9M9MPK!`T @__MACOSX/docProps/._app.xmlUX9MQPK!#fZ @큠 docProps/core.xmlUX9MQPK!d @U __MACOSX/docProps/._core.xmlUX9MQPKD>lO @; __MACOSX/._docPropsUX#MuMPK D> @Axl/UX#MuMPK D> @AIxl/_rels/UX#MuMPK!JaG @큀xl/_rels/workbook.xml.relsUX9MQPK E> @A__MACOSX/xl/UX9M9MPK E> @A__MACOSX/xl/_rels/UX9M9MPK!i% @B__MACOSX/xl/_rels/._workbook.xml.relsUX9MQPKD> @1__MACOSX/xl/.__relsUX#MuMPK D> @Axl/printerSettings/UX#MuMPK!/' @Oxl/printerSettings/printerSettings1.binUX9MQPK E> @A__MACOSX/xl/printerSettings/UX9M9MPK!2 @__MACOSX/xl/printerSettings/._printerSettings1.binUX9MQPK!}n}A' @xl/printerSettings/printerSettings2.binUX9MQPK!y"Ќ2 @"__MACOSX/xl/printerSettings/._printerSettings2.binUX9MQPKD>G0 @#__MACOSX/xl/._printerSettingsUX#MuMPK!D:t  @#xl/sharedStrings.xmlUX9MQPK!q+ @'__MACOSX/xl/._sharedStrings.xmlUX9MQPK!E+$ @큪(xl/styles.xmlUX9MQPK!ME @ -__MACOSX/xl/._styles.xmlUX9MQPK D> @A.xl/theme/UX#MuMPK!.= @9.xl/theme/theme1.xmlUX9MQPK E> @A[4__MACOSX/xl/theme/UX9M9MPK!T @4__MACOSX/xl/theme/._theme1.xmlUX9MQPKD> 1 @5__MACOSX/xl/._themeUX#MuMPKE>\; @`6xl/workbook.xmlUX9M2MPKE>7( @ 8__MACOSX/xl/._workbook.xmlUX9M2MPK {E> @A%9xl/worksheets/UX#MMPK D> @Aa9xl/worksheets/_rels/UX#MuMPK!;m2KB# @큣9xl/worksheets/_rels/sheet1.xml.relsUX9MQPK E> @A:__MACOSX/xl/worksheets/UX9M9MPK E> @A;__MACOSX/xl/worksheets/_rels/UX9M9MPK!. @O;__MACOSX/xl/worksheets/_rels/._sheet1.xml.relsUX9MQPK!,B# @G<xl/worksheets/_rels/sheet2.xml.relsUX9MQPK!Eξ. @d=__MACOSX/xl/worksheets/_rels/._sheet2.xml.relsUX9MQPKD>^ @\>__MACOSX/xl/worksheets/.__relsUX#MuMPKKE>ԅû @D?xl/worksheets/sheet1.xmlUX9MMPKKE>(# @B__MACOSX/xl/worksheets/._sheet1.xmlUX9MMPK{E>.V @Cxl/worksheets/sheet2.xmlUX9MMPK{E>k# @G__MACOSX/xl/worksheets/._sheet2.xmlUX9MMPK{E>u @G__MACOSX/xl/._worksheetsUX#MMPKD>Ӡfr @H__MACOSX/._xlUX#MuMPK77Ixlsx2csv-0.8.3/test/timeformat.csv000066400000000000000000000001701465173235000171650ustar00rootroot00000000000000"03""-""08""-""2017"" ""14:35:00",14:40 "03""-""08""-""2017"" ""00:00:00",11:30 "03""-""08""-""2017"" ""15:40:00",00:01 xlsx2csv-0.8.3/test/timeformat.xlsx000066400000000000000000000124701465173235000173760ustar00rootroot00000000000000PKMkKK _rels/.relsJ1>E{7 "Ҵz+>̈́d۷7 z?o`y9XW5( iu* #2p FɽYFzu=M+ʤ42u:#;~2`Tg Ts7HСhSI'`H 8ΟU!,4QK^4 Gx?29 ×^PKMkKI+docProps/core.xmlmj@ E -;RLJ!43`wbRsWOgq1 5-T(Zߞ'DMfe~Gc⬎* =ΪG:7"3foydˌ}DjQWaV#+-E` ybA-,J^ĭ<ͼ]Ï2v;1PKMkK; |docProps/app.xmlν 0ݫgoSDJ.PCrIȉ{#t[ĊgO ex;Өߊ N^<G0YdXRd3\L >:0zrHI,qKHm~ |zM֛?~{ȞloPKMkK"xl/workbook.xmlPN0ީC UR!zѳ7؎&U#YkfSή__* ק% .H1G'rOE4RRc)Z=!:N C'βثħ؁/"*M1jPSw#8axY=qG?gI̳<Y|{+LxͅMY "A<PKMkK 3l,xl/_rels/workbook.xml.rels 0E~EM "F7"!>MBf| >@ąp'̹d/(8Q' 1g<8I]iqEn3Uى(\&i!m Tl֕VЮUĨn'uAeh"q)-as{d^ȩLqKp pqu@җNAmdOs;V^_@;x8mlɠOF PR~38Ԑ8ggoPN?e{fSFsb ,}Ac[ҐhA䐒uW<Hl8m3d_I2v=FI4ZBɘD $+FDNUrFFV]oU۷)W*-t@G^ݘFy &'-ϔ҂'9-k"܃q)ڒ!a4v/;MN;jQB":P;խ|cQN51Y_,bn П"l~}->lUgBH 2)[vǁ:p^7u㩥qLCB]`냝!֛/-F-l}*I}*3朚"`՚H O|d 94(U~+P]wiRPtLnwMnYeK',}g'h|D=:jȏZNM٩p.y"8إHE#crd##r92ሏA qo8 G#C  G#C9h82A G82i82E G82m82C G82+vVxW_J RX fˌ*=KGnɻX@Uջ๾h=R#G0Zh=r#G0ZA`9+G {Qj?M  cP9A}#G`P9A}#~w PKMkK8`{xl/worksheets/sheet1.xmlTr0}WhBkdr4M&Mg * ;MmÀv=nc]h#UP> (&Sl ~waNEHzkL ` 7P'=dd%ŒT +EW/* ʺ 2 mJڣ˴D%UU 4%v"'4,} k3&{)O(oJe~%0>C!ʺ6"{ymf-:#V/A.KXJXUJTg+係TePE*ߤţ{d*iopSl1{c}L{?\XZfB^q)INU:`4 fhlcr>9ɘx◥!!!|]Ca6|F;-tNNl}66=<">x,F+El @ U{eQ+v ([v-)6ݯ]}ީa ݝ}w^{_/ mZHK^U] 5ހNQLcၨۣ3>){t [Xv}g>&fb i7PKMkKbv xl/styles.xmlV[k0~߯z[k;kK)[ ^ʠUe[')!ٯߑd'i2D:O;֑x Td#*sU0Y#c,WxO ~\.s\SjHfE& Z5TTZ "hJ fq| $^.F5(WiSBaV `+U@_pp}_e?^IV(Lu=bnIQ}\J8T7eN{҈ɂ( gE84!z1{+[jYNQn&?9!MP, j}Œp{Żdn0eQFj* a{PM2 苎 wBfUfU# ~$͓b[?*~̜cYӧr;u\OskPr~%+Ǎ,%iڈovB|+S9>-'*)h?Vk1$A:wݹ@3ܕ'ܼ!&y{CaN $#ɿ#p=Q{{;݃7B\]ٲ6[&0ݱՒ >ćWϪu[).0q2wlSLe0S?|GՊ*F?PKMkK;@Y@[Content_Types].xmlN0E|E-jܲ@5ec ,x%ۦ8,*'&Vf|83B@lf`k'm+4aFaBn1{X[o9zF`PK>MkKK _rels/.relsPK>MkKI+!docProps/core.xmlPK>MkK; |)docProps/app.xmlPK>MkK"xl/workbook.xmlPK>MkK 3l,0xl/_rels/workbook.xml.relsPK>MkKL6VOxl/theme/theme1.xmlPK>MkK8`{ xl/worksheets/sheet1.xmlPK>MkKbv Fxl/styles.xmlPK>MkK;@Y@[Content_Types].xmlPK >xlsx2csv-0.8.3/test/twolettercolumns.csv000066400000000000000000000001231465173235000204460ustar00rootroot000000000000001,2,3,4,5,6,7,8,9,,,,,,,,,,,,,,,,,10,11,12 a,b,c,d,e,f,g,,,,,,,,,,,,,,,,,,,h,I,j xlsx2csv-0.8.3/test/twolettercolumns.xlsx000066400000000000000000000145401465173235000206610ustar00rootroot00000000000000PK5;L= _rels/.relsJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTuKӨcjAPy i4 h vǀm|}D/XH9)j0*}yMOO{wJ11L91r)y"? tGOPKr)X,?PK5;L=xl/workbook.xmlRn0+k=la9(͡4\Y)R vӯ';ÙY.tV1D]%I.:qJ>߼_H V\[|o]dK/,;ߣNCװbtlYa7QxծCGGQWx4$?CDz*_d 7<]lD6×;*bG`|6F'.Gx`PWmLt7$s}0?#w*xk+Iaw&ϋls6Py4sٴԢ(ړŌJŤ egShV ̘DS[V_ ]==CO@ϒx09Χ" |)>S8ݯp@ƚȒ+H6Fg:<O.}2gRQ'PD&?W4a}~5>&nuvy*L %'2ਉLƥy*@")e^PnqLCX0OˆF4)w:҉) Î S`[fYQpT{ӱWn#LU ĝ7@,_ U{wBMD{IO\-spIw |X}:*%f3BrPF5C- |f/ Iv B I$23iT΁HRheLVWI']t5֖?7b{6Hm9ªErCߡkL+Xc*:i8EөS@XK[>'q->;WQtt,`fG.g^Q~|)[,lUV"dTñkk45Y8PKɯp PK5;L=xl/worksheets/sheet3.xmlUMs0+4:uJR`4R`bcMe׳ 98n뽷Z{p^x2ۜz3B?of;tw*{e-j궙LA&YV exK,KU%M &Ih}_)|*+>K=ϊ-!|nqE;ϲ}|&U0e/ѝ_ >ʜp&hyp pԶzPC=+]t7cV!:Md[?Կy>j} tȡ;8 Al֠ bmhZ= s!ל픑[9 oqr#b.&8ǣ&%{j_l(R /gEǀfx&Έ9 k3<9!N7Pm||6yy:y}2ONv[#UA:e&X\?RU# n8moPş'ᶊ 뤼t/J8?LmCo*OP"igݪ5m(.V-+q}T6*A`K'R*CMSob1o */DD+e.8B.Cr7%Z=B@ݍ={%*2}?:"Z$~L$MHɻμ} l~~$jfG? on >c-v[_x.fY%&l{Ϋuj k1PK:PK5;L=xl/worksheets/sheet2.xmlUMs0+4:uJR`4R`bcMe׳ 98n뽷Z{p^x2ۜz3B?of;tw*{e-j궙LA&YV exK,KU%M &Ih}_)|*+>K=ϊ-!|nqE;ϲ}|&U0e/ѝ_ >ʜp&hyp pԶzPC=+]t7cV!:Md[?Կy>j} tȡ;8 Al֠ bmhZ= s!ל픑[9 oqr#b.&8ǣ&%{j_l(R /gEǀfx&Έ9 k3<9!N7Pm||6yy:y}2ONv[#UA:e&X\?RU# n8moPş'ᶊ 뤼t/J8?LmCo*OP"igݪ5m(.V-+q}T6*A`K'R*CMSob1o */DD+e.8B.Cr7%Z=B@ݍ={%*2}?:"Z$~L$MHɻμ} l~~$jfG? on >c-v[_x.fY%&l{Ϋuj k1PK:PK5;L= xl/styles.xml]o0+,߯@DҮ&MUզҤi.jld;m1BCr9_mNx*8zJ3)881" ?-/0҆p)WTSMcNA@zsc/DȒ xJU]yT$&+8 ŲFX.\L`oww^T5g4RPJ#椤`r uFă#M((#(,1T9tP^T%ZT;L':S Fg>KOPH&_,pMq'>e}Yzb,fءk1Ѯӟ}RDʒW32QPz]oHsW̽Ʀ4Nv5 [~ۄԦlã\*v3*YFL$5Թbe!t2te!.6,W)@8Yt<.4c J?TQVMbb4fFC6`f03 fGf|TnF50;Wu٣xl/_rels/workbook.xml.rels (RMK0 0wvt/"Uɴ)&!3~*]XK/oyv5+zl;obG s>,8(%"D҆4j0u2jsMY˴S쭂 )fCy I< y!+EfMyk K5=|t G)s墙UtB),fPK!Okxl/workbook.xmlK0~F,l.ea_gE"z!wl㦰=Io毙Y)W%UƟnCI.ki^!Ӈo!13A J[Ʋɼ ީ""ƚr8=|HhQ/d~B;Rȡ-+DOzy8%w6;1nb)2_ ]9jJRb׵(S"-)hheo e)~Q ߎ#|30f4xWX}лѥ|`N]ieI ;P%4c3%B1% !l/PK!*zxl/sharedStrings.xmlTMk@ av=dE=?`Lf7$LdWS[1eE釶b #m ?`oZ"7Bf>>Ll=B4JXx}^ 9p[w0҆I.oћ7 .I6 ^#KX*b^ՀDqsd׻M"&$F^Jul*Ӕ߻ PG (jOK֖bC`v`ѐ:&0VEv,2e1=ZLbzMY$½eFZ@$d voyP\ 9`zm%Cls4IގB}NX:Nl<.ӌ-mQ7(%_I=/~:8gt~QhESv&P e~U'I8>JL^w_H_\]ŞAPK!;m2KB#xl/worksheets/_rels/sheet1.xml.rels0ECx{օ CS7"Ubۗ{ep6<f,Ժch{-A8 -Iy0Ьjm_/N,}W:=RY}H9EbAwk}m PK!+0xl/theme/theme1.xmlYn7;{O,ْcK6qbJˈ\݊@iKz(H^ܧQMBJZZTl'g%Ǚ|rx0t@<嫥4=F^}e-@RᴇOI=xx]$!r׃Xl}iI0UH"Z |r\*.%Jqb4$h|x|u1Qb%URLkęeAY#H6@HaA=(`i^'1`na^ )Ti]]ۚ7qV*OCX(^+7&2 q^vT-U\|Aʜ͵FQXd?Vk沃7 +fsůjo@1`nҧ>g^J9|lfVZk ~EȰ)RqIWP \@i._[1*Z=^'0rnH[d(h 5(@^zutO㣣,g6Nė~W?}~,_~O{ŗ|Snޡ 9D{<Ǹ8ߌN3 #bxg c~,z4ߊ9kpu-0ŰS'a );fL3wNHJϴ:~ݡz@QSK:$l6M .#j7;Q3ߪȁc|0Ǎ7P'Vtmb#q- azDJߜ[- l %.R(:ɼ9/"$LӸ}O E1n. }JpNh4Kd(*ޏq-~A#$ʸ 19!o)4Zg޳+ųT9F<FeIL#}<%Fm5--%HEu&{(M۳(=Q,-'Ka=U qVp̆IQ,P IY4k,͉܂ȄT[X65̣<Xj.UpE-fXY~tCK}b #Vr*CE~;D]6{¯SӣC #/pm]B8fYs%:d 7u<|`m^οSbϖXp,0ZP1b\lax Iw 9+Ô53X da|"Y.dT\Y䀰U(T7lӀ?{^AH79y?c/R)~a+y>SM59ZXs+^y nDHEȈIcvp+wBWl4AZzBdm2iQaɻ oKU+O-v/XV) sp* ѻ,G$*4ej)M{mOK\z%~.$W2 -x^n?l.?m.?o6mTA+Z6L0]K!ߏXBZVhA* Ԉ n绚V~0$􆡕Laٺ%qZ yE~v$*v-|cJ"N 2TloJxΔ1cI32Wp[mDt2g7ثɥH9c Cjk]B"k6`w`XVG>>]4"evjyK77_^ tlɸa;fj{GBNUsZ%7g1ޯӜ-Ez.!b_7^#{]G&hY<<Mz&i:U X~9\kUlmrv(xCsҞ;:A/t8L_dž ʙj[۟$aS+ZWPK!,g5=xl/worksheets/sheet1.xmln0EÏ$$I^({I%%i;wHU븀#5{3WLچA!AD t\2#%Ʋ` G0)!=H55%Й֪$ e& :RVWQXM8eBѐe)8,%ߵ^DC,oj̠kZ;uePb#a^'m[l{VOcreAg7 4iD*&|x /?A PK!1KA'xl/printerSettings/printerSettings1.binb` 00!a G #?C`b &ڃ0ЭPK!abFdocProps/app.xml (n0y{L9i N -jNv:YD) /1^6m"=I#xrجwNrӾ4n]շ,K\wP-$v)O>E"HYT18OF ɎF!q}U W^5 +< C68Z|iuǗnW@R| ^)}f_7cQ]4T,0'cY)@ׂ mLLR8kAY2hlg,t8kU4!aumC6$r{.=N؇3|Ӿ`"ueBY-T7ȧcap5wMx}ےp;݄R/c=.e" &mg2[C-ri;-PK-!A7n[Content_Types].xmlPK-!U0#L _rels/.relsPK-!>xl/_rels/workbook.xml.relsPK-!Okxl/workbook.xmlPK-!*z xl/sharedStrings.xmlPK-!;m2KB# xl/worksheets/_rels/sheet1.xml.relsPK-!+0 xl/theme/theme1.xmlPK-!NNyW xl/styles.xmlPK-!,g5=xl/worksheets/sheet1.xmlPK-!h`@QdocProps/core.xmlPK-!1KA'xl/printerSettings/printerSettings1.binPK-!abFdocProps/app.xmlPK &xlsx2csv-0.8.3/test/variousdelim.csv000066400000000000000000000000621465173235000175210ustar00rootroot00000000000000! 1 - Sheet1 1 2 3 a b c ! 2 - Sheet2 4 5 6 d e f xlsx2csv-0.8.3/test/variousdelim.xlsx000066400000000000000000000232201465173235000177250ustar00rootroot00000000000000PK!!F:s[Content_Types].xml (Tn0W?DVCUU]-L-,PK!U0#L _rels/.rels (MO0 HݐBKwAH!T~I$ݿ'TG~KAsc+EY5iQw~ om4]~ ɉ -i^Yy\YD>qW$KS3b2k T>:3[/%s* }+4?rV PK!ji  xl/workbook.xmlMk0BFesY M۳"c}IߑB.=I3=;l.֐3(_SX%1IWKT >m&-&wq>4DviȘ:A]%~[$ݯ^]WPӃsAu.xu4IUnb;ШҘ@/ 3i 4; R`fK NN;3*7GE`[l"$Ҋ ^s]ѰΪwH߆wH$`[gP€Yv%m]8Q)[cv R%i^sijkdc90w&hzП ~D(Lݨ0N;m_4kojmɟt .Q8Gf=?pX< ~IлKZ9fVBlaopqSFdLeRcLOhvM7ܝS 0N\8ƀ)Hτ%`9H=U˄bAGw swPK!;m2KB#xl/worksheets/_rels/sheet1.xml.rels0ECx{օ CS7"Ubۗ{ep6<f,Ժch{-A8 -Iy0Ьjm_/N,}W:=RY}H9EbAwk}m PK!h xl/worksheets/sheet2.xmln08? )Hm@QJ",,>}WT Fofgq|֔g^J9|lfVZk ~EȰ)RqIWP \@i._[1*Z=^'0rnH[d(h 5(@^zutO㣣,g6Nė~W?}~,_~O{ŗ|Snޡ 9D{<Ǹ8ߌN3 #bxg c~,z4ߊ9kpu-0ŰS'a );fL3wNHJϴ:~ݡz@QSK:$l6M .#j7;Q3ߪȁc|0Ǎ7P'Vtmb#q- azDJߜ[- l %.R(:ɼ9/"$LӸ}O E1n. }JpNh4Kd(*ޏq-~A#$ʸ 19!o)4Zg޳+ųT9F<FeIL#}<%Fm5--%HEu&{(M۳(=Q,-'Ka=U qVp̆IQ,P IY4k,͉܂ȄT[X65̣<Xj.UpE-fXY~tCK}b #Vr*CE~;D]6{¯SӣC #/pm]B8fYs%:d 7u<|`m^οSbϖXp,0ZP1b\lax Iw 9+Ô53X da|"Y.dT\Y䀰U(T7lӀ?{^AH79y?c/R)~a+y>SM59ZXs+^y nDHEȈIcvp+wBWl4AZzBdm2iQaɻ o ##!05GNFZD3~wW #Vw:> PΌ6E/~jbc:'Fo{^ RW:mgߥjEp gk۽E tƙVuZ~E=_O}Z_@7m ͩzZCP:U$u-,sGFLuH3߃e_RjP8({%FrE(ctwLVf6J{l􍶁uPpG#ٛkζ#)j91N31'.3&5<;K^IT(qz_PK!6xl/sharedStrings.xmlJ1 ;zXDaA؛j)LӱɈVijs{*&nCk|uvyyx#829Y5`R]%NTB'cm%h튲4 I&"-3>K &֕c_VEvr񵙱S?[A}+[a i+PK! ?QdocProps/core.xml (|QK0C{d1CہʞVBr4$n޴jCK9'䫃p^5@4#(#̮@o:]n$:G&k,'d<@,؋=h0Q6Nn-_|xFk\qLHD'#~H &xL3Wze*m|)- Wm۬1b~?6ϯSSe] @e.xh\%.>l⎷ 1WjRq$`Cܳ>|֨v.*BX>]O%һ,SB+`sfdB<ܗPK!1KA'xl/printerSettings/printerSettings2.binb` 00!a G #?C`b &ڃ0ЭPK!1KA'xl/printerSettings/printerSettings1.binb` 00!a G #?C`b &ڃ0ЭPK!x4docProps/app.xml (n0}{L N -jNv:YD) /1^6m"=I"'Cnwӑf-d+| ql?_|`YBJe KXG QKÒkhTȩ|lRwWp]"s#ʋ0!q^w|v{, +WO^|j ۀ2|ZVV,+eנI-h1K'm*ASVEV76!atp݉/ip0{9}f[Hv[ҷj"gM )H[ A<{7Ab܏tJ!?^{`ѐ5x2\^?|ڧ>PyXxXWS@GF!Ps)3Sfm`$zTU),l26Y&9 B!Q+ bUavUI}l~o0 d{ 2(C\Iݤm!?-Uq?Ϳnm'I}īxx;Q Vc iR)x U]l9mjºǪ`xCk¦%ۖϺuܜ/t4K حe5PK!}T  _rels/.rels (MN0H} PnRwLibv!=ECU=͛f0={E tJFkZ$H6zLQl,(M?peKc<\ٻ`0chGaC|Uw<ԀjɶJ@ت` %TKhC& Ig/P|^{-Ƀ!x4$<z?GO)8.t;9,WjfgQ#)Sx|'KY}PK!xl/_rels/workbook.xml.rels (Mk00u?Zƽ^:YM$~l뺰d_m>Rm$MQJ9 z$g7lH1Ir{rt}4·OB۩dPbwڦ,LޢvWZOcOB'`L*^f, lq~}DCȇ3 1@o{{̷Yo)4I=rǘMa҅aҿ_*PK!)[xl/workbook.xmlSMo0 t_| Y` 0 ֵgEc!0$v(9Ra_H:"༴YF a+ipaCT\Y}O޺#A ڄn̶`0S[yo7A+ȲLsiȰuaZ `H@Fy-<o\c߃DqT2@UWk?wR:[SVN"xlC‰4ߙ16.QR@8G C2GXO&%&gHvw[Up^Oś |џIE'34:%8\ a4I2[e-sxI79 ͇2G{L=\Yo0V*A@:;'e)~sJ#2aM?cPK!ɽi xl/worksheets/sheet4.xmlV]o:}xR@VVJ fj鯿c!9}AKaJfaX*g|9 c,Wf5GLE A,(2yE1 US H >2NGry d1=,YNoT*mG)'o*Vg6N'5Pgɓ4m6ZǴN˵2'$O[@鷽T8hNSCuK7jk,SmW^CA8" ;/ȶJg%ZguۓٻB;bV_R)hInV_)Wo%Vy !kp43n >r>?b_c[%=A>qew<u٨#X?:u|s`st߉ᩂujsNf#!yuTt1Vτq8lQm0^\?up WGq~K^ Noc x18;M9/o)bpkbqx18ŋxMpa:^Sj/M08ŋK bpzK08ŋ oy.uEp]ˇZ6yHZ%亂A2+i]CwgT! iοK;{&Mi \\@%wV՞bU/+(^..>pSAMj RD,0> Y%WgWl쭱8`gbQ7DGS?`^FC7껽+qHnUѥC;8{/ݸ~~H^PK!Eegxl/worksheets/sheet2.xmlXQ6~x!@6٠ԓtn{쀓X15&ޯl˺} 0>apwaJp4=Z`.͝5T)EES6寿,B>7{JU{$|O9iFlDM-))t/h<7t-[N+e@$-7{V7g4q"& +zѠ=![Y%]Z7R4b0&$O='vdSBA[%mi&%#p95-}rQ sx7sD6kQ~cڃ nI[Wlt;atۏ)P+,% ïHNz쀧 zbS6J3wd t4 xpB;v091C@W(\Hq`owZ Z԰a9^4vQЧl۲/Ճ 8Co ĭ^jh/*X k_ܱJl<^B><(QkPИ=#p OTW'ag ɠսmB*I=ؿ]_p*>݂H^/2WW9Gj:lr8niu8\m]p*I^9z^5*> p GT|8F:(~:}(~épt+⫱z]?6~Zmkq|;ڄjav]:8 RAGTJhLԎ:t pr0i=tR5uTbVJ*3a'q2&d! @BOA;6oO#@G+rjw3V@sqJe\RGux`ݯ}>PK!m)xl/sharedStrings.xmlJ1;lW$]-xw&;YooA=&g j3Oe 5W C4|A[i8;QD,Eӓ4x7[Z䰼c-c>IJّs{Rhϯ9Ϝ.{.uC.uI!˚Iqiy8;27 d}P$Jl ;ZC?phe?YI$OwQhrΛr`HJ :Wu$=;gOJROg:#L*)ӱ؛Ԁ2voTߍ2F XМdJqX-ܯO;= ke.Aawm#K"tMpm~eDJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK!3zxl/worksheets/sheet5.xmlUmo0>i!I%*6Uƹ~l';;4j}Oyξz-EԀ\$>@1s_'W$ #`ы6϶p2(ҹ*cJt BIn*')AKiR]fZ:ߖl}NR\W'L )\pH;&#Q&əVD?VJX$܀9×lod< E&H %iՌ V(瘼?@IΒG/v#ב`$$Gك?2~>9 OO%*ǝ]ZR 3-xJr(h-Oth=::mEJS, ZGqlMd`QSRSLxD뇞g=?yWP6 :pYzu;^eƎ(6vzQpm-B}UB僺4-T8VwN"ql{W6P`x%dq K휖aY~?.v puUo(kqDɜJg(w$*qRqS gË <.o ppۧÚAxq6/NmP\^m X3K 1hWsPK!Ѝbxl/worksheets/sheet1.xmlXQ6~D=;umM0`ma!&NBL>س TH<0u7_~{H!%iQ~앋TP<+dQ$=0" .dc2JqTV! ݲ>PZYAK g5uʆg)Hƅ1q>EG z,= <#]/O>kU]~xyµ5pmEOڊ uڊ zõ'ޘq^.kU~3.`//@cƕ``DdyX3.'Zb)Q%$N=*)'N=Z=Z8%JLJ4fk+1A+1+јQ~%3ԯDce`Z%z=p#e˸s}2N=+֛za]0N=+fE~%.7qzv.7zva]#7.99oq.7C{v.>Hߩú`8ǡpX Æ]}}P mnyN15dGc Jj8;>awA@}p[| ixf߁s J`')d:'^$ u\ =Rk{,R_g+!!"{$G)EDO5'+AϪSkol :k [k>NPK !='jdddocProps/thumbnail.jpegJFIFHH@ICC_PROFILE0appl mntrRGB XYZ   acspAPPLappl-appl dscmdescogXYZlwtptrXYZbXYZrTRCcprt8chad,gTRCbTRCmluc enUS&~esES&daDK.deDE,fiFI(frFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR@zhTWlzhCNruRU"plPL,Yleinen RGB-profiiliGenerisk RGB-profilProfil Gnrique RVBN, RGB 000000u( RGB r_icϏPerfil RGB GenricoAllgemeines RGB-Profilfn RGB cϏeNGenerel RGB-beskrivelseAlgemeen RGB-profiel| RGB \ |Profilo RGB GenericoGeneric RGB Profile1I89 ?@>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&ltExifMM*>F(iNHHCC }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?xgភgãN< kOjrxhJ7[Xjz)e,.pC,\b%)4Wm+Smٽ] k:/c??Lil.d>jw~|G |D XnjgJJe*|RA6|qruJRө=7i?yԝ>ʺ/¿F~-𽮿mw esw9;Mִ"dF]̞d$N8Qjr-E7.=JUjRjܡ%tuLg«h.$^4bF iʀ$(6@8S G  C/4?@:xcûo2bJ|oCJ񷇤_|Eп|Aq}a5|o|c]|5'8-$;u /\P#Lq@ky+BI.iN37+v9Om0ø蜽3^Wd{O(_&h+:/4?@~hkO?|+Z5__ i>"HGſ5+m;P^]Z5iVpKՄ \fiըrʬMKt{'sRTE8AͫFROGo=:nCMτo  };KO ^ rMdiG4TZt–U%j>G}_S_}i${/(_&h+4P ?LWx?_ot !qoZ >A.n4D[\5\E:$;Ҍ]LM[-֊mvm6sՔ|,SiNuTTjI_OP ?LW`t(_&h+2&߇t#^Ѽzb1ͭ %$EeG;/ |bE7 Yxh3X7SpI}TIVճعb\_ 3BZۚiI6mtg QO_Z4Ya[; PTWn0$kK/+hS Uyy4V-)+u{5(׫ SV,hN2徼x^Ӿ?iw_ƭ"X|WQk@eSAၣ>acsoɯ5׍ o>%|*k? x PYG1}(WG&Eҿ7ß\ZKaqoc6S|3ҥ\ME5te}UUMZ8E] 1(+ߙֽk[}h.U}|L/) ?EJ"^P(Q"ր?9&{2\QMt /[?G^/tZ%CixSH.-tg4ϥJ79Y6/kBݷv{ҦAB-w9M2v?Fy/+3@{g]+?y@׉k5_X] _|+5{+Fo-!u+l.!T#2 e(R}b|QR:4Ĩc"'UU]lUP*F;Qt" |L/(忊4Oǿ]Ows'WxP<-O'ֺo{뚕AⲶ:ƭ{^!Mۖm=noZٜiԩV_kS浽y{ AY=6?YsZuΗy-Kki_Lkuj>iz-phz#?_DA7ǚ敫xڦMeiڏ+ ;+K;f[{k xYIӺm5i٧z5tO[WxI]ׁ|$]&Oz'topnY٬lO:aMhÔ79Jr&bJ:_G&Eҿ#G&Eҿ~+3ԵϨh,~mWR\BP0B/IOE'ԔcR ֨{(M[r:SmޓٹA'=Qt" A=3.D%:?=!ԫݕՁ \!  h-S{?R9m4A)oWI-ԑFRԧ9R4[c+d:G&Eҿ#G&Eҿ<?xǶz.j-FpXn3%ծRѮZu_A:Э*WNTR+qwI[zje^kѫFMՄm̔WM_3WǺ'<-i|K 4m4[$U eYⷼ⻆9D°bNIM8qpڿF6vmvlUUM%: 5sVR}R}ϖhߪI]y }Zo;_/n/4&.a%WŦo饄ntUogmJ*N)E_{wm%UsPp|k7I>f]4_ZxW jZn_ĺԚjj^&MIe/$2hA!Gc:I64mEBr}tiwgRUSi99вM-iI}l;o|?9_|eqT_Ù4%ol,toG \\On} B.? HuuWCЋ¿]w~"3/_]}@ߴi|V|GW~/uI&maom_xk8O?Nq}6u[1[kkp<5@|4K/k:{Oįڮ? ;Z0-ˋ)muKd,W̷ Q/^Gekk񏀼EjsdW y`2 Q&BȤv"3/_]}@$: +?!Eg__P~@ŭxcVҼy s^$I3^5a⏇:?ikzHз:vj}ھ{;=ᕗoxNBψV~'_ټi<#qf K=> CjWRI;z$: +?!Eg__P B.? HuuWCЋ¿G]uFzɎ&|2^Ú2ɭ)D-+Y\] B.? HuuWCЋ¿]w~"3/_]}@{g\֧egvg K 5-|̰$@6dz:qiMJOgS bhFN2$k]^ʚ'nRw_"o~(.oEoZtM")axǺvDѼ)miiV3\M]v:X_eNuRn2#9Eu-Rmʫxi:"/-ܥ{%m~!yS?j.;JM.;[a5{ CMo|[/>/x82hgj~1i?_?lo ֺ c1JW/aߊ⋏iwpG_XI _Ksxk[σ |CK­iu:G-U>^d-_oFOz:RX@օFH4熼E/>(x↓[P3G`/|-|jsj$/io <=yZyux92tܠq絒w+謷8/EKjoJmKKEEoh-u\Ĭ'4FRYÅ(X0I*( (N/>]~H?hcOX|Q~#I_d9FALxvk:íNJk$r|OoE_ǟ~[o m+ڧB5:5]3T#~%wqŚkW/ i:5>ou6%AX>kZw}/Ó[+_^8hz 7hSxR׿{_Kͯja@> (w#vtP@Pa]sQZ;:( (;1*bP? g>چp ե1-qqR1dLqu#vI^ ;,-9Rrni]Gv9i~~}6~Ż S2ug7[?k0a84[!_[`Ե{㵔AXG~˙JQQJi_שIUꨵ4ܥ$ܡg[]﫺>lt}ZY"&e] | Iۑ5<]IQqi+;A^{>$QWjTϥ?^s! Eoo{7t½[?^t_fnW/k37@?_:&gq~7F2Ym]_/ M~$i:}Oz1}mc}Q^C+ˢHֵ(|OOKOk}ğG~ k =oG|]Oߵ߅?e:xQt_Gb\i cc?蚴O<<uI_.$ 7ux=O'е}S>ͣ˭iu\F8eUZj+>YN+r^:kϕ:; 2v\ڦ֗}1nq/G&6?lDh6gPNaIJOE+;7R>UKq!I9V}Wk?3?˥p W˥ W˥ W˥ό>'Z'Co? G~>>O~Z- ߆4ZĦA=^\~4O<%~Fվ t= H)[k6f0я{u+KM]ԼoDgѴIW*ҵ+[99onm.{ I?˥ W˥ W9-2'>+U']3iwUO|1&/ u7JuPtU7JuPtU7JuPtUrZ퇌G$ҶhDn<;f_ށx0|p@:˥ W˥ W˥ W<⽏gǼWš\CI,Bmio-pkm'v0@<_Z?<-a]^?hI{Q0imā|ŊWQ\ l&xEwJiYU6RIIU;7u}>]F[>.g #^ Gk._ aW[_]:DŽ}bþ=qagɬi<0iAȣUjqQÞZ䜚wJVUf{{IK9N \h-ۏIIwn^>3U𦥧/:M4]jEK4MVP;Xƨf*IIT$mERk6WεRi<1t?S_eƅo&xHz}ݭVd8KsڏKde%!Juxki]xki]xki]xki]xki]xki]y}os47>šMtΗ*l&3E$>b6$P&/~&Sno)R9#E=b #I)FjI4jW0*d*I6i>Y׾-Ϣt7O|tqC/Ʃh n<.~Yiƕ֚&t &g BjL2u#J(ܝESԼ];(p¥(WuxJKRS\.*ԕމtgo? |KSDM=֥&, Z46nť#>|)Sj)64tKV+glqT%%NRi%-[zt?),~>!|g:|Cx:/ hok?lI$ԯ59mmx13ϋ&'+ᇊx/oRkkv>Ҿ* ?5}o7ڈ~~ kv6j4y g "x/~*-F/kXG_-֍0ԑowyyܐo ?@,/e?QJ?ax?)z"P O?.?h??~(@$ =RioW1Swm?Z<=~VMN xP$5đ|{i:#ZƝú'_~;G߀?~hx>o7~-u/sͮIiMw/φ~Ҽ͆]oŞ25ٽOxΦr[5+{8J[vA=G( ?@,/e?QJ?ax?)z"P%x‰\6) $OKFaOwqh ?@,/e?QJ?ax?)z"P OX^ȔSDK]߅%&M];}OYybN%86du_3@o,/e?QJ?ax?)z"P OX^ȔSD2%yZ៏,udš0G[%{ &TR̀ 2O$h+c]Gg$Aҗ3- Q 2H98@(['o_ -G [DO|E?wZI+!=+i[k|D] MRupj<'*qJiJZԪͶo܎g/:+U][N0Ř4=VI0:^ƅ`Y9tJaRs3\gQoBg_k:> Axg?;O|!u|A55K+/:Qu |u+oi~I>xxE-o گo6 ]D10X^ڋwm`53⇋g^(ݡ?1k Pf[BKׇdM$+hf̲ cjb~T`zʀ APwk"?JlO~ο5{Z쟴UNj/< ]*_jzNqqsf$64v:vK :2-lR#H(2#XFNX,,)Δ)wm<')Mŧ&P!ۿQItG~6a|[M3og5KDž>)V?Sx7Uak?o7_v^jaI,=ZHʬO)(^5y/snKq|yQ#R-m+臌e;÷%IVKM GMR \^ %,`h] #ayTeKM{4.ҋM=S;a%ع8Ҟ/8ʣu$ꏉ~)~ޚ _: ,xZc,7 xa Ǟ񵟅"kiqkO_Z[-;7ZIuxQMgO|%/|m`[&{7|I ^9=S~:ռpZLG''~$c_j:2<1omcgX=LJ5_"wlf-k0{KyZJo$4®ѿcCP FOA@*??t<}ro}"OU- H'ĆspMpOp/:[ I]'vCğ:>悀U7 x ?Wh1Iáh(]'vCğ:>悀9Moᾑ|]n-]yfENpm\im]I%B^ E#Wh1Iáh(]'vCğ:>悀U7 x ?Wh1Iáh(]'ý'No\Ii}f8o"xPⲙ.ou.b!2#)"%tW0 )aĺ^mKQGJWM]>U\qu=}NGR0RQte{5Ͽ<{a? O|8ЖM4guKcղO$g#[N7f6\XV- S?%?y@.< u^PoC,COv)(xL'wſw~ x{/"G<o;]t/iQGs6qԤi/_ҿuOW);.'|Z~ &IZdVO/uom Hܯx?ψ^//zm쯮b"<LO{WE %Y\.bEz/.< u^P|@K#<#]cixԼ,.c;6"AV\Hefvbo.< u^P|@K#<#]cy?)AOXrZ9nc1U_LfVYLAUR?)AOXG xG/(> S?%?y@.< u^P|X៏ -5rN,fް&,qːHF>1 e_4=v^'i\jRO,by'HtFfIJVZ:SwwFJ.WY/eJS/3-fۛvX\:9g <qZ~#MG;F 5zl7;iܵ= &rQRK/^VW׍8ҩ?dynMuǏ>,x]𦥦\֋mxhVkZ"jSy oM;yaCZeF -E4ʽߒ;]ګJM/aY&׼}]ogÿa߆q&k|[ [Z)Wׁ>|><猥אKzw䲟ŏ]˨^M?w? YG"|TO _ƿG뚷5+Ʊ~)~|Vuc <#.iVPπ O?>||o_ iZx_JlcR;F-!F%cU@J5_Q6|&㟇/O-K |$}w#"Efֵ,G4h6Ն f䙬udu|/>|MRyK߄<5o;M2Ze姂.neΟnK-@ u> k?V2_.O .u8t_ 1>quq}h}<<3z%(j#xQЏ^P FB??y@MM|cG|H.PЫ^l"?ݭ!mdFV]v:J5_Q_l wºm -{k-SP,QŢ\=wosC4ʬz咧S-+j[sx拫O]8Ij;~0o O|xs ~5υ5 ƳI{oZw0kj6get?~?/ cOQsGx ǟP x^7v$|9((Ѧt3àjv=_e/ூ>/E[G <]yA@ub}^%ޫq^sq](I. M+NC&x?M#"?: GE4u4 h+|fxgOiڦ]| ~-duR-'ONRftE u';;wq_??|;ҿg -W.=[*x_>xVx6i5}7  4|?ϊn"MBeMsO=9/elKx 7Mqr%ҿ: GE4u4 h2i ׃d?2/GK^-ASiH7qU[8%oo86^?K Yg[L96K7Fh ڂ ʢCTcwF*8j`)TsSrҴge~}߱gO,|X54x>&]l<+)MZN{PwNumJX,a?XV5IS{ J4nU6[%}^`FUTVvn\Χd^-5[X,bxgF* i6xӄBN-ƌbm=G}<JEYֶ֜kߩ)o KTrN-O x OP [Ÿ:?%*u?9@)o KTrR)A/S773j*YQ"j0Ƕ_-),1?%*u?9@)o KTrR)A/S?KxS^/§S–_N(Ӿf_x͵4 K/5ktByJ@O)o KTrR)A/S?KxS^/§S–_N(-O x OP-|!PQQգĚȫ\Bc$JS [Ÿ:?%*u?9@)o KTrR)A/S?KxS^/§S|OM'׍;kIqabsnCe+Rhxroxy"]G xkz.('?5<׆Gx^ˊu_ Ixy:v]QxsS.eS1Z-Y V$Tud5=C}ǟ\POk_#?q@1ӵ->¿|kjRiVktE-=d,euERjAƌU(|і"ڣQrU]H9sSpVO-(襤o{~CӭWwqEɥK>W4[i[V{|vs[.-;ͱȤ0ؿ_PȠbu@" E||Q_u?3l_(ؿ_PȠbu@" EqR&1G#Lbu@" E|6/Wl_($G: ;-E|6/Wl_(ؿ_PȠ7ģW2g {|:tx,llJŚomkop,qƪ /agJXl<,=')J9JM]vV> q^QZ$IJy#Wyg>GLx?_W?uOH|N}Bω4-nY[\Dבnh&)cn" &8\QqhRMA٦tu׀eXM5*i&ri{|}Cֿ6<>?`Km|}Cֿ6X>>R_@,)uMw& ; ]kh(|w{xV2TpW0Wt#c/#,Đ `Km|}Cֿ6X>>R_@,)uMw& ; ]kh%ߍYgOxgcI_,%e^obd؈|}Cֿ6X>>R_@,)uMw& ; ]kh_.ɴI xRKn?uw6k3-1* `Km|}Cֿ6X>>R_@,)uMw& ; ]kh {;'_ծ-!)'RUYXhPK! ZLsdocProps/core.xml (_o ߗ;4@ӑ&4Y2'{#pf`Sh]}psof{UE`]Yфe79zY)Z֐84+2a-<ڀ%(cha;]:*no`K9n舔G/[)0T@{iB׃UbA f:޽weovn)~_.QR7L &,p_mU8ex6˰u p:um@F!":)o)$ie &ß&rIGL #SF' Pd?PK!Fn}docProps/app.xml (n0 )@VQzذI&ӱPYDHm$qɟþYw%rӾ2nW헛O,CRR;(=ȏ: `,! KQ7*%%UҸ㾮'[pċ<'pT7dFeGkZy!X)7G_Sy >Eۀ~2|VVX"~.gPDe|Jk+XS!8%T4Qdm@o N{!Kĭ! ^H ^Lw|)߉tu47Ű4s|;$}5 _?).bӨUQ?sZɪQnձohob}k PK-!ţ;[Content_Types].xmlPK-!}T  _rels/.relsPK-!xl/_rels/workbook.xml.relsPK-!)[xl/workbook.xmlPK-!ɽi  xl/worksheets/sheet4.xmlPK-!Eegxl/worksheets/sheet2.xmlPK-!\#Jo Rxl/worksheets/sheet3.xmlPK-!m)xl/sharedStrings.xmlPK-!) =" xl/styles.xmlPK-!{֩xl/theme/theme1.xmlPK-!3z>"xl/worksheets/sheet5.xmlPK-!Ѝbx%xl/worksheets/sheet1.xmlPK- !='jdd;*docProps/thumbnail.jpegPK-! ZLsPdocProps/core.xmlPK-!Fn}ӑdocProps/app.xmlPKxlsx2csv-0.8.3/xlsx2csv.py000077500000000000000000001470031465173235000155020ustar00rootroot00000000000000#!/usr/bin/env python # # The MIT License # # Copyright (c) 2022 Dilshod Temirkhodjaev # # 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. __author__ = "Dilshod Temirkhodjaev " __license__ = "MIT" __version__ = "0.8.3" import csv, datetime, zipfile, sys, os, re, signal, io import xml.parsers.expat from decimal import Decimal from xml.dom import minidom try: # python2.4 from cStringIO import StringIO except: pass try: from argparse import ArgumentParser except: # python2.4 from optparse import OptionParser # see also ruby-roo lib at: http://github.com/hmcgowan/roo FORMATS = { 'general': 'float', '0': 'float', '0.00': 'float', '#,##0': 'float', '#,##0.00': 'float', '0%': 'percentage', '0.00%': 'percentage', '0.00e+00': 'float', 'mm-dd-yy': 'date', 'd-mmm-yy': 'date', 'd-mmm': 'date', 'mmm-yy': 'date', 'h:mm am/pm': 'date', 'h:mm:ss am/pm': 'date', 'h:mm': 'time', 'h:mm:ss': 'time', 'm/d/yy h:mm': 'date', '#,##0 ;(#,##0)': 'float', '#,##0 ;[red](#,##0)': 'float', '#,##0.00;(#,##0.00)': 'float', '#,##0.00;[red](#,##0.00)': 'float', 'mm:ss': 'time', '[h]:mm:ss': 'time', 'mmss.0': 'time', '##0.0e+0': 'float', '@': 'float', 'yyyy\\-mm\\-dd': 'date', 'dd/mm/yy': 'date', 'hh:mm:ss': 'time', "dd/mm/yy\\ hh:mm": 'date', 'dd/mm/yyyy hh:mm:ss': 'date', 'yy-mm-dd': 'date', 'd-mmm-yyyy': 'date', 'm/d/yy': 'date', 'm/d/yyyy': 'date', 'dd-mmm-yyyy': 'date', 'dd/mm/yyyy': 'date', 'mm/dd/yy h:mm am/pm': 'date', 'mm/dd/yy hh:mm': 'date', 'mm/dd/yyyy h:mm am/pm': 'date', 'mm/dd/yyyy hh:mm:ss': 'date', 'yyyy-mm-dd hh:mm:ss': 'date', '#,##0;(#,##0)': 'float', '_(* #,##0_);_(* (#,##0);_(* "-"??_);_(@_)': 'float', '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)': 'float' } STANDARD_FORMATS = { 0: 'general', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00', 9: '0%', 10: '0.00%', 11: '0.00e+00', 12: '# ?/?', 13: '# ??/??', 14: 'mm-dd-yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy', 18: 'h:mm am/pm', 19: 'h:mm:ss am/pm', 20: 'h:mm', 21: 'h:mm:ss', 22: 'm/d/yy h:mm', 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[red](#,##0)', 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[red](#,##0.00)', 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0e+0', 49: '@', } CONTENT_TYPES = { 'shared_strings', 'styles', 'workbook', 'worksheet', 'relationships', } DEFAULT_APP_PATH = "/xl" DEFAULT_WORKBOOK_PATH = DEFAULT_APP_PATH + "/workbook.xml" class XlsxException(Exception): pass class InvalidXlsxFileException(XlsxException): pass class SheetNotFoundException(XlsxException): pass class OutFileAlreadyExistsException(XlsxException): pass class XlsxValueError(XlsxException): pass class Xlsx2csv: """ Usage: Xlsx2csv("test.xslx", **params).convert("test.csv", sheetid=1) Input: xlsxfile - path to file or filehandle options: sheetid - sheet no to convert (0 for all sheets) sheetname - sheet name to convert dateformat - override date/time format timeformat - override time format floatformat - override float format quoting - if and how to quote delimiter - csv columns delimiter symbol sheetdelimiter - sheets delimiter used when processing all sheets skip_empty_lines - skip empty lines skip_trailing_columns - skip trailing columns hyperlinks - include hyperlinks include_sheet_pattern - only include sheets named matching given pattern exclude_sheet_pattern - exclude sheets named matching given pattern exclude_hidden_sheets - exclude hidden sheets skip_hidden_rows - skip hidden rows """ def __init__(self, xlsxfile, **options): options.setdefault("delimiter", ",") options.setdefault("quoting", csv.QUOTE_MINIMAL) options.setdefault("sheetdelimiter", "--------") options.setdefault("dateformat", None) options.setdefault("timeformat", None) options.setdefault("floatformat", None) options.setdefault("scifloat", False) options.setdefault("skip_empty_lines", False) options.setdefault("skip_trailing_columns", False) options.setdefault("escape_strings", False) options.setdefault("no_line_breaks", False) options.setdefault("hyperlinks", False) options.setdefault("include_sheet_pattern", ["^.*$"]) options.setdefault("exclude_sheet_pattern", []) options.setdefault("exclude_hidden_sheets", False) options.setdefault("merge_cells", False) options.setdefault("ignore_formats", ['']) options.setdefault("lineterminator", "\n") options.setdefault("outputencoding", "utf-8") options.setdefault("skip_hidden_rows", True) self.options = options self.py3 = sys.version_info[0] == 3 self.ziphandle = None xlsxinputfile = None if xlsxfile == "-" and self.py3: xlsxfile = "STDIN" if sys.stdin.buffer.seekable(): xlsxinputfile = sys.stdin.buffer else: xlsxinputfile = io.BytesIO(sys.stdin.buffer.read()) elif xlsxfile == "-" and not self.py3: raise ValueError("The - notation for STDIN is not supported for python2") else: xlsxinputfile = xlsxfile try: self.ziphandle = zipfile.ZipFile(xlsxinputfile) except (zipfile.BadZipfile, IOError): raise InvalidXlsxFileException("Invalid xlsx file: " + str(xlsxfile)) self.content_types = self._parse(ContentTypes, "/[Content_Types].xml") self.shared_strings = self._parse(SharedStrings, self.content_types.types["shared_strings"]) self.styles = self._parse(Styles, self.content_types.types["styles"]) self.workbook = self._parse(Workbook, self.content_types.types["workbook"]) workbook_relationships = list(filter(lambda r: "book" in r, self.content_types.types["relationships"])) if len(workbook_relationships) > 0: self.workbook.relationships = self._parse(Relationships, workbook_relationships[0]) else: self.workbook.relationships = Relationships() if self.options['escape_strings']: self.shared_strings.escape_strings() def __del__(self): if self.ziphandle: # make sure to close zip file self.ziphandle.close() def getSheetIdByName(self, name): for s in self.workbook.sheets: if s['name'] == name: return s['index'] return None def convert(self, outfile, sheetid=1, sheetname=None): """outfile - path to file or filehandle""" if sheetname: sheetid = self.getSheetIdByName(sheetname) if not sheetid: raise XlsxException("Sheet '%s' not found" % sheetname) if sheetid > 0: self._convert(sheetid, outfile) else: if isinstance(outfile, str): if not os.path.exists(outfile): os.makedirs(outfile) elif os.path.isfile(outfile): raise OutFileAlreadyExistsException("File " + str(outfile) + " already exists!") for s in self.workbook.sheets: sheetname = s['name'] sheetstate = s['state'] # filter hidden sheets if sheetstate in ('hidden', 'veryHidden') and self.options['exclude_hidden_sheets']: continue # filter sheets by include pattern include_sheet_pattern = self.options['include_sheet_pattern'] if type(include_sheet_pattern) == type(""): # optparser lib fix include_sheet_pattern = [include_sheet_pattern] if len(include_sheet_pattern) > 0: include = False for pattern in include_sheet_pattern: include = pattern and len(pattern) > 0 and re.match(pattern, sheetname) if include: break if not include: continue # filter sheets by exclude pattern exclude_sheet_pattern = self.options['exclude_sheet_pattern'] if type(exclude_sheet_pattern) == type(""): # optparser lib fix exclude_sheet_pattern = [exclude_sheet_pattern] exclude = False for pattern in exclude_sheet_pattern: exclude = pattern and len(pattern) > 0 and re.match(pattern, sheetname) if exclude: break if exclude: continue if not self.py3: sheetname = sheetname.encode('utf-8') of = outfile if isinstance(outfile, str): of = os.path.join(outfile, sheetname + '.csv') elif self.options['sheetdelimiter'] and len(self.options['sheetdelimiter']): of.write(self.options['sheetdelimiter'] + " " + str(s['index']) + " - " + sheetname + self.options['lineterminator']) self._convert(s['index'], of) def _convert(self, sheet_index, outfile): closefile = False if isinstance(outfile, str): if sys.version_info[0] == 2: outfile = open(outfile, 'wb+') elif sys.version_info[0] == 3: outfile = open(outfile, 'w+', encoding=self.options['outputencoding'], newline="") else: raise XlsxException("error: version of your python is not supported: " + str(sys.version_info) + "\n") closefile = True try: writer = csv.writer(outfile, quoting=self.options['quoting'], delimiter=self.options['delimiter'], lineterminator=self.options['lineterminator']) sheets_filtered = list(filter(lambda s: s['index'] == sheet_index, self.workbook.sheets)) if len(sheets_filtered) == 0: raise XlsxValueError("Sheet with index %i not found or can't be handled" % sheet_index) sheet_path = None # using sheet relation information if 'relation_id' in sheets_filtered[0] and sheets_filtered[0]['relation_id'] is not None: relation_id = sheets_filtered[0]['relation_id'] if relation_id in self.workbook.relationships.relationships and \ 'target' in self.workbook.relationships.relationships[relation_id]: relationship = self.workbook.relationships.relationships[relation_id] sheet_path = relationship['target'] if not (sheet_path.startswith("/xl/") or sheet_path.startswith("xl/")): sheet_path = "/xl/" + sheet_path sheet_file = None if sheet_path is None: sheet_path = "/xl/worksheets/sheet%i.xml" % sheet_index sheet_file = self._filehandle(sheet_path) if sheet_file is None: sheet_path = None if sheet_path is None: sheet_path = "/xl/worksheets/worksheet%i.xml" % sheet_index sheet_file = self._filehandle(sheet_path) if sheet_file is None: sheet_path = None if sheet_path is None and sheet_index == 1: sheet_path = self.content_types.types["worksheet"] sheet_file = self._filehandle(sheet_path) if sheet_file is None: sheet_path = None if sheet_file is None and sheet_path is not None: sheet_file = self._filehandle(sheet_path) if sheet_file is None: raise SheetNotFoundException("Sheet %i not found" % sheet_index) sheet = Sheet(self.workbook, self.shared_strings, self.styles, sheet_file) try: relationships_path = os.path.join(os.path.dirname(sheet_path), "_rels", os.path.basename(sheet_path) + ".rels") sheet.relationships = self._parse(Relationships, relationships_path) sheet.set_dateformat(self.options['dateformat']) sheet.set_timeformat(self.options['timeformat']) sheet.set_floatformat(self.options['floatformat']) sheet.set_skip_empty_lines(self.options['skip_empty_lines']) sheet.set_skip_trailing_columns(self.options['skip_trailing_columns']) sheet.set_include_hyperlinks(self.options['hyperlinks']) sheet.set_merge_cells(self.options['merge_cells']) sheet.set_scifloat(self.options['scifloat']) sheet.set_ignore_formats(self.options['ignore_formats']) sheet.set_skip_hidden_rows(self.options['skip_hidden_rows']) sheet.set_no_line_breaks(self.options['no_line_breaks']) if self.options['escape_strings'] and sheet.filedata: sheet.filedata = re.sub(r"([^<>]+) ([^<>]+)", r"\1\\n\2", re.sub(r"([^<>]+) ([^<>]+)", r"\1\\t\2", re.sub(r"([^<>]+) ([^<>]+)", r"\1\\r\2", sheet.filedata.decode()))) sheet.to_csv(writer) finally: sheet_file.close() sheet.close() finally: if closefile: outfile.close() def _filehandle(self, filename): for name in filter(lambda f: filename and f.lower() == filename.lower()[1:], self.ziphandle.namelist()): # python2.4 fix if not hasattr(self.ziphandle, "open"): return StringIO(self.ziphandle.read(name)) return self.ziphandle.open(name, "r") return None def _parse(self, klass, filename): instance = klass() filehandle = self._filehandle(filename) if filehandle: instance.parse(filehandle) filehandle.close() return instance class Workbook: def __init__(self): self.sheets = list() self.date1904 = False def parse(self, filehandle): workbookDoc = minidom.parseString(filehandle.read()) if workbookDoc.firstChild.namespaceURI: fileVersion = workbookDoc.firstChild.getElementsByTagNameNS(workbookDoc.firstChild.namespaceURI, "fileVersion") else: fileVersion = workbookDoc.firstChild.getElementsByTagName("fileVersion") if len(fileVersion) == 0: self.appName = DEFAULT_APP_PATH else: try: if workbookDoc.firstChild.namespaceURI: self.appName = \ workbookDoc.firstChild.getElementsByTagNameNS( workbookDoc.firstChild.namespaceURI, "fileVersion")[0]._attrs['appName'].value else: self.appName = workbookDoc.firstChild.getElementsByTagName("fileVersion")[0]._attrs['appName'].value except KeyError: # no app name self.appName = DEFAULT_APP_PATH try: if workbookDoc.firstChild.namespaceURI: self.date1904 = \ workbookDoc.firstChild.getElementsByTagNameNS( workbookDoc.firstChild.namespaceURI, "workbookPr")[0]._attrs['date1904'].value.lower().strip() \ != "false" else: self.date1904 = \ workbookDoc.firstChild.getElementsByTagName("workbookPr")[0] \ ._attrs['date1904'].value.lower().strip() \ != "false" except: pass if workbookDoc.firstChild.namespaceURI: sheets = workbookDoc.firstChild.getElementsByTagNameNS(workbookDoc.firstChild.namespaceURI, "sheets")[0] else: sheets = workbookDoc.firstChild.getElementsByTagName("sheets")[0] if workbookDoc.firstChild.namespaceURI: sheetNodes = sheets.getElementsByTagNameNS(workbookDoc.firstChild.namespaceURI, "sheet") else: sheetNodes = sheets.getElementsByTagName("sheet") for i, sheetNode in enumerate(sheetNodes): attrs = sheetNode._attrs name = attrs["name"].value state = None if 'state' in attrs: state = attrs["state"].value relation_id = None if 'r:id' in attrs: relation_id = attrs['r:id'].value self.sheets.append( { 'name': name, 'relation_id': relation_id, 'index': i + 1, 'id': i + 1, # remove id starting 0.8.0 version 'state': state } ) class ContentTypes: def __init__(self): self.types = {} for type in CONTENT_TYPES: self.types[type] = None def parse(self, filehandle): types = minidom.parseString(filehandle.read()).firstChild if not types: return if types.namespaceURI: overrideNodes = types.getElementsByTagNameNS(types.namespaceURI, "Override") else: overrideNodes = types.getElementsByTagName("Override") for override in overrideNodes: attrs = override._attrs type = attrs.get('ContentType').value name = attrs.get('PartName').value if type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": self.types["workbook"] = name elif type == "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": self.types["styles"] = name elif type == "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": # BUG preserved only last sheet self.types["worksheet"] = name elif type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml": self.types["shared_strings"] = name elif type == "application/vnd.openxmlformats-package.relationships+xml": if self.types["relationships"] is None: self.types["relationships"] = list() self.types["relationships"].append(name) if self.types["workbook"] is None: self.types["workbook"] = DEFAULT_WORKBOOK_PATH if self.types["relationships"] is None: self.types["relationships"] = [os.path.dirname(self.types["workbook"]) + "/_rels/" + \ os.path.basename(self.types["workbook"]) + ".rels"] class Relationships: def __init__(self): self.relationships = {} def parse(self, filehandle): doc = minidom.parseString(filehandle.read()) if doc.namespaceURI: relationships = doc.getElementsByTagNameNS(doc.namespaceURI, "Relationships") else: relationships = doc.getElementsByTagName("Relationships") if not relationships: return if doc.namespaceURI: relationshipNodes = relationships[0].getElementsByTagNameNS(doc.namespaceURI, "Relationship") else: relationshipNodes = relationships[0].getElementsByTagName("Relationship") for rel in relationshipNodes: attrs = rel._attrs rId = attrs.get('Id') if rId: vtype = attrs.get('Type') target = attrs.get('Target') self.relationships[str(rId.value)] = { "type": vtype and str(vtype.value) or None, "target": target and str(target.value) or None } class Styles: def __init__(self): self.numFmts = {} self.cellXfs = [] def parse(self, filehandle): styles = minidom.parseString(filehandle.read()).firstChild # numFmts if styles.namespaceURI: numFmtsElement = styles.getElementsByTagNameNS(styles.namespaceURI, "numFmts") else: numFmtsElement = styles.getElementsByTagName("numFmts") if len(numFmtsElement) == 1: for numFmt in numFmtsElement[0].childNodes: if numFmt.nodeType == minidom.Node.ELEMENT_NODE: numFmtId = int(numFmt._attrs['numFmtId'].value) formatCode = numFmt._attrs['formatCode'].value.lower().replace('\\', '') self.numFmts[numFmtId] = formatCode if styles.namespaceURI: cellXfsElement = styles.getElementsByTagNameNS(styles.namespaceURI, "cellXfs") else: cellXfsElement = styles.getElementsByTagName("cellXfs") if len(cellXfsElement) == 1: for cellXfs in cellXfsElement[0].childNodes: if cellXfs.nodeType != minidom.Node.ELEMENT_NODE or not ( cellXfs.nodeName == "xf" or cellXfs.nodeName.endswith(":xf")): continue if cellXfs._attrs and 'numFmtId' in cellXfs._attrs: numFmtId = int(cellXfs._attrs['numFmtId'].value) if self.chk_exists(numFmtId) == None: numFmtId = int(cellXfs._attrs['applyNumberFormat'].value) self.cellXfs.append(numFmtId) else: self.cellXfs.append(None) # When Unknown Numformat ID assign applyNumberFormat def chk_exists(self, numFmtId): xfs_numfmt = numFmtId format_str = None if xfs_numfmt in self.numFmts: format_str = self.numFmts[xfs_numfmt] elif xfs_numfmt in STANDARD_FORMATS: format_str = STANDARD_FORMATS[xfs_numfmt] return format_str class SharedStrings: def __init__(self): self.parser = None self.strings = [] self.si = False self.t = False self.rPh = False self.value = "" def parse(self, filehandle): self.parser = xml.parsers.expat.ParserCreate() self.parser.CharacterDataHandler = self.handleCharData self.parser.StartElementHandler = self.handleStartElement self.parser.EndElementHandler = self.handleEndElement self.parser.ParseFile(filehandle) def escape_strings(self): for i in range(0, len(self.strings)): self.strings[i] = self.strings[i].replace("\r", "\\r").replace("\n", "\\n").replace("\t", "\\t") def replace_line_breaks(self): for i in range(0, len(self.strings)): self.strings[i] = self.strings[i].replace("\r", " ").replace("\n", " ").replace("\t", " ") def handleCharData(self, data): if self.t: self.value += data def handleStartElement(self, name, attrs): # ignore namespace i = name.find(":") if i >= 0: name = name[i + 1:] if name == 'si': self.si = True self.value = "" elif name == 't' and self.rPh: self.t = False elif name == 't' and self.si: self.t = True elif name == 'rPh': self.rPh = True def handleEndElement(self, name): # ignore namespace i = name.find(":") if i >= 0: name = name[i + 1:] if name == 'si': self.si = False self.strings.append(self.value) elif name == 't': self.t = False elif name == 'rPh': self.rPh = False class Sheet: def __init__(self, workbook, sharedString, styles, filehandle): self.py3 = sys.version_info[0] == 3 self.parser = None self.writer = None self.sharedString = None self.styles = None self.relationships = None self.columns_count = -1 self.in_sheet = False self.in_row = False self.in_cell = False self.in_cell_value = False self.columns = {} self.lastRowNum = 0 self.rowNum = None self.colType = None self.cellId = None self.s_attr = None self.data = None self.max_columns = -1 self.dateformat = None self.timeformat = "%H:%M" # default time format self.floatformat = None self.skip_empty_lines = False self.skip_trailing_columns = False self.filedata = None self.filehandle = filehandle self.workbook = workbook self.sharedStrings = sharedString.strings self.styles = styles self.hyperlinks = {} self.mergeCells = {} self.ignore_formats = [] self.skip_hidden_rows = False self.no_line_breaks = False self.colIndex = 0 self.colNum = "" def close(self): # Make sure Worksheet is closed, parsers lib does not have a close() function, so simply delete it self.parser = None def set_dateformat(self, dateformat): self.dateformat = dateformat def set_timeformat(self, timeformat): if timeformat: self.timeformat = timeformat def set_floatformat(self, floatformat): self.floatformat = floatformat def set_skip_empty_lines(self, skip): self.skip_empty_lines = skip def set_skip_trailing_columns(self, skip): self.skip_trailing_columns = skip def set_ignore_formats(self, ignore_formats): self.ignore_formats = ignore_formats def set_skip_hidden_rows(self, skip_hidden_rows): self.skip_hidden_rows = skip_hidden_rows def set_no_line_breaks(self, no_line_breaks): self.no_line_breaks = no_line_breaks def set_merge_cells(self, mergecells): if not mergecells: return if not self.filedata: self.filedata = self.filehandle.read() data = str(self.filedata) # python3: convert byte buffer to string # find worksheet tag, we need namespaces from it start = data.find("", start) worksheet = data[start: end + 1] # find hyperlinks part start = data.find("") data = data[start: end + 13] # parse hyperlinks doc = minidom.parseString(worksheet + data + "").firstChild if doc.namespaceURI: mergeCells = doc.getElementsByTagNameNS(doc.namespaceURI, "mergeCell") else: mergeCells = doc.getElementsByTagName("mergeCell") for mergeCell in mergeCells: attrs = mergeCell._attrs if 'ref' in attrs.keys(): rangeStr = attrs['ref'].value rng = rangeStr.split(":") if len(rng) > 1: for cell in self._range(rangeStr): self.mergeCells[cell] = {} self.mergeCells[cell]['copyFrom'] = rng[0] def set_scifloat(self, scifloat): self.scifloat = scifloat def set_include_hyperlinks(self, hyperlinks): if not hyperlinks or not self.relationships or not self.relationships.relationships: return # we must read file first to get hyperlinks, but we don't wont to parse whole file if not self.filedata: self.filedata = self.filehandle.read() data = str(self.filedata) # python3: convert byte buffer to string # find worksheet tag, we need namespaces from it start = data.find("", start) worksheet = data[start: end + 1] # find hyperlinks part start = data.find("") if start < 0: # hyperlinks not found return end = data.find("") data = data[start: end + 13] # parse hyperlinks doc = minidom.parseString(worksheet + data + "").firstChild if doc.namespaceURI: hiperlinkNodes = doc.getElementsByTagNameNS(doc.namespaceURI, "hyperlink") else: hiperlinkNodes = doc.getElementsByTagName("hyperlink") for hlink in hiperlinkNodes: attrs = hlink._attrs ref = rId = None for k in attrs.keys(): if k == "ref": ref = str(attrs[k].value) if k.endswith(":id"): rId = str(attrs[k].value) if not ref or not rId: continue rel = self.relationships.relationships.get(rId) if not rel: continue target = rel.get('target') for cell in self._range(ref): self.hyperlinks[cell] = target def to_csv(self, writer): self.writer = writer self.parser = xml.parsers.expat.ParserCreate() self.parser.buffer_text = True self.parser.CharacterDataHandler = self.handleCharData self.parser.StartElementHandler = self.handleStartElement self.parser.EndElementHandler = self.handleEndElement if self.filedata: self.parser.Parse(self.filedata) else: self.parser.ParseFile(self.filehandle) def handleCharData(self, data): if self.in_cell_value: format_type = None format_str = "general" self.data += data if self.colType == "s": # shared string format_type = "string" self.data = self.sharedStrings[int(data)] elif self.colType == "b": # boolean format_type = "boolean" self.data = (int(data) == 1 and "TRUE") or (int(data) == 0 and "FALSE") or data elif self.colType == "str" or self.colType == "inlineStr": format_type = "string" elif self.s_attr: s = int(self.s_attr) # get cell format xfs_numfmt = None if s < len(self.styles.cellXfs): xfs_numfmt = self.styles.cellXfs[s] if xfs_numfmt in self.styles.numFmts: format_str = self.styles.numFmts[xfs_numfmt] elif xfs_numfmt in STANDARD_FORMATS: format_str = STANDARD_FORMATS[xfs_numfmt] # get format type if not format_str: raise XlsxValueError("unknown format %s at %d" % (format_str, xfs_numfmt)) if format_str in FORMATS: format_type = FORMATS[format_str] elif re.match(r"^\d+(\.\d+)?$", self.data) and re.match(".*[hsmdyY]", format_str) and not re.match( r".*\[.*[dmhys].*\]", format_str): # it must be date format if float(self.data) < 1: format_type = "time" else: format_type = "date" elif re.match(r"^-?\d+(.\d+)?$", self.data) or ( self.scifloat and re.match(r"^-?\d+(.\d+)?([eE]-?\d+)?$", self.data)): format_type = "float" if format_type == 'date' and self.dateformat == 'float': format_type = "float" elif self.colType == "n": format_type = "float" if format_type and not format_type in self.ignore_formats and self.data != "#N/A": try: if format_type == 'date': # date/time if self.workbook.date1904: date = datetime.datetime(1904, 1, 1) + datetime.timedelta(float(self.data)) else: date = datetime.datetime(1899, 12, 30) + datetime.timedelta(float(self.data)) if self.dateformat: # str(dateformat) - python2.5 bug, see: http://bugs.python.org/issue2782 self.data = date.strftime(str(self.dateformat)) else: # ignore ";@", don't know what does it mean right now # ignore "[$-409], [$-f409], [$-16001]" and similar format codes dateformat = re.sub(r"\[\$\-[A-z0-9]*\]", "", format_str, 1) \ .replace(";@", "").replace("yyyy", "%Y").replace("yy", "%y") \ .replace("hh:mm", "%H:%M").replace("h", "%I").replace("%H%H", "%H") \ .replace("ss", "%S").replace("dddd", "d").replace("dd", "d").replace("d", "%d") \ .replace("am/pm", "%p").replace("mmmm", "%B").replace("mmm", "%b") \ .replace(":mm", ":%M").replace("m", "%m").replace("%m%m", "%m") self.data = date.strftime(str(dateformat)).strip() elif format_type == 'time': # time t = int(round((float(self.data) % 1) * 24 * 60 * 60, 6)) # it should be in seconds d = datetime.time(int((t // 3600) % 24), int((t // 60) % 60), int(t % 60)) self.data = d.strftime(self.timeformat) elif format_type == 'float': data = float(self.data) if not self.floatformat and data.is_integer(): # repr(float(...)) - workaround to correctly round precision for floats # repr gives same result on python 2 and 3, while str is different on python 2 self.data = "%i" % Decimal(repr(float(self.data))) elif ('E' in self.data or 'e' in self.data): self.data = str(self.floatformat or '%f') % data # if cell is general, be aggressive about stripping any trailing 0s, decimal points, etc. elif format_str == 'general': self.data = ("%f" % data).rstrip('0').rstrip('.') elif format_str[0:3] == '0.0': if self.floatformat: self.data = str(self.floatformat) % data else: L = len(format_str.split(".")[1]) if '%' in format_str: L += 1 self.data = ("%." + str(L) + "f") % data else: # unsupported float formatting self.data = ("%f" % data).rstrip('0').rstrip('.') except (ValueError, OverflowError): # this catch must be removed, it's hiding potential problems raise XlsxValueError("Error: potential invalid date format.") def handleStartElement(self, name, attrs): has_namespace = name.find(":") > 0 if self.in_row and (name == 'c' or (has_namespace and name.endswith(':c'))): self.colType = attrs.get("t") self.s_attr = attrs.get("s") self.cellId = attrs.get("r") if self.cellId: self.colNum = self.cellId[:len(self.cellId) - len(self.rowNum)] self.colIndex = 0 else: self.colIndex += 1 self.data = "" self.in_cell = True elif self.in_cell and ((name == 'v' or name == 't') or (has_namespace and name.endswith(':v'))): self.in_cell_value = True elif self.in_sheet and (name == 'row' or (has_namespace and name.endswith(':row'))) and ('r' in attrs) and not (self.skip_hidden_rows and 'hidden' in attrs and attrs['hidden'] == '1'): self.rowNum = attrs['r'] self.in_row = True self.colIndex = 0 self.colNum = "" self.columns = {} self.spans = None if 'spans' in attrs: self.spans = [int(i) for i in attrs['spans'].split(" ")[-1].split(":")] elif name == 'sheetData' or (has_namespace and name.endswith(':sheetData')): self.in_sheet = True elif name == 'dimension': rng = attrs.get("ref").split(":") if len(rng) > 1: start = re.match(r"^([A-Z]+)(\d+)$", rng[0]) if (start): end = re.match(r"^([A-Z]+)(\d+)$", rng[1]) startCol = start.group(1) endCol = end.group(1) self.columns_count = 0 for cell in self._range(startCol + "1:" + endCol + "1"): self.columns_count += 1 def handleEndElement(self, name): has_namespace = name.find(":") > 0 if self.in_cell and ((name == 'v' or name == 't') or (has_namespace and name.endswith(':v'))): self.in_cell_value = False elif self.in_cell and (name == 'c' or (has_namespace and name.endswith(':c'))): t = 0 for i in self.colNum: t = t * 26 + ord(i) - 64 d = self.data if self.hyperlinks: hyperlink = self.hyperlinks.get(self.cellId) if hyperlink: d = "" + d + "" if self.colNum + self.rowNum in self.mergeCells.keys(): if 'copyFrom' in self.mergeCells[self.colNum + self.rowNum].keys() and \ self.mergeCells[self.colNum + self.rowNum]['copyFrom'] == self.colNum + self.rowNum: self.mergeCells[self.colNum + self.rowNum]['value'] = d else: d = self.mergeCells[self.mergeCells[self.colNum + self.rowNum]['copyFrom']]['value'] if self.no_line_breaks: d = d.replace("\r", " ").replace("\n", " ").replace("\t", " ") self.columns[t - 1 + self.colIndex] = d self.in_cell = False if self.in_row and (name == 'row' or (has_namespace and name.endswith(':row'))): if len(self.columns.keys()) > 0: if min(self.columns.keys()) < 0: # Weird d = [] keys = self.columns.keys() keys.sort() for k in keys: val = self.columns[k] if not self.py3: val = val.encode("utf-8") d.append(val) else: d = [""] * (max(self.columns_count, max(self.columns.keys()) + 1)) for k in self.columns.keys(): val = self.columns[k] if not self.py3: val = val.encode("utf-8") d[k] = val if self.spans: l = self.spans[1] if len(d) < l: d += (l - len(d)) * [''] if self.columns_count < 0: self.columns_count = len(d) # write empty lines if not self.skip_empty_lines: for i in range(self.lastRowNum, int(self.rowNum) - 1): self.writer.writerow([]) self.lastRowNum = int(self.rowNum) # write line to csv if not self.skip_empty_lines or d.count('') != len(d): while len(d) < self.columns_count: d.append("") if self.skip_trailing_columns: if self.max_columns < 0: self.max_columns = len(d) while len(d) > 0 and d[-1] == "": d = d[0:-1] self.max_columns = self.max_columns - 1 elif self.max_columns > 0: d = d[0:self.max_columns] self.writer.writerow(d) self.in_row = False elif self.in_sheet and (name == 'sheetData' or (has_namespace and name.endswith(':sheetData'))): self.in_sheet = False # rangeStr: "A3:C12" or "D5" # example: for cell in _range("A1:Z12"): print cell def _range(self, rangeStr): rng = rangeStr.split(":") if len(rng) == 1: yield rangeStr else: start = re.match(r"^([A-Z]+)(\d+)$", rng[0]) end = re.match(r"^([A-Z]+)(\d+)$", rng[1]) if not start or not end: return startCol = start.group(1) startRow = int(start.group(2)) endCol = end.group(1) endRow = int(end.group(2)) col = startCol while True: for row in range(startRow, endRow + 1): yield col + str(row) if col == endCol: break t = 0 for i in col: t = t * 26 + ord(i) - 64 col = "" while t >= 0: col = chr(t % 26 + 65) + col t = t // 26 - 1 def convert_recursive(path, sheetid, outfile, kwargs): for name in os.listdir(path): fullpath = os.path.join(path, name) if os.path.isdir(fullpath): convert_recursive(fullpath, sheetid, outfile, kwargs) else: outfilepath = outfile if isinstance(outfilepath, type(sys.stdout)): outfilepath = fullpath[:-4] + 'csv' elif os.path.isdir(outfilepath): outfilepath = os.path.join(outfilepath, name[:-4] + 'csv') elif len(outfilepath) == 0 and fullpath.lower().endswith(".xlsx"): outfilepath = fullpath[:-4] + 'csv' print("Converting %s to %s" % (fullpath, outfilepath)) try: Xlsx2csv(fullpath, **kwargs).convert(outfilepath, sheetid) except zipfile.BadZipfile: raise InvalidXlsxFileException("File %s is not a zip file" % fullpath) def main(): try: signal.signal(signal.SIGPIPE, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL) except AttributeError: pass if "ArgumentParser" in globals(): parser = ArgumentParser(description="xlsx to csv converter") parser.add_argument('infile', metavar='xlsxfile', help="xlsx file path, use '-' to read from STDIN") parser.add_argument('outfile', metavar='outfile', nargs='?', help="output csv file path") parser.add_argument('-v', '--version', action='version', version=__version__) nargs_plus = "+" argparser = True else: parser = OptionParser(usage="%prog [options] infile [outfile]", version=__version__) parser.add_argument = parser.add_option nargs_plus = 1 argparser = False if sys.version_info[0] == 2 and sys.version_info[1] < 5: inttype = "int" else: inttype = int parser.add_argument("-a", "--all", dest="all", default=False, action="store_true", help="export all sheets") parser.add_argument("-c", "--outputencoding", dest="outputencoding", default="utf-8", action="store", help="encoding of output csv ** Python 3 only ** (default: utf-8)") parser.add_argument("-d", "--delimiter", dest="delimiter", default=",", help="delimiter - columns delimiter in csv, 'tab' or 'x09' for a tab (default: comma ',')") parser.add_argument("--hyperlinks", "--hyperlinks", dest="hyperlinks", action="store_true", default=False, help="include hyperlinks") parser.add_argument("-e", "--escape", dest='escape_strings', default=False, action="store_true", help="Escape \\r\\n\\t characters") parser.add_argument("--no-line-breaks", "--no-line-breaks", dest='no_line_breaks', default=False, action="store_true", help="Replace \\r\\n\\t with space") parser.add_argument("-E", "--exclude_sheet_pattern", nargs=nargs_plus, dest="exclude_sheet_pattern", default="", help="exclude sheets named matching given pattern, only effects when -a option is enabled.") parser.add_argument("-f", "--dateformat", dest="dateformat", help="override date/time format (ex. %%Y/%%m/%%d)") parser.add_argument("-t", "--timeformat", dest="timeformat", help="override time format (ex. %%H/%%M/%%S)") parser.add_argument("--floatformat", dest="floatformat", help="override float format (ex. %%.15f)") parser.add_argument("--sci-float", dest="scifloat", default=False, action="store_true", help="force scientific notation to float") parser.add_argument("-I", "--include_sheet_pattern", nargs=nargs_plus, dest="include_sheet_pattern", default="^.*$", help="only include sheets named matching given pattern, only effects when -a option is enabled.") parser.add_argument("--exclude_hidden_sheets", default=False, action="store_true", help="Exclude hidden sheets from the output, only effects when -a option is enabled.") parser.add_argument("--ignore-formats", nargs=nargs_plus, type=str, dest="ignore_formats", default=[''], help="Ignores format for specific data types.") parser.add_argument("-l", "--lineterminator", dest="lineterminator", default="\n", help="line terminator - lines terminator in csv, '\\n' '\\r\\n' or '\\r' (default: \\n)") parser.add_argument("-m", "--merge-cells", dest="merge_cells", default=False, action="store_true", help="merge cells") parser.add_argument("-n", "--sheetname", dest="sheetname", default=None, help="sheet name to convert") parser.add_argument("-i", "--ignoreempty", dest="skip_empty_lines", default=False, action="store_true", help="skip empty lines") parser.add_argument("--skipemptycolumns", dest="skip_trailing_columns", default=False, action="store_true", help="skip trailing empty columns") parser.add_argument("-p", "--sheetdelimiter", dest="sheetdelimiter", default="--------", help="sheet delimiter used to separate sheets, pass '' if you do not need delimiter, or 'x07' " "or '\\f' for form feed (default: '--------')") parser.add_argument("-q", "--quoting", dest="quoting", default="minimal", help="quoting - fields quoting in csv, 'none' 'minimal' 'nonnumeric' or 'all' (default: minimal)") parser.add_argument("-s", "--sheet", dest="sheetid", default=1, type=inttype, help="sheet number to convert") parser.add_argument("--include-hidden-rows", dest="include_hidden_rows", default=False, action="store_true", help="include hidden rows") if argparser: options = parser.parse_args() else: (options, args) = parser.parse_args() if len(args) < 1: parser.print_usage() sys.exit("error: too few arguments" + os.linesep) options.infile = args[0] options.outfile = len(args) > 1 and args[1] or None if len(options.delimiter) == 1: pass elif options.delimiter == 'tab' or options.delimiter == '\\t': options.delimiter = '\t' elif options.delimiter == 'comma': options.delimiter = ',' elif options.delimiter[0] == 'x': options.delimiter = chr(int(options.delimiter[1:])) elif options.delimiter == 'fs' or options.delimiter == 'FS': options.delimiter = chr(28) else: sys.exit("error: invalid delimiter\n") if options.quoting == 'none': options.quoting = csv.QUOTE_NONE elif options.quoting == 'minimal': options.quoting = csv.QUOTE_MINIMAL elif options.quoting == 'nonnumeric': options.quoting = csv.QUOTE_NONNUMERIC elif options.quoting == 'all': options.quoting = csv.QUOTE_ALL else: sys.exit("error: invalid quoting\n") if options.lineterminator == '\n': pass elif options.lineterminator == '\\n': options.lineterminator = '\n' elif options.lineterminator == '\\r': options.lineterminator = '\r' elif options.lineterminator == '\\r\\n': options.lineterminator = '\r\n' else: sys.exit("error: invalid line terminator\n") if options.sheetdelimiter == '--------': pass elif options.sheetdelimiter == '': pass elif options.sheetdelimiter == '\\f': options.sheetdelimiter = '\f' elif options.sheetdelimiter[0] == 'x': options.sheetdelimiter = chr(int(options.sheetdelimiter[1:])) else: sys.exit("error: invalid sheet delimiter\n") kwargs = { 'delimiter': options.delimiter, 'quoting': options.quoting, 'sheetdelimiter': options.sheetdelimiter, 'dateformat': options.dateformat, 'timeformat': options.timeformat, 'floatformat': options.floatformat, 'scifloat': options.scifloat, 'skip_empty_lines': options.skip_empty_lines, 'skip_trailing_columns': options.skip_trailing_columns, 'escape_strings': options.escape_strings, 'no_line_breaks': options.no_line_breaks, 'hyperlinks': options.hyperlinks, 'include_sheet_pattern': options.include_sheet_pattern, 'exclude_sheet_pattern': options.exclude_sheet_pattern, 'exclude_hidden_sheets': options.exclude_hidden_sheets, 'merge_cells': options.merge_cells, 'outputencoding': options.outputencoding, 'lineterminator': options.lineterminator, 'ignore_formats': options.ignore_formats, 'skip_hidden_rows': not options.include_hidden_rows } sheetid = options.sheetid if options.all: sheetid = 0 outfile = options.outfile or sys.stdout try: if os.path.isdir(options.infile): convert_recursive(options.infile, sheetid, outfile, kwargs) elif not os.path.exists(options.infile) and options.infile != "-": raise InvalidXlsxFileException("Input file not found!") else: xlsx2csv = Xlsx2csv(options.infile, **kwargs) if options.sheetname: sheetid = xlsx2csv.getSheetIdByName(options.sheetname) if not sheetid: sys.exit("Sheet '%s' not found" % options.sheetname) xlsx2csv.convert(outfile, sheetid) except XlsxException: _, e, _ = sys.exc_info() sys.exit(str(e) + "\n") if __name__ == "__main__": main()