Página 1 de 1
[RESUELTO] Definir formato de celdas mediante código
Publicado: Lun Sep 29, 2014 6:58 pm
por BrunoF
Buenas gente, espero estén bien.
Les hago la siguiente consulta: resulta que necesito importar un archivo .txt el cual tiene columnas que son importes, los cuales se manejan con el formato ####,## dos decimales. Importo el txt lo mas bien pero, hay alguna forma de mediante código decirle a Calc: "Che loco, esta columna va a tener el siguiente formato asíque cambiamelo ya"

o por lo menos a una celda y lo hago con un while, algo
Ejemplo:
Importo: 18081264387
Me debe quedar: 18081264387,00
Probé con:
Pero no hay caso.
Les agradezco, un abrazo

Re: Definir formato de celdas mediante código
Publicado: Lun Sep 29, 2014 8:33 pm
por mauricio
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 12:15 pm
por SLV-es
Por favor, adjunta un ejemplo del archivo txt con dos o tres líneas.
Si no sabes cómo, lee
adjuntar una copia del documento a este tema.
Si contiene datos que no deben hacerse públicos, crea una copia para enviar donde debes eliminar esos datos o reemplazarlos con información irrelevante.
La ley de casi todos los paises castiga con graves multas e incluso penas de prisión la publicación de datos privados de personas. Por lo tanto, elimina nombres, apellidos, domicilios, fechas de nacimiento, teléfonos, etc, y rellénalos con datos irrelevantes o ficticios.
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 1:10 pm
por BrunoF
Adjunto el ejemplo. En si es sencillo, debo formatear los importes de una columna para que queden con dos decimales.
He intentado recorrer cada celda, y asignarle un NumberFormat(16) que es el que define los decimales, pero no hay caso, igual creo que lo estoy haciendo mal :/
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 1:19 pm
por PepeOooSevilla
Hola.
Además de lo comentado por los compañeros, adjunto un archivo donde puedes ver la manera en que soluciono el tema de los formatos. He de decir que "siguiendo" el libro
Aprendiendo OOo Basic de nuestro compañero
mauricio.
Puedes ver también este tema
Aplicación para importar archivo de texto especial por si te fuera de utilidad.
Y, por último, no olvides visitar la página
Formatos personalizados en OpenOffice Calc de nuestro compañero
SLV-es. Encontrarás muy buena información.
Este es el código de mi archivo de ejemplo:
Código: Seleccionar todo
REM ***** BASIC *****
Option Explicit
Const ICONO_STOP As Integer = 16
Const BOTON_ACEPTAR As Integer = 0
Sub VerFormato
Dim oDoc As Object
Dim oHoja As Object
Dim ValorCelda As Double
Dim CadenaFormatoNumero As String
Dim Alineacion As String
Dim FormatosNumeros As Object
Dim IndiceFormato As Long
Dim LocalSettings As New com.sun.star.lang.Locale
On Error GoTo VER_ERROR
oDoc = ThisComponent
oHoja = oDoc.CurrentController.getActiveSheet()
With oHoja
ValorCelda = .getCellRangeByName("B1").getValue()
CadenaFormatoNumero = .getCellRangeByName("B2").getString()
Alineacion = .getCellRangeByName("B3").getString()
With .getCellRangeByName("B4")
' Asignamos el valor de B1
.setValue(ValorCelda)
' Negrita
.CharWeight = com.sun.star.awt.FontWeight.BOLD
' Horientación vertical Centrada
.VertJustify = com.sun.star.table.CellVertJustify.CENTER
' Horientación horizontal de acuerdo a lo seleccionado
Select Case Alineacion
Case "Izquierda"
.HoriJustify = com.sun.star.table.CellHoriJustify.LEFT
Case "Centrado"
.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER
Case "Derecha"
.HoriJustify = com.sun.star.table.CellHoriJustify.RIGHT
End Select
' MUY IMPORTANTE para asignar formatos: ¡Atención! País -> ESPAÑA
With LocalSettings
.Language = "es"
.Country = "es"
End With
' Accedemos a los distintos formatos presentes en el documento
FormatosNumeros = oDoc.NumberFormats
' Consultamos si existe el que nosotros queremos
IndiceFormato = FormatosNumeros.queryKey(CadenaFormatoNumero, LocalSettings, True)
If IndiceFormato = -1 Then
' Si no existe entonces lo añade a los existentes
IndiceFormato = FormatosNumeros.addNew(CadenaFormatoNumero, LocalSettings)
End If
' Se asigna el formato adecuado
.NumberFormat = IndiceFormato
End With
End With
Exit Sub
VER_ERROR:
MsgBox "Lo siento pero no puedo mostrar ese formato.", ICONO_STOP + BOTON_ACEPTAR, "¡Atención!"
End Sub
Saludos cordiales.
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 1:56 pm
por SLV-es
Otra solución, aunque más manual (y sólo por si no la conocías):
Tras importar el txt, selecciona la columna de los importes, y haz dos clics sobre el botón
Formato numérico, añadir un decimal:
+info en
http://wiki.open-office.es/Formato_basi ... ffice_Calc
Editado: Ahora me fijo que pedías 'mediante código' |
Saludos
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 2:04 pm
por SLV-es
Otra solución, creada con la grabadora de macros:
Tras importar el txt, ejecuta esta macro indicando el nº de la columna a formatear, teniendo en cuenta que la columna A es la 0, la B es la 1, etc.
Código: Seleccionar todo
sub PonerColumna2Decimales(nColumna as long)
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoToStart", "", 0, args1())
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = nColumna
args2(1).Name = "Sel"
args2(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = true
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:NumberFormatIncDecimals", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:NumberFormatIncDecimals", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoToStart", "", 0, args1())
end sub
Re: Definir formato de celdas mediante código
Publicado: Mar Sep 30, 2014 2:07 pm
por BrunoF
Estimados, primero que nada muchísimas gracias por sus colaboraciones.
Necesito hacerlo con una macro porque debo hacer otros cálculos despues de importar los datos y preciso que estén con decimales para el resultado final.
Definitivamente estaba errando en la asignación del formato a la celda, tampoco sabía que tenía que escribir y agregar el formato a los formatos de mi documento.
Después de un par de modificaciones, quedo así:
Código: Seleccionar todo
Option Explicit
Sub Main
Dim oDoc As Object ' Documento actual
Dim oHoja As Object ' Hoja activa
Dim oCelda As Object ' Celda en la cual voy a trabajar
Dim CadenaFormatoNumero As String
Dim FormatosNumeros As Object
Dim IndiceFormato As Long
Dim LocalSettings As New com.sun.star.lang.Locale
oDoc = ThisComponent
oHoja = oDoc.currentController.getActiveSheet()
oCelda = oHoja.getCellRangeByName( "A1" )
CadenaFormatoNumero = "###0,00"
With LocalSettings
.Language = "es"
.Country = "es"
End With
' Accedemos a los distintos formatos presentes en el documento
FormatosNumeros = oDoc.NumberFormats
' Consultamos si existe el que nosotros queremos
IndiceFormato = FormatosNumeros.queryKey(CadenaFormatoNumero, LocalSettings, True)
If IndiceFormato = -1 Then
' Si no existe entonces lo añade a los existentes
IndiceFormato = FormatosNumeros.addNew(CadenaFormatoNumero, LocalSettings)
End If
' Se asigna el formato adecuado a la celda
oCelda.NumberFormat = IndiceFormato
End Sub
Entonces para importar el documento pienso hacer un while y asignarle el formato a cada celda que necesito:
Código: Seleccionar todo
Do While oCelda.Type <> EMPTY
' Aquí le asigno el formato que obtuve en el código anterior
oCelda.NumberFormat = IndiceFormato
'Aumento el contador y paso de celda
iContador = iContador + 1
oCelda = oHoja.getCellRangeByName( "A"+iContador )
Loop
Aún no lo probé pero seguro que funciona.
Muchísimas gracias y como siempre, espero que les sirva a muchos más.
Un abrazo
