Экспорт таблицы Excel в текстовый файл с фиксированной шириной?


24

Excel имеет функцию импорта текстовых файлов с фиксированной шириной, где он представляет диалоговое окно, которое позволяет вам выбрать, где начинаются и заканчиваются поля, которые он помещает в столбцы.

Имеет ли он также функциональность, позволяющую экспортировать данные в существующую электронную таблицу в текстовый файл с фиксированной шириной?

Если так, как я могу получить доступ к этому? Я пытался использовать Сохранить как и выбрать текстовый файл, но кажется, что сохранить только как разделитель табуляции, что мне не помогает.

Это Excel 2003, если это имеет значение.

Ответы:


24

Я думаю, что самая близкая вы можете получить из нативной функциональности Excel это Сохранить как | Форматированный текст (с пробелами) (* .prn) . Он автоматически определит ширину и вставит пробелы для заполнения этой ширины по мере необходимости.

Помимо этого вам нужно иметь макрос или другую надстройку, которая позволит вам сделать больше.


3
Просто для большей ясности - он будет «автоматически» определять ширину на основе ширины, которую вы указали для своих столбцов. Хотя обычно измерения приближаются к ems (насколько я помню), при экспорте в фиксированную ширину prn они берутся буквально и округляются в меньшую сторону, чтобы получить целочисленные значения, используемые для количества символов в столбце файла prn. Для отступа добавляются пробелы, влево или вправо, в зависимости от выравнивания в ячейках (поэтому по умолчанию числа будут дополняться слева для выравнивания вправо, текст справа - для выравнивания влево, но если вы изменили выравнивание, они будут разные)
AdamV

Это делает то, что я искал. Благодарность!
RationalGeek

1
Обратите внимание: форматированный текст (.prn) ограничен 240 символами на строку в Excel support.microsoft.com/kb/249885
iokevins

Чтобы использовать макрос, на который указывает iokevins, вы должны удалить «& delimiter» из двух мест, где определен CellText. В противном случае, это добавит дополнительное пространство для каждой ячейки, что не делает сохранение как prn.
Farrenthorpe

14

Если у вас есть Office профессиональный, вы можете открыть файл Excel в Access, а затем экспортировать из Access. Доступ позволит вам указать макет с фиксированной шириной для экспортируемого файла и предоставит вам чрезвычайно детальные элементы управления для определения этой ширины.


В то время как Access может сделать это, Excel также будет тем, о чем просили.
AdamV

7
Спасибо за отрицательный отзыв, но я подумал, что стоит упомянуть, что в Access есть полная версия этой функции. Excel не позволяет указывать ширину столбцов напрямую, а Access. Да, вы можете получить правильную ширину столбцов в Excel, если вы будете использовать ширину столбцов на рабочем листе, но это трудная задача, и для тех, кому приходится регулярно создавать файлы фиксированной ширины, это не стоит времени. Если у вас есть доступ (что делают многие), есть гораздо лучший способ.
davidcl

Превосходно; спасибо за эту альтернативу: о)
iokevins

5

Вау, я собирался задать этот вопрос сам, но он уже был задан. Все выходные данные буфера обмена Excel tabпо умолчанию ограничены. Это немного раздражает «настоящий» вывод простого текста, когда у вас есть шрифт фиксированной ширины, но не обязательно поддержка разделителя табуляции.

Во всяком случае, я нашел и изменил небольшой макрос Excel, который будет копировать выбранную область в виде простой таблицы ASCII столбцов фиксированной ширины - например, так:

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

Вот код макроса. Чтобы использовать его, обязательно включите вкладку «Разработчик» в параметрах Excel, если вы используете Excel 2007 или более позднюю версию.

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

Сначала отформатируйте данные как Courier New (или какой-либо другой шрифт фиксированной ширины). Затем сохраните как .prn, и вы получите истинную фиксированную ширину.


Это отлично сработало для меня. Мне также нравится форматировать все как текст, прежде чем я это сделаю. Таким образом, все данные остаются выровненными при сохранении.
Гари Брунтон

2

Расширяя ответ Джеффа Этвуда, поскольку он не позволил бы мне комментировать там:

Я изменил его макрос, чтобы установить ширину столбца в самую широкую ячейку в этом столбце, чтобы каждый столбец имел собственную ширину. Его макрос нашел только самую широкую ячейку в первом ряду, а затем установил ширину всех столбцов.

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

Это убийца для меня. Также есть несколько вариантов.

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


Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы.
Ramhound

2
@Ramhound - В общем, я согласен. Но в этом случае я ничего не могу скопировать здесь. Этот веб-сайт - это место, куда вы вставляете свои входные данные и получаете вывод в формате «Excel». Если ссылка становится недействительной, то служба исчезла.
sancho.s Восстановить Монику

Служба переехала: senseful.github.io/web-tools/text-table , а источник доступен: github.com/senseful/web-tools
ngm

Который снова переместился в: senseful.github.io/text-table
Крис

0

Он работает с Access из коробки: https://support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps с этим Я справился с этим довольно легко и быстро - лучше, чем с Excel. В моем случае это было преобразование таблицы.


Похоже, вы разместили свой ответ на неправильный вопрос ;-) Этот вопрос задает вопрос об Excel, а ваш ответ - о Access. Также для будущих ответов: Предоставление ссылки для справки полезно, но вы также должны включить в сообщение необходимую информацию .
robinCTS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.