22

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

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

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

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

7 ответов7

23

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

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

12

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

5

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

Во всяком случае, я нашел и изменил небольшой макрос 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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .