
Конечным пользователям системы, которую мы разрабатываем, предоставляется обычный CSV-файл, который конечные пользователи будут открывать в MS Excel. Один из столбцов будет содержать записи, состоящие из строк числовых цифр. Это не числа, а идентификаторы. Мы заметили, что форматирование по умолчанию, примененное к этому столбцу, приводит к тому, что записи интерпретируются как большие числа, которые впоследствии отображаются в научной нотации. Это уже плохой пользовательский опыт — но подождите, это становится катастрофой. При сохранении файла данные, по-видимому, интерпретируются как значение с плавающей запятой одинарной точности, и все цифры после 6-й полностью усекаются. Если пользователь изменит форматирование так, чтобы столбец отображался правильно перед сохранением, Excel не будет демонстрировать такое поведение, и данные не будут повреждены при сохранении.
Я обнаружил, что либо (1) изменение формата столбца, либо (2) отключение вычисления формулы позволяют избежать обеих проблем.
Теперь мой вопрос: возможно ли выполнить одно из вышеперечисленных действий или какое-либо другое действие, которое предотвратит проблемы, указанные выше, по умолчанию при открытии файла типа CSV в MS Excel? Обратите внимание, что, вероятно, будет невероятно сложно убедить клиента согласиться с тем, что конечные пользователи должны отключить выполнение формул для всех файлов, включая файлы в формате Excel. Есть ли какой-то способ задать глобальные настройки? Какой-то способ настроить, как обрабатываются, в частности, CSV? Какой-то способ распространить макрос на пользовательские установки Excel, которые будут работать со всеми открытыми файлами CSV?
решение1
Я обнаружил, что это можно сделать, написав надстройку Excel. При открытии книги я могу сделать следующее:
// set format of everything to text
Wb.ActiveSheet.UsedRange.NumberFormat = "@";
// disable further formatting - may not be necessary
Wb.ActiveSheet.EnableFormatConditionsCalculation = "false";
// for any existing cells, overwrite the formatted data with the real data, e.g., the formula
Wb.ActiveSheet.UsedRange.Value = Wb.ActiveSheet.UsedRange.Formula;
У меня это работает в Excel 2010.