¿Exportar una hoja de cálculo de Excel a un archivo de texto de ancho fijo?


24

Excel tiene la funcionalidad de importar archivos de texto de ancho fijo donde presenta un cuadro de diálogo que le permite elegir dónde se colocan las columnas al principio y al final de los campos.

¿También tiene una funcionalidad donde, dada una hoja de cálculo existente, puede exportar a un archivo de texto de ancho fijo?

Si es así, ¿cómo accedo a esto? Intenté usar Guardar como y elegir Archivo de texto, pero parece que solo se guarda como delimitado por tabulaciones, lo que no me ayuda.

Esto es Excel 2003 si es importante.

Respuestas:


24

Creo que lo más cercano que puede obtener de la funcionalidad nativa de Excel es Guardar como | Texto con formato (delimitado por espacios) (* .prn) . Determinará automáticamente los anchos e insertará espacios para rellenar ese ancho según sea necesario.

Más allá de eso, debe tener una macro u otro complemento que le permita hacer más.


3
Solo para agregar algo de claridad: determinará "automáticamente" los anchos en función del ancho que especifique para sus columnas. Mientras que normalmente las medidas se aproximan a ems (por lo que recuerdo), cuando se exporta a prn de ancho fijo, se toman literalmente y se redondean hacia abajo para dar valores enteros utilizados para el número de caracteres en una columna del archivo prn. Se agregan espacios para el relleno, hacia la izquierda o hacia la derecha, según la alineación en las celdas (de manera predeterminada, los números se rellenarán a la izquierda para forzarlos a la derecha, el texto a la derecha para forzar a la izquierda, pero si ha cambiado las alineaciones, serán diferente)
AdamV

Esto hace lo que estaba buscando. ¡Gracias!
RationalGeek

1
Tenga en cuenta: el texto con formato (.prn) está limitado a 240 caracteres por línea en Excel support.microsoft.com/kb/249885
iokevins

Para utilizar la macro señalada por iokevins, debe eliminar "& delimiter" de los dos lugares donde se define CellText. De lo contrario, agregará un espacio adicional para cada celda, que guardar como prn no lo hace.
farrenthorpe

14

Si tiene Office Professional, puede abrir su archivo de Excel en Access y luego Exportar desde Access. Access le permitirá especificar un diseño de ancho fijo para su archivo exportado, y le brinda controles extremadamente granulares para especificar esos anchos.


Si bien Access podría hacerlo, también lo hará Excel, que es lo que se solicitó.
AdamV

77
Gracias por el voto negativo, pero pensé que valía la pena mencionar que Access tiene una versión completa de esta función. Excel no le permite especificar anchos de columna directamente, Access lo hace. Sí, puede obtener los anchos de columna correctos en Excel al manipular los anchos de columna en la hoja de trabajo, pero es una molestia y, como alguien que tiene que crear archivos de ancho fijo de forma regular, no vale la pena el tiempo. Si tiene acceso (que muchas personas tienen) hay una manera mucho mejor.
davidcl

Excelente; gracias por esta alternativa: o)
iokevins

5

Wow, yo mismo iba a hacer esta pregunta pero ya estaba hecha. Toda la salida del portapapeles de Excel está tabdelimitada de manera predeterminada. Esto es un poco molesto para la salida de texto sin formato "real" cuando tiene una fuente de ancho fijo pero no necesariamente admite delimitador de tabulación.

De todos modos, encontré y modifiqué una pequeña macro de Excel que copiará la región actualmente seleccionada como una simple tabla ASCII de columnas de ancho fijo, de esta manera:

187712 201 37 0,18   
2525 580 149 0,25   
136829 137 43 0.31   

Aquí está el código de macro. Para usarlo, asegúrese de habilitar la pestaña Desarrollador en Opciones de Excel si está usando Excel 2007 o posterior.

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)

    Dim temp As Integer
    Dim cellsize As Integer
    cellsize = 0
    For c = 1 To selectedcols
        temp = Len(CStr(Cells(1, c)))
        If temp > cellsize Then
            cellsize = temp
        End If
    Next c
    cellsize = cellsize + 1

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(selectedcols * cellsize)
        For c = 1 To selectedcols
            Mid(line, c * cellsize - cellsize + 1, cellsize) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub

4

Primero, formatee sus datos como Courier New (o alguna otra fuente de ancho fijo). Luego guarde como .prn y obtendrá un ancho fijo verdadero.


Esto funciono muy bien para mi. También me gusta formatear todo como texto antes de hacer esto. De esa manera, todos los datos se dejan alineados cuando se guardan.
Gary Brunton

2

Ampliando la respuesta de Jeff Atwood, ya que no me dejaba comentar allí:

Modifiqué su macro para establecer el ancho de la columna en la celda más ancha de esa columna y para que cada columna tenga su propio ancho. Su macro solo encontró la celda más ancha en la primera fila y luego estableció el ancho de todas las columnas.

Sub CopySelectionToClipboardAsText()

   ' requires a reference to "Windows Forms 2.0 Object Library"
   ' add it via Tools / References; if it does not appear in the list
   ' manually add it as the path C:\Windows\System32\FM20.dll

    Dim r As Long, c As Long, linesize As Long
    Dim selectedrows As Integer, selectedcols As Integer

    Dim arr
    arr = ActiveSheet.UsedRange
    selectedrows = UBound(arr, 1)
    selectedcols = UBound(arr, 2)
    ReDim CellSizes(1 To selectedcols, 2) As Integer

    Dim temp As Integer
    Dim cellsize As Integer
    linesize = 0
    For c = 1 To selectedcols
        cellsize = 0
        For r = 1 To selectedrows
            temp = Len(CStr(Cells(r, c)))
            If temp > cellsize Then
                cellsize = temp
            End If
        Next
        CellSizes(c, 0) = cellsize + 1
        CellSizes(c, 1) = linesize
        linesize = linesize + cellsize + 1
    Next c

    Dim line As String
    Dim output As String

    For r = 1 To selectedrows
        line = Space(linesize)
        For c = 1 To selectedcols
            Mid(line, CellSizes(c, 1) + 1, CellSizes(c, 0)) = Cells(r, c)
        Next c
        output = output + line + Chr(13) + Chr(10)
    Next r

    Dim MyData As MSForms.DataObject
    Set MyData = New DataObject
    MyData.SetText output
    MyData.PutInClipboard

    MsgBox "The current selection was formatted and copied to the clipboard"

End Sub

0

Esto es un asesino para mí. Tiene algunas opciones también.

http://www.sensefulsolutions.com/2010/10/format-text-as-table.html


Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Ramhound

2
@Ramhound: en general, estoy de acuerdo. Pero en este caso, no hay nada que pueda copiar aquí. Ese sitio web es un lugar donde pega sus datos de entrada y obtiene resultados con formato "Excel". Si el enlace deja de ser válido, el servicio desaparece.
sancho.s Restablece a Monica el

El servicio se ha movido: senseful.github.io/web-tools/text-table , y la fuente está disponible: github.com/senseful/web-tools
ngm

Que nuevamente se ha movido a: senseful.github.io/text-table
Chris

0

Funciona con Access fuera de la caja: https://support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps con esto de la manera que lo manejé bastante fácil y rápido, mejor que con Excel. En mi caso fue una conversión de la tabla.


Parece que has publicado tu respuesta en la pregunta incorrecta ;-) Esta pregunta es sobre Excel, mientras que tu respuesta es sobre Access. También para futuras respuestas: es útil proporcionar el enlace de referencia, pero también debe incluir la información esencial en la publicación.
robinCTS
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.