Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Уважаемые Форумчане!

Экспортирую таблицу из SQL Server'a через Delphi в Excel 2007. Все экспортируется как положенно, но вот постоянная проблема с датами. Экспортирую я помассивно. Все элементы массива типа Variant. Но есть одна проблема, при экспорте формат ячейки в которую экспортируется дата меняется неизвестно от чего, то она текстовая, то числовая. Но вот отображение её всегда в числовом виде.

Проблему удалось решить преобразуя все даты в строки, все отображается корректно, но опять же не хочу это так оставлять, т.к. возможно пользователю понадобится сделать фильтр по месяцу, или же использовать дату в ячейке для вычислений каких нибудь, а там текст - а это не есть хорошо.

Надеюсь что кто нибудь сталкивался с подобной проблемой и поможет мне разобраться в данной ситуации
7 дек 10, 15:58    [9899946]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Johnmen
Member

Откуда: Москва
Сообщений: 3951
Для "русского" Экселя:
Range.NumberFormat:='ДД.ММ.ГГГГ';
Range.Value:=<переменная типа TDate/TDateTime>;
А вообще, гуги на тему NumberFormat.
8 дек 10, 15:20    [9905677]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Johnmen,

нет, не катит, я как только не пробовал, не проканало
8 дек 10, 17:09    [9906569]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
vgorshkov
Но есть одна проблема, при экспорте формат ячейки в которую экспортируется дата меняется неизвестно от чего, то она текстовая, то числовая. Но вот отображение её всегда в числовом виде.
Слабо верится. Пример можешь выложить?
8 дек 10, 17:48    [9906905]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Xordal
Member

Откуда: Таганрог
Сообщений: 536
данные также передавать как строка, просто формат ячейки в самом excel устанавливать не "общий", а "дата"
8 дек 10, 20:37    [9907608]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
Данные нужно передавать как даты, в том числе принудительно задавать VarType.
Не исключено, что в этом и суть проблемы: после каких-то манипуляций данные становятся типа Double.
8 дек 10, 20:56    [9907664]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Gator
Member

Откуда: Москва
Сообщений: 13809
Соколинский Борис
Данные нужно передавать как даты, в том числе принудительно задавать VarType.
Не исключено, что в этом и суть проблемы: после каких-то манипуляций данные становятся типа Double.
А это в Экселе установлен "стандартный" формат ячеек
8 дек 10, 21:12    [9907721]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
[quot GatorА это в Экселе установлен "стандартный" формат ячеек[/quot]
Нет, я имел в виду что-то типа этого
var X: variant;
X:=now; // VarType(X)=varDate
X:=now+1; //VarType(X)=varDouble
Не исключено, что у автора что-то подобное происходит.
Стандартный формат отображает даты как даты.
8 дек 10, 22:37    [9907918]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Gator
Member

Откуда: Москва
Сообщений: 13809
Соколинский Борис
Gator
А это в Экселе установлен "стандартный" формат ячеек

Нет, я имел в виду что-то типа этого
var X: variant;
X:=now; // VarType(X)=varDate
X:=now+1; //VarType(X)=varDouble
Не исключено, что у автора что-то подобное происходит.
Стандартный формат отображает даты как даты.
IMHO ну их. Даже без Delphi при копировании/импорте в Excel бывало, что среди дат вдруг лезут "DateTime as Double" или "Integer as Date".
Так что у меня рефлекс: хочешь дату - установи формат
9 дек 10, 00:19    [9908154]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
MMM_Corp
Member

Откуда: Тернопіль, Україна
Сообщений: 2097
возможно оно вам и не надо, но напишу:

1. выборку данных с MSSQL сервака в езель можно делать напрямую - Данные, с сервера SQL...
2. можно сам екзель использовать как СУБД (г.. конечно, но можно,), при этом не надо думать над форматами данных ячеек
9 дек 10, 06:36    [9908395]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Соколинский Борис,

    RowCount:=frmMultTrans.ReportBase.RecordCount+7;
    ColCount:=frmMultTrans.ReportHeader.RecordCount+1;
    row_count_all:=row_count_all+frmMultTrans.ReportBase.RecordCount;

    if max_col_count<ColCount then max_col_count:=ColCount;

    frmMultTrans.ReportHeader.First;
    while not frmMultTrans.ReportHeader.Eof do begin
      Workbook.ActiveSheet.Range[chr(frmMultTrans.ReportHeader.RecNo+1+64)+inttostr(pos+3)+':'+chr(frmMultTrans.ReportHeader.RecNo+1+64)+inttostr(pos+rowcount)].Select;
      if frmMultTrans.ReportHeader.FieldByName('align').AsString='L' then
        Excel.Selection.HorizontalAlignment := 1;
      if frmMultTrans.ReportHeader.FieldByName('align').AsString='C' then
        Excel.Selection.HorizontalAlignment := 3;
      if frmMultTrans.ReportHeader.FieldByName('align').AsString='R' then
        Excel.Selection.HorizontalAlignment := 4;

      if frmMultTrans.ReportHeader.FieldByName('type').AsString='S' then
        Excel.Selection.NumberFormat := '@';
      if frmMultTrans.ReportHeader.FieldByName('type').AsString='I' then
        Excel.Selection.NumberFormat := '# ##0';
      if frmMultTrans.ReportHeader.FieldByName('type').AsString='F' then
        Excel.Selection.NumberFormat := '# ##0'+SysUtils.DecimalSeparator+'00';
      if frmMultTrans.ReportHeader.FieldByName('type').AsString='A' then
        Excel.Selection.NumberFormat := '# ##0'+SysUtils.DecimalSeparator+'000';

      frmMultTrans.ReportHeader.Next;
    end;

    sum_kl2:=0;

    ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
    frmMultTrans.ReportHeader.First;
    while not frmMultTrans.ReportHeader.Eof do begin
      ArrayData[6,frmMultTrans.ReportHeader.RecNo+1]:=frmMultTrans.ReportHeader.FieldByName('new_header').AsString;
      frmMultTrans.ReportHeader.Next;
    end;

    frmMultTrans.ReportHeader.First;
    for j:=2 to ColCount do begin
      frmMultTrans.ReportBase.First;
      sum_kl:=0;
      for i:=7 to RowCount-1 do begin

        if frmMultTrans.ReportHeader.FieldByName('type').AsString='I'
          then ArrayData[i, j]:=frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsInteger
        else
        if frmMultTrans.ReportHeader.FieldByName('type').AsString='F'
          then ArrayData[i, j]:=frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsFloat
        else
        if frmMultTrans.ReportHeader.FieldByName('type').AsString='A'
          then ArrayData[i, j]:=frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsFloat
        else
        if frmMultTrans.ReportHeader.FieldByName('type').AsString='D'
          then ArrayData[i, j]:=frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsDateTime
        else
          ArrayData[i, j]:=frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsString;

        if frmMultTrans.ReportHeader.FieldByName('can_sum').AsBoolean
          then sum_kl:=sum_kl+frmMultTrans.ReportBase.FieldByName(frmMultTrans.ReportHeader.FieldByName('header').AsString).AsVariant;
        frmMultTrans.ReportBase.Next;
      end;
      if frmMultTrans.ReportHeader.FieldByName('can_sum').AsBoolean
        then ArrayData[RowCount, j]:=sum_kl;
      if frmMultTrans.ReportHeader.FieldByName('can_sum_avr').AsBoolean then begin
        sum_kl_all:=sum_kl_all+sum_kl;
        sum_kl2:=sum_kl;
      end;
      frmMultTrans.ReportHeader.Next;
    end;
    for i:=7 to RowCount-1 do begin
      ArrayData[i, 1]:=i-6;
    end;

    ArrayData[1,1]:=ColCount;
    ArrayData[2,1]:=RowCount-7;
    ArrayData[3,1]:=sum_kl2;
    if BlanksBase.FieldByName('lang_id').AsInteger=1 then begin
      ArrayData[4,1]:=ansiuppercase(RoubleUnit.RealToRouble(sum_kl2,
        ValyutaBase.FieldByName('valyuta_text_rus').AsString, ValyutaBase.FieldByName('valyuta_end').AsBoolean,
        ValyutaBase.FieldByName('cent_text_rus').AsString, ValyutaBase.FieldByName('cent_end').AsBoolean, ValyutaBase.FieldByName('dop').AsString));
      ArrayData[5,1]:=frmMultTrans.AnyQuery.FieldByName('inv_text').AsString;
      ArrayData[6,1]:='¹';
    end else
    if BlanksBase.FieldByName('lang_id').AsInteger=2 then begin
      ArrayData[4,1]:=ansiuppercase(RoubleUnit.RealToDollars(sum_kl2,
        ValyutaBase.FieldByName('valyuta_text_eng').AsString,
        ValyutaBase.FieldByName('cent_text_eng').AsString))+' ONLY';
      ArrayData[5,1]:=frmMultTrans.AnyQuery.FieldByName('inv_text').AsString;
      ArrayData[6,1]:='#';
    end;

    Cell1 := WorkBook.WorkSheets[1].Cells[pos+1, 1];
    Cell2 := WorkBook.WorkSheets[1].Cells[pos+RowCount, ColCount];
    Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];
    Range.Value := ArrayData;
9 дек 10, 10:09    [9908897]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Gator
Member

Откуда: Москва
Сообщений: 13809
vgorshkov, многа букаф Без намека на даты
9 дек 10, 10:15    [9908940]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Gator,

    if ReportHeader.FieldByName('type').AsString='D' then
      Excel.Selection.NumberFormat := 'ДД.ММ.ГГГГ';

вот если так сделать, то все работает как положено, но...если у пользователя Excel английский или еще какой нибудь? как определить какой именно формат здесь приемлемо использовать?
9 дек 10, 10:45    [9909135]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Gator
Member

Откуда: Москва
Сообщений: 13809
vgorshkov, http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920
9 дек 10, 10:53    [9909183]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
vgorshkov
Gator,

    if ReportHeader.FieldByName('type').AsString='D' then
      Excel.Selection.NumberFormat := 'ДД.ММ.ГГГГ';

вот если так сделать, то все работает как положено, но...если у пользователя Excel английский или еще какой нибудь? как определить какой именно формат здесь приемлемо использовать?

Для локализованых Экселей положено использовать NumberFormatLocal
9 дек 10, 11:04    [9909257]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Gator,

function XL_GetShortDateFormat(XLApp: ExcelApplication): String;
var d, m, y: Integer;
begin
  if XLApp.International[xlDayLeadingZero, lcid]
    then d := 2 else d := 1;
  if XLApp.International[xlMonthLeadingZero, lcid]
    then m := 2 else m := 1;
  if XLApp.International[xl4DigitYears, lcid]
    then y := 4 else y := 2;
  Result := Format('%1:s%0:s%2:s%0:s%3:s', [
    DateSeparator,
    StringOfChar(VarToStr(XLApp.International[xlDayCode, lcid])[1], d),
    StringOfChar(VarToStr(XLApp.International[xlMonthCode, lcid])[1], m),
    StringOfChar(VarToStr(XLApp.International[xlYearCode, lcid])[1], y)
  ]);
end;

пытался использовать функцию указанную в этой статье, дает ошибку:
'(' expected but '[' found

а что за ошибка, я не могу понять...не учили нас такому в Туркмении :(
9 дек 10, 11:31    [9909490]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Anatoly Podgoretsky,

просвятите пожалуйста, что значит локализованная эксель? это значит что настройки региональные отличаются от глобальных? или как? я пробовал гуглить на эту тему, ничего не нашел
9 дек 10, 11:35    [9909537]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Gator
Member

Откуда: Москва
Сообщений: 13809
vgorshkov, А ты не используй TExcelApplication, а используй нормальную COM/OLE
9 дек 10, 11:55    [9909712]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
vgorshkov,
В твоем коде слишком много мест, где может быть ошибка.
Давай так: берешь простой пример, который работает:
+
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, ComObj, Variants, ActiveX;

Const
  CellCount=100;

var
  XL, WB, Data: OleVariant;
  i: integer;

begin
  CoInitialize(nil);

  XL:=CreateOleObject('Excel.Application');
  try
    try
      XL.DisplayAlerts:=False;

      WB:=XL.WorkBooks.Add;

      data:=varArrayCreate([0,CellCount-1,0,0], varVariant);

      for I:=0 to cellCount-1 do
        Data[i,0]:=VarAsType( Random(37000){дата} + Random {время}, varDate);

      WB.ActiveSheet.Cells[1,1].Resize[CellCount,1].Value:=Data;

      XL.Visible:=true;

    except
      XL.Quit;
      Raise;

    end;
  finally
    XL:=null;
  end;
end.
пошагово добавляешь свои примамбасы и выясняешь в какой момент работать перестанет.
Так быстрее ошибку найдем
9 дек 10, 12:17    [9909950]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
vgorshkov
Anatoly Podgoretsky,

просвятите пожалуйста, что значит локализованная эксель? это значит что настройки региональные отличаются от глобальных? или как? я пробовал гуглить на эту тему, ничего не нашел

Зачем же используешь не локализованую версию. Она же только для английского.
автор
Returns or sets the format code for the object as a string in the language of the user.

Почему ты вводишь локализированый формат для английских пользователей
автор
если у пользователя Excel английский или еще какой нибудь?

Думаешь оно понимает ДД.ММ.ГГГГ
Для ДД.ММ.ГГГГ существует NumberFormatLocal, а не NumberFormat
9 дек 10, 13:52    [9910901]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
уважаемые, я наверное не совсем понимаю что нужно делать, я поставил проверку такого типа:

    if ReportHeader.FieldByName('type').AsString='D' then
      Excel.Selection.NumberFormatLocal := 'ДД.ММ.ГГГГ';

т.е. если тип Дата, то преобразовать в дату, все работает прекрасно, но как сделать чтобы это работало независимо от версии Excel?

Статьи которые Вы предлогали я прочел, пробовал использовать функции которые там описаны, но они ничего хорошего мне непринесли, дают ошибки непонятного для меня характера. Может кто знает где можно про все это дело почитать в подробностях?
9 дек 10, 16:17    [9911957]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
vgorshkov
т.е. если тип Дата, то преобразовать в дату, все работает прекрасно, но как сделать чтобы это работало независимо от версии Excel?
Из дельфей не сделаешь, поскольку мелкомягкие не доделали это место для Automation и неизвестно когда доделают. Только макросом.
9 дек 10, 16:42    [9912152]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
vgorshkov
уважаемые, я наверное не совсем понимаю что нужно делать, я поставил проверку такого типа:

    if ReportHeader.FieldByName('type').AsString='D' then
      Excel.Selection.NumberFormatLocal := 'ДД.ММ.ГГГГ';

т.е. если тип Дата, то преобразовать в дату, все работает прекрасно, но как сделать чтобы это работало независимо от версии Excel?

Статьи которые Вы предлогали я прочел, пробовал использовать функции которые там описаны, но они ничего хорошего мне непринесли, дают ошибки непонятного для меня характера. Может кто знает где можно про все это дело почитать в подробностях?

Попробуй в NumberFormat указать 'dd.mm.yyyy' и проверить на русской локализации.
9 дек 10, 17:04    [9912363]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
vgorshkov
Member

Откуда: Ашгабат, Туркменистан
Сообщений: 95
Anatoly Podgoretsky,

попробовал, вместо всех дат пишет dd.mm.yyyy
9 дек 10, 17:05    [9912381]     Ответить | Цитировать Сообщить модератору
 Re: не понятно как экспортировать даты в Excel  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 6919
В Excel-e есть древний баг: когда через Automation задаешь Range.NumberFormat на самом деле отрабатывает Range.NumberFormatLocal. Лечится либо макросом, либо шаблоном с форматированием (условным форматированием).
9 дек 10, 17:50    [9912864]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить