2016-09-12 9 views
2

У меня есть раздражающая проблема, работающая с объектами SQL Server DATETIME в Excel 2013. Проблема была высказана несколько раз здесь, в SO, и я знаю, что работа заключается в том, чтобы просто переформатировать DATETIME объекты в Excel, делая это:Проблема с постоянным переформатированием SQL Server Datetime в Excel

  • щелкните правой кнопкой мыши ячейку
  • Выберите формат ячеек
  • Выберите Выборочная
  • в Тип: поле ввода введите yyyy-mm-dd hh:mm:ss.000

Это прекрасно работает, но я не хочу этого делать каждый раз. Существует ли постоянная работа над этим, помимо создания макросов? Мне нужно сохранить гранулярность объекта DATETIME, поэтому я не могу использовать SMALLDATETIME. В настоящее время я использую Microsoft SQL Server Management Studio 2008 r2 на машине win7.

Заранее спасибо.

-Stelio К.

+0

Как вы вносите его в Excel? Потому что это можно сделать и с помощью макроса, сокращая все ваши шаги до щелчка. Также есть ссылка источника данных, которая входит в таблицу, которую вы можете форматировать. –

+0

Обычно это делается для специальных запросов, и я обычно просто копирую и вставляю свои результаты из sql sever в excel. – StelioK

+1

Не похоже, что вы можете изменять поведение палитры по умолчанию Excel без множества других проблем. Раздражает, так оно и есть, я думаю, что это ваш путь наименьшего сопротивления. –

ответ

0

Без кода это трудно догадаться, как получает данные из SQL Server в Excel. Я предполагаю, что это связано не с подключением к данным, потому что у Excel не было бы проблем с отображением данных в виде дат напрямую.

Как насчет соединений с данными?

Excel не поддерживает какого-либо форматирования или любого полезного конструктора в этом отношении при работе с подключениями данных только. Эта функциональность обеспечивается Power Query или дизайном PivotTable. Power Query интегрирован в Excel 2016 и доступен для загрузки в Excel 2010+.

Почему вам нужно отформатировать даты

Excel не сохраняет информацию о типе. Все это строка или номер, и ее отображение управляется форматом ячейки.

Даты хранятся в виде десятичных знаков с использованием формата OLE Automation - неотъемлемой частью является количество дат с 1900-01-01, а дробная часть - это время. Вот почему System.DateTime имеет функции FromOADate и ToOADate.

Чтобы создать лист Excel с датами, вы должны установить формат ячейки одновременно с созданием ячейки.

Как форматировать ячейки

Делая это относительно, если вы используете Open XML SDK или библиотеку как EPPlus. Следующий пример создает таблицу Excel из списка клиентов:

static void Main(string[] args) 
{ 
    var customers = new[] 
    { 
     new Customer("A",DateTime.Now), 
     new Customer("B",DateTime.Today.AddDays(-1)) 
    }; 
    File.Delete("customers.xlsx"); 
    var newFile = new FileInfo(@"customers.xlsx"); 
    using (ExcelPackage pck = new ExcelPackage(newFile)) 
    {     
     var ws = pck.Workbook.Worksheets.Add("Content"); 

     // This format string *is* affected by the user locale! 
     // and so is "mm-dd-yy"! 
     ws.Column(2).Style.Numberformat.Format = "m/d/yy h:mm"; 

     //That's all it needs to load the data 
     ws.Cells.LoadFromCollection(customers,true); 
     pck.Save(); 
    } 
} 

код использует метод LoadFromCollection, чтобы загрузить список клиентов напрямую, без работы с клетками. true означает, что заголовок создается.

Существуют эквивалентные методы для загрузки данных из другого источника: LoadFromDatatable, LoadFromDataReader, LoadFromText для CSV-данных и даже LoadFromArrays для массивов с неровными объектами.

Странная вещь, что определение формата m/d/yy h:mm или mm-dd-yy использует локаль пользователя для форматирования, не американского формата! Это связано с тем, что эти форматы встроены в Excel и рассматриваются как зависящие от языка форматы. В списке форматов даты они отображаются со звездочкой, то есть они зависят от локали пользователя.

Причина этой странности в том, что, когда Excel переместился в формат XLSX на основе XML 10 лет назад, он сохранил причуды старого формата XLS для соображений обратной совместимости.

Когда EPPlus сохраняет файл xlsx, он обнаруживает их и сохраняет ссылку на встроенный идентификатор формата (22 и 14 соответственно) вместо хранения всей строки формата.

Нахождение идентификаторов формата

Список идентификаторов стандартных форматов приведен в NumberingFormat element documentation page стандарта Open XML. Первоначально изначально были определены идентификаторы 0 (общий) до 49.

EPPlus не позволяет напрямую установить идентификатор. Он проверяет строку формата и отображает только форматы 0-49, как показано в методе GetBfromBuildIdFromFormat от ExcelNumberFormat. Чтобы получить ID 22, нам нужно установить свойство Format в "m/d/yy h:mm"

Еще один трюк - проверить таблицы стилей существующего листа. xlsx - это zipped пакет XML-файлов, который можно открыть с помощью любой утилиты для распаковки. Стили хранятся в файле xl\styles.xml.

+0

Я заявил в своем OP, что данные просто копируются и вставляются. – StelioK

+0

@StelioK, вы можете рассмотреть возможность помещать его в свой пост как редактирование вместо комментариев, в частности, что вы скопируете из панели «Результаты» SSMS после запуска запроса. Я думаю, что мое первоначальное предположение верно, но с множеством опций есть некоторая открытая интерпретация того, над чем вы можете работать. –

+0

@StelioK Вы можете использовать мастер «Экспорт данных» для непосредственного создания файлов Excel, если хотите, и избегать угадывания формата. Как бы то ни было, вы просто копируете текст. Excel распознает некоторые форматы, но не будет изменять стили на основе предположения. –