3 метода парсинга Excel 2003 XML формата в Python 3

Разбирать формат Excel 2003-2015 умеют многие библиотеки для Python 3. Здесь описан парсинг XML-формата Excel 2003, который приходится разбирать с помощью XML-библиотек. И бонусом метод, работающий только на Windows с установленным Excel.

XML.SAX: требовательный к структуре

Метод требователен к структуре файла и, если будет пропущен тэг или другая ошибка, то на этом все и остановится. Как преимущество, библиотека сразу доступна в Python.

[code python]
import xml.sax

class ExcelHandler(xml.sax.ContentHandler):
def __init__(self):
self.chars = [ ]
self.cells = [ ]
self.rows = [ ]
self.tables = [ ]

def characters(self, content):
self.chars.append(content)

def startElement(self, name, atts):
if name==»Cell»:
self.chars = [ ]
elif name==»Row»:
self.cells=[ ]
elif name==»Table»:
self.rows = [ ]

def endElement(self, name):
if name==»Cell»:
self.cells.append(».join(self.chars))
elif name==»Row»:
self.rows.append(self.cells)
elif name==»Table»:
self.tables.append(self.rows)

excelHandler = ExcelHandler()
xml.sax.parse(‘excel2003.xml’, excelHandler)

# Parsed sheets
excelHandler.tables
[/code]

Beautiful Soup: позволяет расслабиться

Внешняя библиотека, поддерживаемая сообществом. Позволяет разбирать структурированные файлы, включая HTML-страницы с пропусками тэгов. Python 3+ поддерживается только 4 версией.

Установка на Windows (Anaconda):
[code]pip install bs4[/code]

Установка на Ubuntu:
[code]apt-get install libxml2-dev libxslt1-dev python-dev[/code]
[code]pip install lxml[/code]
[code]pip install bs4[/code]

Код примитивнее предыдущего примера:

[code python]
from bs4 import BeautifulSoup

handler = open(‘excel2003.xml’).read()
soup = BeautifulSoup(handler, ‘lxml’)

tables = []
for table in soup.findAll(‘ss:table’):
rows = []
for row in table.findAll(‘ss:row’):
cells = []
for cell in row.findAll(‘ss:cell’):
cells.append(cell.find(‘ss:data’).get_text())
rows.append(cells)
tables.append(rows)

# Parsed sheets
tables
[/code]

Only Windows: конвертация XLS в CSV

Если мы не можем работать с файлом напрямую, тогда будем работать с CSV. Но для этого нам нужен Windows, Excel и VBScript.

Создаем [code]excel2csv.vbs[/code] со следующим кодом:
[code basic]
if WScript.Arguments.Count < 3 Then
WScript.Echo «Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> »
Wscript.Quit
End If

csv_format = 6

Set objFSO = CreateObject(«Scripting.FileSystemObject»)

src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
worksheet_number = CInt(WScript.Arguments.Item(2))

Dim oExcel
Set oExcel = CreateObject(«Excel.Application»)

Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.Worksheets(worksheet_number).Activate

oBook.SaveAs dest_file, csv_format

oBook.Close False
oExcel.Quit
[/code]

Затем вызываем созданный скрипт из Python-а и используем полученный CSV-файл:
[code python]
from subprocess import call
filename = ‘excel2003.xml’ # Или любой другой формат
csv_filename = filename + ‘.csv’
call([‘cscript.exe’, ‘excel2csv.vbs’, filename, csv_filename, ‘1’])

csv_filename # Открываем любым CSV-парсером.
[/code]