Подробный гайд по проверке кодировки .xlsx
Файл .xlsx — это не простой текстовый файл, а ZIP-архив, содержащий набор XML-документов и других ресурсов. Поэтому «проверка кодировки» для него может означать две принципиально разные задачи: проверку внутренней кодировки самого файла Excel (которая почти всегда UTF-8) или проверку кодировки, которая использовалась при импорте/экспорте данных (например, из CSV).
Что такое .xlsx с точки зрения кодировки
Формат .xlsx основан на стандарте Office Open XML (OOXML). Сам файл — это ZIP-контейнер, внутри которого находятся XML-файлы (например, xl/workbook.xml, xl/sharedStrings.xml), и именно в них хранятся текстовые данные.
Согласно спецификации OOXML, все XML-части в .docx, .pptx и .xlsx должны использовать декларацию:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Это означает, что внутренняя кодировка любого корректного .xlsx файла — UTF-8. Microsoft подтверждает: если переименовать .xlsx в .zip и распаковать, в начале XML-файлов вы увидите указание encoding="UTF-8".
Важно:
Это не значит, что в файле не может быть «испорченных» данных. Если при создании файла исходные тексты были в другой кодировке (например, Windows-1251) и их неправильно преобразовали в UTF-8, внутри XML появятся неверные байты, которые будут отображаться как «кракозябры».
Способ 1: Прямая проверка XML-декларации внутри .xlsx
Самый надёжный способ убедиться, что файл структурно корректен, — заглянуть внутрь архива.
Шаги:
- Скопируйте файл
.xlsxи переименуйте копию в.zip(например,data.xlsx→data.zip). - Распакуйте архив любым архиватором (7-Zip, WinRAR, встроенный в Windows).
- Перейдите в папку
xl/. Найдите файлы:sharedStrings.xml— здесь хранятся все текстовые строки таблицы.workbook.xml— метаданные книги.worksheets/sheet1.xml— данные листов.
- Откройте любой из этих XML-файлов в текстовом редакторе (Блокнот, Notepad++, VS Code).
- Посмотрите на первую строку. В корректном файле вы увидите:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Если там указана другая кодировка (например, windows-1251 или UTF-16), это может быть причиной проблем при чтении некоторыми парсерами.
Этот метод даёт точный ответ о заявленной кодировке, но не гарантирует, что все тексты внутри действительно корректно закодированы в UTF-8.
Способ 2: Проверка кодировки через Python
Если вы работаете с файлами программно, можно использовать Python для анализа.
2.1. Проверка XML-декларации через zipfile и re
import zipfile
import re
def check_xlsx_internal_encoding(file_path):
with zipfile.ZipFile(file_path, 'r') as z:
# Проверяем sharedStrings.xml (основной файл с текстом)
if 'xl/sharedStrings.xml' in z.namelist():
with z.open('xl/sharedStrings.xml') as f:
first_line = f.readline().decode('utf-8', errors='ignore')
match = re.search(r'encoding="([^"]+)"', first_line)
if match:
print(f"Заявленная кодировка: {match.group(1)}")
else:
print("Декларация кодировки не найдена")
else:
print("Файл sharedStrings.xml отсутствует")
check_xlsx_internal_encoding('data.xlsx')
Этот код покажет, какая кодировка указана в XML-декларации.
2.2. Обнаружение кодировки текста с помощью chardet
Если вы подозреваете, что тексты внутри файла были записаны в неверной кодировке, можно попробовать определить её эвристически. Однако имейте в виду: chardet плохо работает с ZIP-контейнерами, поэтому сначала нужно извлечь текст.
import zipfile
import chardet
def detect_text_encoding_in_xlsx(file_path):
with zipfile.ZipFile(file_path, 'r') as z:
with z.open('xl/sharedStrings.xml') as f:
raw = f.read()
# Ищем байты внутри тегов <t>...</t>
# (упрощённый пример, реальный XML требует парсинга)
result = chardet.detect(raw)
print(f"Предполагаемая кодировка: {result['encoding']} (уверенность: {result['confidence']:.2f})")
detect_text_encoding_in_xlsx('data.xlsx')
Для более точного анализа используйте BeautifulSoup с UnicodeDammit, который показывает лучшие результаты для текстов на европейских языках. Но помните: если файл был сохранён Excel корректно, он всегда будет UTF-8, и chardet может ошибиться, особенно на коротких строках.
2.3. Чтение через pandas и openpyxl
Если ваша цель — просто прочитать данные и убедиться, что текст отображается правильно, используйте:
import pandas as pd
# pandas автоматически обрабатывает .xlsx через openpyxl
df = pd.read_excel('data.xlsx')
print(df.head())
openpyxl и pandas корректно работают с UTF-8 внутри .xlsx, поэтому если текст отображается правильно — проблема не во внутренней кодировке файла.
Способ 3: Проверка кодировки при импорте CSV (самый частый случай)
Большинство проблем с «кодировкой .xlsx» на самом деле возникают, когда файл на самом деле является CSV, но был переименован в .xlsx или открыт Excel с неверными настройками.
Как понять, что это CSV, а не настоящий XLSX:
- Откройте файл в Блокноте (Notepad).
- Если вы видите читаемый текст, разделённый запятыми или точками с запятой — это CSV.
- Если вы видите
PKв начале и нечитаемые символы — это настоящий ZIP-архив, то есть.xlsx.
Если это CSV, вот как проверить и указать кодировку:
В Excel (Windows):
- Откройте пустую книгу.
- Перейдите на вкладку «Данные» → «Из текста/CSV».
- Выберите файл.
- В окне предпросмотра нажмите на выпадающий список «Файл Origin» (или «Кодировка файла») и выберите нужную кодировку:
UTF-8,Кириллица (Windows-1251),Кириллица (ISO-8859-5)и т.д. - Смотрите на предпросмотр, пока текст не станет читаемым.
В LibreOffice Calc:
При открытии CSV появится диалог, где можно выбрать «Набор символов» (Character set). Попробуйте UTF-8, Cyrillic (Windows-1251), Cyrillic (ISO-8859-5).
Через Python при чтении CSV:
import pandas as pd
# Попробуйте разные кодировки
for enc in ['utf-8', 'windows-1251', 'cp1251', 'koi8-r']:
try:
df = pd.read_csv('data.csv', encoding=enc)
print(f"Успешно прочитано с кодировкой: {enc}")
print(df.head())
break
except UnicodeDecodeError:
print(f"Не удалось с {enc}")
Способ 4: Проверка в текстовых редакторах
Notepad++ (Windows):
- Откройте файл (если это CSV или XML).
- Меню «Кодировки» (Encoding) → выберите «Набор символов» (Character Set).
- Перебирайте варианты:
UTF-8,Windows-1251,GB2312,Big5и т.д., пока текст не станет читаемым. - Если ни один вариант не помогает — данные были испорчены на этапе экспорта, и восстановить их без исходника невозможно.
Visual Studio Code:
В правом нижнем углу окна отображается текущая кодировка. Нажмите на неё и выберите «Reopen with Encoding», затем перебирайте варианты.
Сводная таблица: что и как проверять
| Ситуация | Что проверять | Инструмент |
|---|---|---|
| Файл открывается с «кракозябрами» | Является ли файл настоящим XLSX или это CSV? | Блокнот (поиск PK в начале) |
| Нужно узнать внутреннюю кодировку XLSX | XML-декларация в xl/sharedStrings.xml |
7-Zip + Блокнот, Python zipfile |
| Нужно прочитать CSV с правильной кодировкой | Выбор кодировки при импорте | Excel «Из текста/CSV», LibreOffice, Python pandas |
| Автоматическое определение кодировки | Эвристика | Python chardet, bs4.UnicodeDammit |
| Текст в XLSX отображается неверно | Возможно, данные были испорчены при создании | Проверка XML-декларации; если UTF-8, но текст битый — исходник утерян |
Важно
Если вы убедились, что внутри .xlsx стоит encoding="UTF-8", но текст всё равно отображается неправильно, это не проблема кодировки файла. Скорее всего, данные были записаны в файл уже в испорченном виде (например, исходный текст в Windows-1251 был принудительно преобразован в UTF-8 без перекодировки). В таком случае восстановить исходные символы невозможно без оригинального источника данных.
Если же вы работаете с CSV и видите «кракозябры», почти всегда достаточно правильно указать кодировку при импорте — это самая распространённая и легко решаемая проблема.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.