ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Preenchendo o StringGrid com excel
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Seg Mai 13, 2019 9:45 am    Assunto: Preenchendo o StringGrid com excel Responder com Citação

Bom dia gente, tenho um programa que carrega um arquivo excel em um stringgrid, porém tem células que são horários no excel e que quando passa pro stringgrid vira um monte de número que eu nem sei oque é, por exemplo 14:14:00 vira 0,593055555555556, alguém pode me ajudar?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Ter Mai 14, 2019 2:18 pm    Assunto: Responder com Citação

Boa tarde,

Você pode postar o código que você utilizou para carregar o horário no StringGrid?

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos-residencial-casa
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Ter Mai 14, 2019 5:20 pm    Assunto: Responder com Citação

Segue o código
Código:

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application');
  try
    XLApp.Visible := False;
    XLApp.Workbooks.Open('C:\Users\Documents\tarefa\leitor2\teste.xls');
    Sheet := XLApp.Workbooks[ExtractFileName('C:\Users\Documents\tarefa\leitor2\teste.xls')].WorkSheets[1];


    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    x := XLApp.ActiveCell.Row;
    y := XLApp.ActiveCell.Column;
    AGrid.RowCount := x;
    AGrid.ColCount := y;


    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);         
      AGrid.RowCount := k + 1;
    until k > x;

    RangeMatrix := Unassigned;

  finally
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;

    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Xls_To_StringGrid(StringGrid1, 'teste.xls') then

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Ter Mai 14, 2019 5:54 pm    Assunto: Responder com Citação

Não fiz nenhum teste mas experimente fazer uns testes com o código dessa forma:

Código:
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R].Text;


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Qua Mai 15, 2019 8:19 am    Assunto: Responder com Citação

Testei assim e deu invalid variant operator, oque me intriga é que tem células de data e tal e só as de horas q bugaram desse jeito.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Qua Mai 15, 2019 4:53 pm    Assunto: Responder com Citação

Experimente dessa forma:

Código:
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix.Cells[K, R].Text;


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Qua Mai 15, 2019 5:00 pm    Assunto: Responder com Citação

Continua dando o mesmo erro amigo, mas obrigado por tentar ajudar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Qua Mai 15, 2019 5:31 pm    Assunto: Responder com Citação

Você sabe qual coluna tem o horário? Se souber experimente deixar o código conforme segue abaixo para tentar configurar a formatação do valor (exemplo considerando que seja a coluna C):

Código:
    Sheet := XLApp.Workbooks[ExtractFileName('C:\Users\Documents\tarefa\leitor2\teste.xls')].WorkSheets[1];
    Sheet.Columns['C'].NumberFormat := 'hh:mm';


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Qua Mai 15, 2019 5:46 pm    Assunto: Responder com Citação

Sei, mas a coluna não tem só horários, mesmo assim apliquei o código e não deu certo Sad, obrigado novamente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Qua Mai 15, 2019 5:58 pm    Assunto: Responder com Citação

O que aconteceu ao adicionar aquele código?
Você consegue identificar se determinada linha tem um horário ou não? Como?
Todos os valores são exibidos conforme esperado no Excel? Você já verificou como estão as configurações de formatação das linhas com horários no Excel?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Qui Mai 16, 2019 8:16 am    Assunto: Responder com Citação

ele perguntou se queria salvar as alterações no arquivo do excel, mas não mudou nada, sim eu consigo saber qual linha tem um horário olhando a planilha, sim todos os valores são exibidos certinho menos os horários, todas as células estão com o formato personalizado no excel.
Obrigado pelo esforço em tentar ajudar Smile .
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Qui Mai 16, 2019 12:06 pm    Assunto: Responder com Citação

Nessas sugestões que postei anteriormente estava tentando obter o horário no formato correto. Talvez seja possível algo nesse sentido, mas como essas sugestões não funcionaram, segue uma sugestão de código para converter esse número em horário caso você consiga identificar via código as linhas com horários:

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  h: TTime;
begin
  s := '0,593055555555556';
  h := StrToFloat(s);
  ShowMessage( TimeToStr(h) );
end;


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1469
Localização: Maceió - AL

MensagemEnviada: Qui Mai 16, 2019 2:53 pm    Assunto: Responder com Citação

é como o colega mencionou, o excel garda o horario e data no formato double (numero com casa decimais) e o delphi tb se olhares do que formtodesende o tdatetime vera que será double.

sabendo qual celula vai aparecer horario ou data ou ambos voce pode fazer a conversão de double para horario ou data e até mesmo ambos com o uso da função datetimetostr('DD/MM/YYYY HH:NN:SS',variavel double ou tdatetime)

podes olhar o link para entender mais:
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TDateTime.html

onde mostra que o tipo TDateTime é um double

TDateTime = type Double;

vale resaltar que não basta fazer a conversão, possivelmente precise verificar as data base no excel e no delphi se ambas são iguais

exemplo:

0 -> 12/30/1899 12:00 am (data e horario base no delphi se o excel usar a mesma base não tem problema em usar a função datetimetostr)
2.75 -> 1/1/1900 6:00 pm
-1.25 -> 12/29/1899 6:00 am
35065 -> 1/1/1996 12:00 am

caso delphi e excel usem base diferente então precisa saber qual a diferença e atribuir esta diferença juntamente na converçao.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
Fafnyr
Novato
Novato


Registrado: Terça-Feira, 7 de Mai de 2019
Mensagens: 17

MensagemEnviada: Sex Mai 17, 2019 8:27 am    Assunto: Responder com Citação

Consegui usando o código do imex, porém gostaria de saber se não tem um jeito de aplicar isso em todas as células sem ter q escrever esse código 7 vezes(que é a quantidade de células que eu tenho com horários), desculpa se for abusar demais gente, sou novo no delphi e não sei de muita coisa ainda.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11214

MensagemEnviada: Seg Mai 20, 2019 10:00 am    Assunto: Responder com Citação

Acho que você pode utilizar um If dentro do looping (For) para utilizar versões diferentes de código conforme a coluna. Ex:

Código:
      for r := 1 to y do
        if r in [1, 4, 7, 8] then
          begin
            // código para as colunas com horário
          end
        else
          begin
            // código para as outras colunas
          end;


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB