Usuario del software
2010-01-25 19:02:42 +0000 2010-01-25 19:02:42 +0000
24

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

Excel tiene la funcionalidad de importar archivos de texto de ancho fijo donde presenta un diálogo que te permite elegir dónde están los inicios y finales de los campos que pone en columnas.

¿Tiene también la funcionalidad de que, dada una hoja de cálculo existente, se pueda exportar a un archivo de texto de ancho fijo?

Si es así, ¿cómo puedo acceder a esto? He intentado usar Guardar como y elegir Archivo de texto, pero parece que sólo se guarda como delimitado por tabulaciones, lo que no me ayuda.

Esto es Excel 2003 si importa.

Respuestas [7]

24
2010-01-25 19:16:55 +0000

Creo que lo más parecido a 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 a ese ancho según sea necesario.

Más allá de eso necesitas tener una macro u otro complemento que te permita hacer más.

24
14
2010-01-25 20:34:43 +0000

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 ofrece controles extremadamente granulares para especificar esos anchos.

14
5
2010-03-18 01:43:08 +0000

Vaya, iba a hacer esta pregunta yo mismo pero ya se ha hecho. Toda la salida del portapapeles de Excel está delimitada por tabuladores por defecto. Esto es un poco molesto para la salida de texto plano "real" cuando se tiene una fuente de ancho fijo, pero no necesariamente el apoyo 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 -- así:

187712 201 37 0.18 2525 580 149 0.25 136829 137 43 0.31

Aquí está el código de la macro. Para usarlo, asegúrese de activar la pestaña Desarrollador en las 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
5
4
2010-01-25 21:12:44 +0000

Primero, formatea tus datos como Courier New (o alguna otra fuente de ancho fijo). A continuación, guarde como .prn y obtendrá una anchura fija real.

4
2
2015-07-02 17:00:34 +0000

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

He modificado su macro para establecer el ancho de la columna a la celda más ancha de esa columna y para que cada columna tenga su propio ancho. Su macro sólo encontraba la celda más ancha de la primera fila y luego establecía el ancho de todas las columnas a ella.

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
2