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" :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:

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

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 :super: