@toc
На работе нам часто приходится конвертировать таблицы Excel в формат Markdown для совместного использования в документах, блогах или других платформах, поддерживающих Markdown. Однако некоторые редакторы Markdown неоптимально поддерживают контент, скопированный и вставленный из Excel, что приводит к путанице в форматировании после преобразования. Кроме того, если вам необходимо часто обрабатывать файлы одного и того же типа, преобразование вручную становится затруднительным. Поэтому я решил создать инструмент CLI, который автоматизирует этот процесс преобразования.
Чтобы убедиться, что этот инструмент прост в использовании и портативен, я решил написать этот инструмент CLI на Python. Поскольку я хотел, чтобы мои коллеги могли легко использовать этот инструмент, я решил свести к минимуму зависимости от сторонних библиотек, чтобы упростить развертывание инструмента.
Прежде чем мы начнем писать код, нам нужно понять Excel Структура файла. После небольшого исследования мы обнаружили Excel На самом деле файл представляет собой ZIP Сжатый пакет, содержащий серию XML документ. В частности, мы уделяем особое внимание sharedStrings.xml
и sheet1.xml
Два файла. Первый содержит строки из таблицы, а второй — фактические данные таблицы.
Сначала нам нужно разархивировать Excel документ. Питон Стандартная библиотека предоставляет zipfile
Модуль для удобной распаковки файлов. После декомпрессии мы можем прочитать sharedStrings.xml
файл, сохраняя в нем общие строки в виде массива для последующего использования.
import xml.dom.minidom
import zipfile
import os
import shutil
output_path = 'data' # Разархивировать Excel После имени папки временных документов
file_path = input("Пожалуйста, введите Excel Путь к документу: ")
md_path = file_path.split('.')[0] + ".md" # Выход из Markdown документимя
# Разархивировать Excel документ
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(output_path)
strings = []
# прочитать общую строку
shared_strings_path = os.path.join(output_path, "xl/sharedStrings.xml")
if os.path.exists(shared_strings_path):
with open(shared_strings_path, 'r') as data:
# Воля XML документизменятьпревратиться в DOM структура
dom = xml.dom.minidom.parse(data)
# Найти все приезжать t Этикетка
for string in dom.getElementsByTagName('t'):
# Воля t Этикеткасерединаиз строковое значение плюс приезжать strings в массиве
strings.append(string.childNodes[0].nodeValue)
# Другой код...
Далее разбираем sheet1.xml
Файл, сохраните табличные данные в виде двумерного массива. Обратите внимание, что нам нужно обработать индекс строки, которая может содержаться в ячейке.
результат = []
#читатьлист данные
путь_листа = os.path.join(output_path, "xl/worksheets/sheet1.xml")
if os.path.exists(sheet_path):
with open(sheet_path, 'r') as data:
dom = xml.dom.minidom.parse(data)
# Перебрать каждый row Этикетка
for row in dom.getElementsByTagName('row'):
row_data = []
# Траверс row Этикеткасередина содержит каждый c Этикетка
for cell in row.getElementsByTagName('c'):
value = ''
# Если c Этикеткаиз t Значение атрибута s, описание представляет собой строку и требует приезжать strings Получите его истинную стоимость от
if cell.getAttribute('t') == 's':
shared_string_index = int(cell.getElementsByTagName('v')[0].childNodes[0].nodeValue)
value = strings[shared_string_index]
# В противном случае напрямую прочитайте его значение.
else:
value = cell.getElementsByTagName('v')[0].childNodes[0].nodeValue
# Воля Эта сетка из данных добавляет приезжать row_data середина
row_data.append(value)
# Воля в эту строку из данных добавить приезжать result середина
result.append(row_data)
# Другой код...
Наконец, мы преобразуем данные таблицы в формат Markdown и сохраняем их в файл Markdown.
# строить Markdown лист
# генерироватьпервая линия
markdown_table = "|"
markdown_table += "|".join(result[0]) + "|"
markdown_table += "\n"
# проводить разделенные строки (вторая строка)
markdown_table += "|"
markdown_table += "|".join(["-" for _ in result[0]]) + "|"
markdown_table += "\n"
# генерировать Следовать заиз ХОРОШО
for row in result[1:]:
markdown_table += "|"
markdown_table += "|".join([value for value in row]) + "|"
markdown_table += "\n"
# Удалите лишние разрывы строк
markdown_table = markdown_table[:-1]
# генерировать Markdown документ
with open(md_path, 'w') as md_file:
md_file.write(markdown_table)
# Другой код...
Окончательный из Полный код выглядит следующим образом:
import xml.dom.minidom
import zipfile
import os
import shutil
output_path = 'data' # Разархивировать Excel После имени папки временных документов
file_path = input("Пожалуйста, введите Excel Путь к документу: ")
md_path = file_path.split('.')[0] + ".md" # Выход из Markdown документимя
# Разархивировать Excel документ
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(output_path)
strings = []
# прочитать общую строку
shared_strings_path = os.path.join(output_path, "xl/sharedStrings.xml")
if os.path.exists(shared_strings_path):
with open(shared_strings_path, 'r') as data:
# Воля XML документизменятьпревратиться в DOM структура
dom = xml.dom.minidom.parse(data)
# Найти все приезжать t Этикетка
for string in dom.getElementsByTagName('t'):
# Воля t Этикеткасерединаиз строковое значение плюс приезжать strings в массиве
strings.append(string.childNodes[0].nodeValue)
результат = []
#читатьлист данные
путь_листа = os.path.join(output_path, "xl/worksheets/sheet1.xml")
if os.path.exists(sheet_path):
with open(sheet_path, 'r') as data:
dom = xml.dom.minidom.parse(data)
# Перебрать каждый row Этикетка
for row
in dom.getElementsByTagName('row'):
row_data = []
# Траверс row Этикеткасередина содержит каждый c Этикетка
for cell in row.getElementsByTagName('c'):
value = ''
# Если c Этикеткаиз t Значение атрибута s, описание представляет собой строку и требует приезжать strings Получите его истинную стоимость от
if cell.getAttribute('t') == 's':
shared_string_index = int(cell.getElementsByTagName('v')[0].childNodes[0].nodeValue)
value = strings[shared_string_index]
# В противном случае напрямую прочитайте его значение.
else:
value = cell.getElementsByTagName('v')[0].childNodes[0].nodeValue
# Воля Эта сетка из данных добавляет приезжать row_data середина
row_data.append(value)
# Воля в эту строку из данных добавить приезжать result середина
result.append(row_data)
# Удалить временную папку с документами
shutil.rmtree(output_path)
# строить Markdown лист
# генерироватьпервая линия
markdown_table = "|"
markdown_table += "|".join(result[0]) + "|"
markdown_table += "\n"
# проводить разделенные строки (вторая строка)
markdown_table += "|"
markdown_table += "|".join(["-" for _ in result[0]]) + "|"
markdown_table += "\n"
# генерировать Следовать заиз ХОРОШО
for row in result[1:]:
markdown_table += "|"
markdown_table += "|".join([value for value in row]) + "|"
markdown_table += "\n"
# Удалите лишние разрывы строк
markdown_table = markdown_table[:-1]
# генерировать Markdown документ
with open(md_path, 'w') as md_file:
md_file.write(markdown_table)
Когда вы запустите этот сценарий Python, он предложит вам указать путь к файлу Excel, а затем сгенерирует соответствующий файл Markdown в том же каталоге.
Далее мы можем улучшить этот инструмент CLI и добавить некоторые функции, такие как:
Передайте путь к файлу в качестве аргумента скрипту, а не вводите его вручную во время выполнения.
import sys
if len(sys.argv) < 2:
print("Пожалуйста, укажите Excel путь к документу как параметр")
sys.exit(1)
file_path = sys.argv[1]
Затем вы можете запустить скрипт через командную строку:
python excel_to_markdown.py path/to/your/excel/file.xlsx
Текущий сценарий обрабатывает только первый лист (sheet1.xml). Вы можете расширить сценарий, чтобы пользователи могли выбирать или обрабатывать все листы.
текущий Markdown Метод создания таблицы очень прост. Вы можете рассмотреть возможность использования более продвинутой библиотеки, например tabulate
или pandas
,Для улучшения гибкости и эстетики.
Добавьте больше обработки ошибок, чтобы обеспечить устойчивость к ошибкам и полезные сообщения об ошибках при анализе файлов.
Вы можете использовать что-то вроде PyInstaller
、cx_Freeze
или py2exe
и другие инструменты для упаковки сценариев в исполняемые файлы, чтобы пользователям не приходилось их устанавливать. Python Интерпретатор готов к работе.
в сценариисередина Добавить функцию логирования,Записывать ключевые этапы работы программы,Легко отлаживать и отслеживать проблемы.
Если производительность становится проблемой при обработке больших файлов Excel, рассмотрите возможность оптимизации кода для более эффективной обработки данных.
Выше приведены некоторые точки расширения, которые можно рассмотреть.,Это зависит от ваших потребностей и сценариев. Надеюсь, этот простой инструмент будет вам полезен.,Если у вас есть какие-либо вопросы или дополнительные потребности,Пожалуйста, не стесняйтесь спрашивать.
С помощью этого простого инструмента Python CLI мы можем легко конвертировать файлы Excel в формат Markdown. Этот инструмент снижает зависимость от сторонних библиотек, делая код более легким и читаемым. При необходимости вы можете расширить этот инструмент, добавив дополнительные функции для различных сценариев использования.