Как настроить типы столбцов Excel и форматирование?
Я экспортирую данные из CxDBGrid в файл Excel. Я могу создать файл и скопировать в него данные, но у меня есть реальные проблемы с форматированием столбцов. Поскольку я извлекаю данные из БД, я хотел бы, чтобы электронная таблица отображала тип: NUMBER, VARCHAR2,DATE и так далее. Я визуально создал макрос, пошел искать код VBA и воспроизвел его в проекте Delphi:
sheet.Columns[K+2].NumberFormat := '0,000'; //Number
sheet.Columns[K+2].NumberFormat := '@'; //Text
sheet.Columns[K+2].NumberFormat := 'm/d/yyyy'; //Date
Форматирование чисел работает нормально в большинстве случаев, но два других - нет. Когда я открываю сгенерированный файл, текстовые столбцы отображаются как тип "Пользовательский", а в каждой ячейке отображается "-64". Если я иду, чтобы отредактировать ячейку, правильное значение фактически там. Дата - это еще одна проблема: формат БД - дд / мм / гггг, и если я передаю ее в Excel как есть, она все испортила. Я попытался установить правильный формат, но затем Excel не распознает его.
Есть какие-нибудь подсказки?
Я также устанавливаю ширину столбца. Это работает безупречно.
2 ответа
Проблема заключается в том, что назначенные значения являются строками Unicode. Попробуй это:
sheet.Columns[K+2].NumberFormat := AnsiChar('@');
sheet.Columns[K+2].NumberFormat := AnsiString('m/d/yyyy');
Вы не сказали "как вы делаете вещи вручную", что означает, что люди должны полностью угадать, что вы делаете. Итак, вот мое дикое предположение:
Если я предполагаю, что вы используете компонент Express Spreadsheet от Developer Express, у меня есть обширный опыт работы с этим компонентом. Он не поддерживает произвольные числовые форматы. Он поддерживает формат "деньги" (0,00) с двумя точками после запятой. Он не поддерживает три, один или любое другое количество десятичных знаков. Если это так, это известная проблема в электронной таблице Express.
Если вручную вы подразумеваете, что "лист", как показано выше, является объектом OLE и вы общаетесь через OLE Automation с самим Excel, тогда вам следует форматировать CELLS по отдельности или в виде диапазона, а не объекты столбца. Я не уверен, как форматы объектов столбцов будут когда-либо переопределять значения ячеек, если они вообще делают. Форматирование ячеек, как правило, представляет собой ячейку за ячейкой и должно рассматриваться как таковое.
Если вы действительно хотите, чтобы это работало должным образом, вы не будете использовать Excel с помощью автоматизации OLE, вы получите надлежащую библиотеку для записи в формате Excel XLS. Я был совершенно уверен, что вы можете получить правильные результаты непосредственно из сетки CX (DevEx) db, но я спрашивал на их форумах, а не здесь. С обычной сеткой БД я бы просто использовал
TJvDBGridExcelExport
который входит в JVCL Jedi, и который работает с обычным VCL DB Grid.