Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2011, 13:08   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Формат ячейки в Excel

Подскажите, пожалуйста, как программным путем из Delphi сменить формат ячейки в Экселе с обычного на числовой. Заранее спасибо!
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 07.02.2011, 13:25   #2
novichok1
Пользователь
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

Не знаю это ли вы ищете

var
i,j :integer;
xl:variant;

....


xl:=CreateOleObject('Excel.Applicat ion');

xl.WorkBooks.open('D:\a.xls');

xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ].select;
xl.selection.numberformat:='0.00';
novichok1 вне форума Ответить с цитированием
Старый 07.02.2011, 13:51   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не проверял, но, насколько мне известно, в Excel (в VBA) совсем не обязательно выдёлять что-то, чтобы обработать (даже наоборот, желательно НЕ ВЫДЕЛЯТЬ!)
т.е. должно сработать так (одной строчкой):
Код:
xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ].numberformat:='0.00';
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2011, 13:55   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Цитата:
Сообщение от novichok1 Посмотреть сообщение
Не знаю это ли вы ищете

var
i,j :integer;
xl:variant;

....


xl:=CreateOleObject('Excel.Applicat ion');

xl.WorkBooks.open('D:\a.xls');

xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ].select;
xl.selection.numberformat:='0.00';
Да, спасибо, оно самое!
Только проблема не решена. Дело в том, что данные в эксель экспортируются из StringGrid. И даже после преобразования формата ячеек, они остаются вставлены "как текст", несмотря на то, что формат ячеек уже числовой.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 07.02.2011, 15:02   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

DIgorevich,
1) попробуйте поменять местами - сначала задайте формат,
потом заводите значение.

2) ИЛИ, сразу после задания формата попробуйте сделать примерно так
Код:
  xx := xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ];
  xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ].numberformat:='0.00';
  xl.range[xl.Cells[i,j], xl.Cells[i+1,j+1] ] := xx ;
3) если не поможет, сделайте небольшой тестовый проектик, давайте исходники,
посмотрим, что можно сделать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.02.2011, 15:23   #6
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Serge_Bliznykov, спасибо за участие!
Ваши варианты уже перепробовал - не помогает. Дело в том, что данные в СтрингГриде динамичные могут быть (разное количество столбцов и строк). Поэтому использую для импорта следующую функцию (нагло стырил из DW):
Код:
{ Code by Reinhard Schatzl }

 uses
   ComObj;

 // Hilfsfunktion fur StringGridToExcelSheet 
// Helper function for StringGridToExcelSheet 
function RefToCell(RowID, ColID: Integer): string;
 var
   ACount, APos: Integer;
 begin
   ACount := ColID div 26;
   APos := ColID mod 26;
   if APos = 0 then
   begin
     ACount := ACount - 1;
     APos := 26;
   end;

   if ACount = 0 then
     Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);

   if ACount = 1 then
     Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID);

   if ACount > 1 then
     Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID);
 end;

 // StringGrid Inhalt in Excel exportieren 
// Export StringGrid contents to Excel 
function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string;
   ShowExcel: Boolean): Boolean;
 const
   xlWBATWorksheet = -4167;
 var
   SheetCount, SheetColCount, SheetRowCount, BookCount: Integer;
   XLApp, Sheet, Data: OLEVariant;
   I, J, N, M: Integer;
   SaveFileName: string;
 begin
   //notwendige Sheetanzahl feststellen 
  SheetCount := (Grid.ColCount div 256) + 1;
   if Grid.ColCount mod 256 = 0 then
     SheetCount := SheetCount - 1;
   //notwendige Bookanzahl feststellen 
  BookCount := (Grid.RowCount div 65536) + 1;
   if Grid.RowCount mod 65536 = 0 then
     BookCount := BookCount - 1;

   //Create Excel-OLE Object 
  Result := False;
   XLApp  := CreateOleObject('Excel.Application');
   try
     //Excelsheet anzeigen 
    if ShowExcel = False then
       XLApp.Visible := False
     else
       XLApp.Visible := True;
     //Workbook hinzufugen 
    for M := 1 to BookCount do
     begin
       XLApp.Workbooks.Add(xlWBATWorksheet);
       //Sheets anlegen 
      for N := 1 to SheetCount - 1 do
       begin
         XLApp.Worksheets.Add;
       end;
     end;
     //Sheet ColAnzahl feststellen 
    if Grid.ColCount <= 256 then
       SheetColCount := Grid.ColCount
     else
       SheetColCount := 256;
     //Sheet RowAnzahl feststellen 
    if Grid.RowCount <= 65536 then
       SheetRowCount := Grid.RowCount
     else
       SheetRowCount := 65536;

     //Sheets befullen 
    for M := 1 to BookCount do
     begin
       for N := 1 to SheetCount do
       begin
         //Daten aus Grid holen 
        Data := VarArrayCreate([1, Grid.RowCount, 1, SheetColCount], varVariant);
         for I := 0 to SheetColCount - 1 do
           for J := 0 to SheetRowCount - 1 do
             if ((I + 256 * (N - 1)) <= Grid.ColCount) and
               ((J + 65536 * (M - 1)) <= Grid.RowCount) then
               Data[J + 1, I + 1] := Grid.Cells[I + 256 * (N - 1), J + 65536 * (M - 1)];
         //------------------------- 
        XLApp.Worksheets[N].Select;
         XLApp.Workbooks[M].Worksheets[N].Name := SheetName + IntToStr(N);
         //Zellen als String Formatieren 
        XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1),
           RefToCell(SheetRowCount, SheetColCount)].Select;
         XLApp.Selection.NumberFormat := '@';
         XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select;
         //Daten dem Excelsheet ubergeben 
        Sheet := XLApp.Workbooks[M].WorkSheets[N];
         Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Value :=
           Data;
       end;
     end;
     //Save Excel Worksheet 
    try
       for M := 1 to BookCount do
       begin
         SaveFileName := Copy(FileName, 1,Pos('.', FileName) - 1) + IntToStr(M) +
           Copy(FileName, Pos('.', FileName),
           Length(FileName) - Pos('.', FileName) + 1);
         XLApp.Workbooks[M].SaveAs(SaveFileName);
       end;
       Result := True;
     except
       // Error ? 
    end;
   finally
     //Excel Beenden 
    if (not VarIsEmpty(XLApp)) and (ShowExcel = False) then
     begin
       XLApp.DisplayAlerts := False;
       XLApp.Quit;
       XLAPP := Unassigned;
       Sheet := Unassigned;
     end;
   end;
 end;
Видно, что она вставляет в эксель все данные сразу. Потому и ничего не получается.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 07.02.2011, 15:32   #7
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

извините ошибся
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 08.02.2011, 17:53   #8
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Проблема так и не решена :
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 06.01.2015, 14:02   #9
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

Вот так будет, как число
Код:
    XL.Range['A1'] := strtofloat(Edit1.Text);
Вдруг кто-то будет искать

Мне вот любопытно, как преобразовать в Текстовый формат, ибо по умолчанию стоит Обший... Он меня не устраивает. Эксель думает, что я формулу ввожу

Последний раз редактировалось Sheeby; 06.01.2015 в 14:36.
Sheeby вне форума Ответить с цитированием
Старый 06.01.2015, 14:10   #10
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Deleted post
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формат ячейки равнялся формату ячейки из другого листа? Alexandrone Microsoft Office Excel 5 29.10.2010 00:08
формат ячейки serikov Microsoft Office Excel 8 11.07.2010 22:47
формат ячейки redfield Microsoft Office Excel 8 19.05.2010 10:15
Формат ячейки judge_arm Microsoft Office Excel 3 03.07.2009 12:44
Формат ячейки peredozer Microsoft Office Excel 2 22.04.2009 11:46