Без кода это трудно догадаться, как получает данные из 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
.
Как вы вносите его в Excel? Потому что это можно сделать и с помощью макроса, сокращая все ваши шаги до щелчка. Также есть ссылка источника данных, которая входит в таблицу, которую вы можете форматировать. –
Обычно это делается для специальных запросов, и я обычно просто копирую и вставляю свои результаты из sql sever в excel. – StelioK
Не похоже, что вы можете изменять поведение палитры по умолчанию Excel без множества других проблем. Раздражает, так оно и есть, я думаю, что это ваш путь наименьшего сопротивления. –