[RESUELTO] Macro para exportar datos a archivo .txt

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

[RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por BrunoF »

Buenas amigos de la comunidad! Espero que esten bien. Les planteo un problema para ver si pueden darme una mano, ya que soy nuevo en la programación ooBasic, apoyandome en el libro de Mauricio.

Les cuento: tenemos una aplicación muy vieja la cual toma un archivo de excel y lo transforma a un .txt, la cual no funciona con archivos .ods y obviamente no hay soporte para la reprogramación de la aplicación, por lo cual corresponde hacer una macro que sustituya dicha aplicación.

El txt generado tiene los siguientes requsitos:

Largo de caracteres necesario en cada columna

Columna A (3)
Columna B (1)
Columna C (5)
Columna D (8)
Columna E (10)
Columna F (10)
Columna G (1)
Columna H (15)
Columna I (10)
Columna J (8)
Columna K (28)
Columna L(2)

El largo total de las columnas debe ser de 101 digitos.
Ejemplo: Si en la columna H que es de 15 digitos, ponemos solo 5, en el txt deben estar los 5 y completar los restantes 11 con espacios en blanco.

Hasta ahora tengo el siguiente código el cual exporta las columnas a un archivo txt, pero no he podido dar con el tema de los largos, solo toma el dato que esta en la celda y lo pasa.

Código: Seleccionar todo

Sub ExportarATxt

  '----------------------------------------------------------------------
  ' Guardar documento

  Dim documento As Object
  Dim dispatcher As Object
  documento = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dispatcher.executeDispatch(documento, ".uno:Save", "", 0, Array())

  '----------------------------------------------------------------------
  ' Exportar a archivo de texto

  Dim oDoc As Object ' El documento actual
  Dim oHojas As Object ' La colección de hojas del documento
  Dim oHoja As Object ' Hoja en específico
  Dim oHojaDefault As Object ' Hoja para definir donde quedará
  Dim sNewFilename As String ' Nuevo nombre de texto
  Dim sExt As String ' La nueva extensión a aplicar
  Dim sURL As String ' URL existente en el documento
  Dim sCurrDir As String ' Directorio actual
  Dim FileProperties(2) As New com.sun.star.beans.PropertyValue

  oDoc = thisComponent
  oHojas = oDoc.Sheets()
  oHoja = oHojas.getByName("Temp")
  oHojaDefault = oHojas.getByName("Resumen")
  sURL = ConvertFromURL(oDoc.getLocation())
  sCurrDir = Mid(sURL,1,Len(sURL)-Len(Dir(sURL)))
  
  FileProperties(0).Name = "Overwrite"
  FileProperties(0).Value = True
  FileProperties(1).Name = "FilterName"
  FileProperties(1).Value = "Text - txt - csv (StarCalc)"
  FileProperties(2).Name = "FilterOptions"
  'FileProperties(2).Value = "9,0,ANSI,1"
  'FileProperties(2).Value = "FIX,,0,1,0/2/10/36/19/4"
  FileProperties(2).Value = "FIX,,2,5,3/2/10/36/19/4"
  'Separación,Inicio de fila,
  sExt = ".txt"

    sNewFilename = "Archivo" & sExt
    oDoc.CurrentController.setActiveSheet(oHoja)
    oDoc.storeToURL(ConvertToURL(sCurrDir & sNewFilename),FileProperties())

  oDoc.CurrentController.setActiveSheet(oHojaDefault) ' Seteamos la hoja a mostrar

  MsgBox("¡Archivo .txt creado con éxito!")

End Sub
Espero me puedan dar una mano. Desde ya les agradezco. Un gran abrazo desde Uruguay! :mrgreen:
Última edición por mauricio el Sab Ago 02, 2014 3:09 am, editado 2 veces en total.
Razón: Marcar icono de resuelto
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: Macro para exportar datos a archivo .txt

Mensaje por PepeOooSevilla »

Hola.
Te damos la bienvenida al foro y, por favor, no dejes de leer la Guía de supervivencia.

Una de las posibles soluciones a tu consulta la tienes en el archivo adjunto.
Este es el código fuente:

Código: Seleccionar todo

Option Explicit

Sub Exportar_A_TXT_v2
	Dim oDoc As Object ' El documento actual
	Dim oHojas As Object ' La colección de hojas del documento
	Dim oHoja As Object ' Hoja en específico
	Dim sNewFilename As String ' Nuevo nombre de texto
	Dim sURL As String ' URL existente en el documento
	Dim sCurrDir As String ' Directorio actual
	Dim sExt As String ' La nueva extensión a aplicar
	Dim NumeroArchivo As Integer
	Dim LongitudColumnas(0) As Integer ' Columnas A-L. Columna A = índice 0 del array
	Dim DatoCelda As String
	Dim FilaActual As Long
	Dim Contador As Long
	Dim UltimaColumna As Long
	Dim LineaResultado As String
	
	Const COLUMNA_A As Long = 0
	
	UltimaColumna = 11	' Columna_L
	ReDim LongitudColumnas(UltimaColumna)
							' COLUMNAS	LONGITUD
	LongitudColumnas(0) = 3		' Columna_A		3
	LongitudColumnas(1) = 1		' Columna_B		1
	LongitudColumnas(2) = 5		' Columna_C		5
	LongitudColumnas(3) = 8		' Columna_D		8
	LongitudColumnas(4) = 10          ' Columna_E		10
	LongitudColumnas(5) = 10	        ' Columna_F		10
	LongitudColumnas(6) = 1		' Columna_G		1
	LongitudColumnas(7) = 15	        ' Columna_H		15
	LongitudColumnas(8) = 10	        ' Columna_I		10
	LongitudColumnas(9) = 8		' Columna_J		8
	LongitudColumnas(10) = 28	' Columna_K		28
	LongitudColumnas(11) = 2	        ' Columna_L		2
							' TOTAL			101

	oDoc = ThisComponent
	oHojas = oDoc.Sheets()
	oHoja = oHojas.getByName("DATOS")
	sURL = ConvertFromURL(oDoc.getLocation())
	sCurrDir = Mid(sURL, 1, Len(sURL)-Len(Dir(sURL)))
	sExt = ".txt"
	sNewFilename = sCurrDir & "Archivo_" & Format(Now, "yyyymmddhhmmss") & sExt
	' ¡Atención! Los datos comienzan en la Fila 3 (El índice de la Fila 1 es 0)
	FilaActual = 2
	' ¡Atención! Los datos comienzan en la Columna A (El índice de la Columna A es 0)	
	NumeroArchivo = FreeFile
	Open sNewFilename For Output As #NumeroArchivo
	With oHoja
		Do While .getCellByPosition(COLUMNA_A, FilaActual).getString() <> "Fin listado"
			LineaResultado = ""
			For Contador = 0 To UltimaColumna
				DatoCelda = .getCellByPosition(Contador, FilaActual).getString()
				If Len(DatoCelda) < LongitudColumnas(Contador) Then
					DatoCelda = DatoCelda & Space(LongitudColumnas(Contador) - Len(DatoCelda))
				End If
				LineaResultado = LineaResultado & DatoCelda
			Next
			Print #NumeroArchivo, LineaResultado
			FilaActual = FilaActual + 1
		Loop
	End With
	Close NumeroArchivo
End Sub
Recuerda añadir el texto "Fin listado" para que la macro termine.
Para que CALC no interprete los textos numéricos como números es conveniente que el formato de todas las celdas con datos sean tipo "Texto" (Formato->Celdas...->Pestaña Números->Texto), porque si no, interpretará "12345678910111213" como 1,23456789101112E+016 y, obviamente, no interesa.
Al nombre del archivo TXT resultante le he añadido la fecha y hora del sistema en el momento de la creación en formato AAAAMMDDHHMMSS (año mes día hora minuto segundo).
Deberías modificar la macro para controlar los posibles errores que se puedan dar.

Si consideras que el tema está resuelto, indícalo (¿Cómo marcar como RESUELTO un tema?), ya que, de esta forma, conseguiremos un foro más ordenado.
Saludos cordiales.
Adjuntos
FORO_CALC_Macro_para_exportar_datos_a_archivo_txt.ods
(16.49 KiB) Descargado 4988 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.
BrunoF
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

Re: Macro para exportar datos a archivo .txt

Mensaje por BrunoF »

Que fácil lo hacen! Y yo que estaba así :crazy: jaja. Buenísima la macro, ya lo había resuelto a lo picapiedras utilizando funciones de Calc, ahí armaba el formato y luego lo exportaba. Está macro va de lujo con algunos ajustes a mis necesidades. En cuanto pueda la estudio bien. Pepe te agradezco muchísimo, gran trabajo. Un abrazo desde Uruguay!
LibreOffice 4.1 en Windows 7
cesp
Mensajes: 1
Registrado: Mar Jul 07, 2015 5:11 pm

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por cesp »

Buenos Dias.

Estoy viendo sus macros y me parecen muy interesantes, la verdad yo no se mucho de eso pero necesito una macro igual que me respete la longuitud, que si en la columna pongo 5 letras y es de 10 me ponga las otras 5 en blanco, espero y me puedan ayudar con eso.

Pongo la segunda formula en la macron y no me deja; no se si este mal o yo este haciendo algo mal.

Estare en espera de alguna respuesta.

Saludos.
OpenOffice 3.1 en Windows Vista / NeoOffice 2.2.3 con MacOS 10.4 / OpenOffice 2.4 en Ubuntu 9.04
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por SLV-es »

La macro desarrollada aquí es para exportar a un documento de texto en formato "ancho de campo fijo".
Puedes grabar una macro mientras exportas a un documento en formato CSV (en realidad, guardar como > CSV) que genera un documento de texto separado por puntos y comas, de ancho variable.

Obtendrás algo similar a esto:

Código: Seleccionar todo

sub ExportarCSV
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///K:/Mis%20Documentos/prueba%20macro.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "59,34,ANSI,1,,0,true,true,true"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())

end sub
Ahora, con un poco de imaginación, haces este cambio y ya tienes una macro más usable

Código: Seleccionar todo

sub ExportarCSV( cRutaNombreDestino as string)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = ConvertToURL(cRutaNombreDestino )
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "59,34,ANSI,1,,0,true,true,true"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 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
Taveg
Mensajes: 2
Registrado: Mié Jun 22, 2016 3:53 pm

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por Taveg »

Buenas tardes,

Agradezco el conocimiento compartido. me interesa como funciona la macro pero no me es posible hacerla ejecutar. me muestra un error de Compilación. donde dice que la matriz ya tiene dimenciones. no se como pueda ejecutar la macro agradezco la ayuda que me puedan dar :!:
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por mauricio »

¿Exactamente en que línea te muestra el error?... por otra parte, si tus datos tienen otra estructura, es mucho mejor que abras un nuevo tema.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Taveg
Mensajes: 2
Registrado: Mié Jun 22, 2016 3:53 pm

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por Taveg »

Buenos Días,

Qué pena con la insistencia, estoy retomando el tema y la verdad creo que el código que se creó para este tema me es de utilidad, y quiera solicitar de su colaboración, no tengo mucho conocimiento sobre las macros pero se lo fabuloso que pueden llegar a ser.

Solo necesito poder ejecutarla, pero me sale;

Error de compilación:
La Matriz ya tiene dimensiones.


En la línea

ReDim LongitudColumnas(UltimaColumna)

Agradezco un montón su ayuda.
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
fgili
Mensajes: 39
Registrado: Lun Sep 02, 2013 2:34 pm

Re: Macro para exportar datos a archivo .txt

Mensaje por fgili »

PepeOooSevilla escribió:Hola.
Te damos la bienvenida al foro y, por favor, no dejes de leer la Guía de supervivencia.

Una de las posibles soluciones a tu consulta la tienes en el archivo adjunto.
Este es el código fuente:

Código: Seleccionar todo

Option Explicit

Sub Exportar_A_TXT_v2
	Dim oDoc As Object ' El documento actual
	Dim oHojas As Object ' La colección de hojas del documento
	Dim oHoja As Object ' Hoja en específico
	Dim sNewFilename As String ' Nuevo nombre de texto
	Dim sURL As String ' URL existente en el documento
	Dim sCurrDir As String ' Directorio actual
	Dim sExt As String ' La nueva extensión a aplicar
	Dim NumeroArchivo As Integer
	Dim LongitudColumnas(0) As Integer ' Columnas A-L. Columna A = índice 0 del array
	Dim DatoCelda As String
	Dim FilaActual As Long
	Dim Contador As Long
	Dim UltimaColumna As Long
	Dim LineaResultado As String
	
	Const COLUMNA_A As Long = 0
	
	UltimaColumna = 11	' Columna_L
	ReDim LongitudColumnas(UltimaColumna)
							' COLUMNAS	LONGITUD
	LongitudColumnas(0) = 3		' Columna_A		3
	LongitudColumnas(1) = 1		' Columna_B		1
	LongitudColumnas(2) = 5		' Columna_C		5
	LongitudColumnas(3) = 8		' Columna_D		8
	LongitudColumnas(4) = 10          ' Columna_E		10
	LongitudColumnas(5) = 10	        ' Columna_F		10
	LongitudColumnas(6) = 1		' Columna_G		1
	LongitudColumnas(7) = 15	        ' Columna_H		15
	LongitudColumnas(8) = 10	        ' Columna_I		10
	LongitudColumnas(9) = 8		' Columna_J		8
	LongitudColumnas(10) = 28	' Columna_K		28
	LongitudColumnas(11) = 2	        ' Columna_L		2
							' TOTAL			101

	oDoc = ThisComponent
	oHojas = oDoc.Sheets()
	oHoja = oHojas.getByName("DATOS")
	sURL = ConvertFromURL(oDoc.getLocation())
	sCurrDir = Mid(sURL, 1, Len(sURL)-Len(Dir(sURL)))
	sExt = ".txt"
	sNewFilename = sCurrDir & "Archivo_" & Format(Now, "yyyymmddhhmmss") & sExt
	' ¡Atención! Los datos comienzan en la Fila 3 (El índice de la Fila 1 es 0)
	FilaActual = 2
	' ¡Atención! Los datos comienzan en la Columna A (El índice de la Columna A es 0)	
	NumeroArchivo = FreeFile
	Open sNewFilename For Output As #NumeroArchivo
	With oHoja
		Do While .getCellByPosition(COLUMNA_A, FilaActual).getString() <> "Fin listado"
			LineaResultado = ""
			For Contador = 0 To UltimaColumna
				DatoCelda = .getCellByPosition(Contador, FilaActual).getString()
				If Len(DatoCelda) < LongitudColumnas(Contador) Then
					DatoCelda = DatoCelda & Space(LongitudColumnas(Contador) - Len(DatoCelda))
				End If
				LineaResultado = LineaResultado & DatoCelda
			Next
			Print #NumeroArchivo, LineaResultado
			FilaActual = FilaActual + 1
		Loop
	End With
	Close NumeroArchivo
End Sub
Recuerda añadir el texto "Fin listado" para que la macro termine.
Para que CALC no interprete los textos numéricos como números es conveniente que el formato de todas las celdas con datos sean tipo "Texto" (Formato->Celdas...->Pestaña Números->Texto), porque si no, interpretará "12345678910111213" como 1,23456789101112E+016 y, obviamente, no interesa.
Al nombre del archivo TXT resultante le he añadido la fecha y hora del sistema en el momento de la creación en formato AAAAMMDDHHMMSS (año mes día hora minuto segundo).
Deberías modificar la macro para controlar los posibles errores que se puedan dar.

Si consideras que el tema está resuelto, indícalo (¿Cómo marcar como RESUELTO un tema?), ya que, de esta forma, conseguiremos un foro más ordenado.
Saludos cordiales.
HOla, he utilizado el archivo adjunto en este post con la macro y funciona ok pero me piden un archivo de texto con las siguientes caracteristicas:
Son 5 lineas y cada linea tene unos campos determinados y algunos en blanco (y hay que respetar las posiciones)
Adjunto imagen para que se entienda mejor el formato
Imagen
Las lineas siguientes tienen otras caracteristicas de espacios diferentes
Es posible hacerlo?
alguien puede decirme como?


Adjunto ejemplo de txt que me enviaron como modelo de como quedaria con los datos ingresados

Muchas gracias!!
Adjuntos
ejemplo.zip
(379 Bytes) Descargado 644 veces
Open Office 4.0 + Win 7
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por PepeOooSevilla »

Hola.
Lee la respuesta de este tema
Saludos cordiales.
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
fgili
Mensajes: 39
Registrado: Lun Sep 02, 2013 2:34 pm

Re: [RESUELTO] Macro para exportar datos a archivo .txt

Mensaje por fgili »

Hola Gracias por responder ya estoy mareado con este tema no se como hacero
adjunto el archivo
Adjuntos
debitoNuevo.ods
(17.26 KiB) Descargado 466 veces
Open Office 4.0 + Win 7
Responder