Экспорт из базы данных дает чистый CSV файл, где номер телефона выглядит как 79161234567, а после открытия в Excel двойным кликом та же самая ячейка превращается в 7.92E+10. Если сохранить файл обратно, оригинальное значение потеряно безвозвратно, и никакой Ctrl+Z уже не поможет, потому что файл был перезаписан.
Почему Excel вообще так делает
CSV, в отличие от полноценных форматов вроде XLSX, не хранит информацию о типах данных для каждой ячейки. Простая текстовая строка 79161234567 физически неотличима внутри файла от настоящего числа. Excel при открытии CSV пытается угадать тип каждой колонки на глаз, и длинная последовательность цифр без ведущих нулей и без явных признаков текста автоматически трактуется как число.
Дальше вступает в игру вторая проблема: Excel по умолчанию форматирует достаточно большие числа в экспоненциальной записи, чтобы они помещались в стандартную ширину колонки, отсюда и берется загадочное E+10 вместо привычной строки цифр.
Проблема с ведущими нулями
Похожая история происходит с почтовыми индексами и некоторыми идентификаторами, где важен ведущий ноль.
| Исходное значение в CSV | Как показывает Excel после автоопределения типа |
|---|---|
| 007 | 7 |
| 79161234567 | 7.92E+10 |
| 2024-01-15 | 15.01.2024 или иная локальная дата |
Во всех трех случаях Excel меняет визуальное представление данных, руководствуясь собственными эвристиками угадывания типа, а не тем, что реально записано byte в byte в исходном CSV файле.
Способ первый: явный текстовый префикс в самой ячейке
Один из старых, но рабочих трюков — поставить перед значением символ апострофа внутри самой ячейки CSV.
'79161234567
Excel интерпретирует ведущий апостроф как явное указание “это текст, не трогай мое форматирование”, и отображает значение как есть, без преобразования в число или экспоненциальную запись. Минус подхода в том, что апостроф остается видимым, если открыть тот же файл не в Excel, а в простом текстовом редакторе или другой программе.
Способ второй: импорт через мастер, а не двойной клик
Вместо простого открытия файла двойным кликом, который сразу применяет автоматическое определение типов, можно использовать импорт данных через специальный мастер, где для каждой колонки явно указывается желаемый тип.
В Excel это делается через меню Данные, далее Получить данные, далее Из текстового или CSV файла, где на одном из шагов мастера можно явно выбрать тип “Текст” для конкретной колонки, вместо того чтобы полагаться на автоматическое угадывание.
Способ третий: формат TSV с явным текстовым полем через кавычки
Некоторые системы обходят проблему, оборачивая числовые строки в кавычки и меняя расширение файла, хотя сами кавычки не решают проблему автоматически, Excel все равно может проигнорировать их при угадывании типа колонки для CSV.
Более надежный способ для автоматизированных процессов — генерировать сразу файл в формате XLSX программно, где тип каждой ячейки можно явно указать как текстовый на уровне формата файла, а не полагаться на эвристики Excel при импорте CSV.
Практическая проверка перед отправкой файла заказчику
Если готовите CSV файл для передачи в Excel, полезно заранее прогнать данные через CSV to JSON и визуально свериться со структурой, а затем открыть тот же файл через полноценный мастер импорта, а не двойным кликом, чтобы заранее увидеть, какие колонки Excel собирается трактовать как числа.
Итоговый чеклист
Двойной клик по CSV файлу в Excel всегда применяет автоматическое угадывание типов, это самый частый источник проблемы, а не баг конкретной версии программы.
Ведущий апостроф в ячейке заставляет Excel трактовать значение как текст, но остается видимым артефактом при открытии файла в других программах.
Импорт через мастер данных с явным указанием типа колонки как текст надежнее, чем полагаться на автоматическое определение при простом открытии файла.
Для действительно надежной передачи числовых строк вроде телефонов и индексов рассмотрите формат XLSX вместо CSV там, где это возможно, потому что XLSX хранит тип ячейки явно, а не угадывает его при каждом открытии заново.