¿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.

RationalGeek
fuente

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.

squillman
fuente
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.

davidcl
fuente
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
Jeff Atwood
fuente
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.

dkusleika
fuente
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
Peter
fuente
0

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

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

sancho.s Restablece a Monica
fuente
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.

Alex
fuente
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