Milissegundos ausentes quando se obter um valor DateTime de Excel usando interoperabilidade .NET
-
08-07-2019 - |
Pergunta
Se eu colocar um valor DateTime em uma célula do Excel usando Range.set_value
através do .NET COM Interop, em seguida, recuperar o valor dessa mesma célula usando Range.get_value
, a parte milissegundo do valor não é retornado, embora tudo o resto é correta.
Este é um bug?
Qual é a solução? Eu estou supondo que o uso da propriedade Value2 vez pode ajudar. Tem mais alguém tentou isso?
Solução 2
Como Jon sugeriu , convertendo o DateTime para um duplo usando DateTime.ToOADate (em seguida, novamente usando DateTime.FromOADate) funciona se você definir o valor usando a propriedade Range.Value2.
O único problema com este estabelecimento é que, se você ainda não sabe, ele não lhe dizer que a célula é suposto ser tratado como um DateTime. Eu acho que para resolver isso, você precisa usar uma abordagem de duas passagens: obter valores de célula usando Range.get_Value para determinar seu tipo, em seguida, para quaisquer células de data e hora, obter os seus valores novamente usando Range.Value2, em seguida, converter usando DateTime .FromOADate.
Outras dicas
Se você definir uma data / hora com um valor de milissegundos no Excel manualmente, não é mantê-lo? Eu não sei sobre o modelo de objeto interno Excel, mas é concebível que ele simplesmente não suporta milissegundos.
EDIT: Ok, agora nós sabemos que o conjunto falhar (o get também pode falhar, é claro) ... você poderia tentar defini-lo como um duplo após convertê-la via DateTime.ToOADate () . Não estou dizendo que eu estou segurando a muito esperança, mas vale a pena tentar ...
É provavelmente por causa do problema descrito no este artigo KB .
Nesse caso, definindo a propriedade Value2 deve funcionar.