[RESUELTO] Definir formato de celdas mediante código

Discute sobre la aplicación de hojas de cálculo
Responder
BrunoF
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

[RESUELTO] Definir formato de celdas mediante código

Mensaje 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" :D o por lo menos a una celda y lo hago con un while, algo :D

Ejemplo:
Importo: 18081264387
Me debe quedar: 18081264387,00

Probé con:

Código: Seleccionar todo

oCelda.NumberFormat(acá el numerito)
Pero no hay caso.

Les agradezco, un abrazo :super:
Última edición por BrunoF el Mar Sep 30, 2014 2:12 pm, editado 1 vez en total.
LibreOffice 4.1 en Windows 7
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Definir formato de celdas mediante código

Mensaje por mauricio »

______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Definir formato de celdas mediante código

Mensaje 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.
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
BrunoF
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

Re: Definir formato de celdas mediante código

Mensaje 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 :/
Adjuntos
Ejemplo.ods
(9.51 KiB) Descargado 194 veces
LibreOffice 4.1 en Windows 7
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Definir formato de celdas mediante código

Mensaje 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.
Adjuntos
FORO_CALC_EJEMPLO_FORMATOS.ods
(14.96 KiB) Descargado 200 veces
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Definir formato de celdas mediante código

Mensaje 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: Imagen

+info en http://wiki.open-office.es/Formato_basi ... ffice_Calc
 Editado: :lol: Ahora me fijo que pedías 'mediante código' :knock: 
Saludos
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Definir formato de celdas mediante código

Mensaje 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
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
BrunoF
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

Re: Definir formato de celdas mediante código

Mensaje 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 :super:
LibreOffice 4.1 en Windows 7
Responder