Exportar uma planilha do Excel para um arquivo de texto de largura fixa?


24

O Excel tem a funcionalidade de importar arquivos de texto de largura fixa, onde apresenta uma caixa de diálogo que permite escolher onde o início e o fim dos campos são colocados nas colunas.

Também possui funcionalidade em que, dada uma planilha existente, você pode exportar para um arquivo de texto de largura fixa?

Em caso afirmativo, como faço para acessar isso? Eu tentei usar Salvar como e escolher Arquivo de texto, mas parece salvar apenas como delimitado por tabulações, o que não me ajuda.

Este é o Excel 2003, se for o caso.

Respostas:


24

Eu acho que o mais próximo que você pode obter da funcionalidade nativa do Excel é Salvar como | Texto formatado (delimitado por espaço) (* .prn) . Ele determinará automaticamente as larguras e inserirá espaços para preencher essa largura conforme necessário.

Além disso, você precisa ter uma macro ou outro suplemento que permita fazer mais.


3
Apenas para adicionar mais clareza - ele determinará "automaticamente" as larguras com base na largura que você especificar para suas colunas. Enquanto normalmente as medidas se aproximam do ems (tanto quanto me lembro), ao exportar para prn de largura fixa, elas são tomadas literalmente e arredondadas para baixo para fornecer valores inteiros usados ​​para o número de caracteres em uma coluna do arquivo prn. Os espaços são adicionados para preenchimento, à esquerda ou à direita, dependendo do alinhamento nas células (portanto, por padrão, os números serão preenchidos à esquerda para forçá-los à direita, texto à direita para forçar à esquerda, mas se você tiver alterado os alinhamentos, eles serão
AdamV

Isso faz o que eu estava procurando. Obrigado!
RationalGeek

1
Por favor nota: Texto formatado (.prn) está limitado a 240 caracteres por linha no Excel support.microsoft.com/kb/249885
iokevins

Para usar a macro apontada pelo iokevins, você deve remover "& delimitador" dos dois locais onde o CellText está definido. Caso contrário, ele adicionará um espaço adicional para cada célula, o que não é possível salvar como um prn.
farrenthorpe

14

Se você possui o Office Professional, pode abrir seu arquivo do Excel no Access e, em seguida, Exportar do Access. O Access permitirá especificar um layout de largura fixa para o arquivo exportado e fornece controles extremamente granulares para especificar essas larguras.


Embora o Access possa fazer isso, o Excel também solicitou o que foi solicitado.
AdamV

7
Obrigado pelo voto negativo, mas achei que valia a pena mencionar que o Access tem uma versão completa desse recurso. O Excel não permite especificar larguras de coluna diretamente, o Access sim. Sim, você pode obter as larguras de coluna corretas no Excel, mexendo com as larguras de coluna na planilha, mas é uma dor e, como alguém que precisa criar arquivos de largura fixa regularmente, não vale a pena. Se você tem acesso (o que muitas pessoas fazem), há uma maneira muito melhor.
Davidcl

Excelente; obrigado por esta alternativa: o)
iokevins

5

Uau, eu mesmo ia fazer essa pergunta, mas já foi feita. Toda saída da área de transferência do Excel é tabdelimitada por padrão. Isso é meio irritante para a saída de texto simples "real" quando você tem uma fonte de largura fixa, mas não necessariamente o suporte ao delimitador de tabulação.

De qualquer forma, eu encontrei e modifiquei uma pequena macro do Excel que copiará a região atualmente selecionada como uma tabela ASCII de colunas de largura fixa simples - da seguinte maneira:

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

Aqui está o código da macro. Para usá-lo, ative a guia Desenvolvedor nas Opções do Excel, se você estiver usando o Excel 2007 ou 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

Primeiro, formate seus dados como Courier New (ou alguma outra fonte de largura fixa). Salve como .prn e você obterá uma largura fixa verdadeira.


Isso funcionou muito bem para mim. Também gosto de formatar tudo como texto antes de fazer isso. Dessa forma, todos os dados são alinhados quando salvos.
Gary Brunton

2

Expandindo a resposta de Jeff Atwood, uma vez que não me permitia comentar lá:

Modifiquei sua macro para definir a largura da coluna para a célula mais larga nessa coluna e ter cada coluna sua própria largura. Sua macro encontrou apenas a célula mais larga na primeira linha e depois definiu a largura de todas as colunas.

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

Este é um assassino para mim. Tem algumas opções também.

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


Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Ramhound

2
@ Ramhound - Em geral, eu concordo. Mas neste caso, não há nada que eu possa copiar aqui. Esse site é um local onde você cola seus dados de entrada e obtém saída "formatada em Excel". Se o link se tornar inválido, o serviço será encerrado.
Sancho.s Restabelecer Monica

O serviço mudou: senseful.github.io/web-tools/text-table e fonte está disponível: github.com/senseful/web-tools
ngm

Que mais uma vez mudou-se para: senseful.github.io/text-table
Chris

0

Funciona com o Access fora da caixa: https://support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps com isso Como eu o manusei de maneira fácil e rápida - melhor do que com o Excel. No meu caso, foi uma conversão da tabela.


Parece que você postou sua resposta na pergunta errada ;-) Esta pergunta é sobre o Excel, enquanto sua resposta é sobre o Access. Também para respostas futuras: é útil fornecer o link para referência, mas você também deve incluir as informações essenciais na postagem.
robinCTS
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.