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

Вопрос или проблема

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

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

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

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

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

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

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

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

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

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

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

Sub CopySelectionToClipboardAsText()

   ' требуется ссылка на "Библиотеку объектов Windows Forms 2.0"
   ' добавьте ее через Инструменты / Ссылки; если она не появляется в списке
   ' добавьте вручную по пути 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 "Текущий выбор был форматирован и скопирован в буфер обмена"

End Sub

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

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

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

Sub CopySelectionToClipboardAsText()

   ' требуется ссылка на "Библиотеку объектов Windows Forms 2.0"
   ' добавьте ее через Инструменты / Ссылки; если она не появляется в списке
   ' добавьте вручную по пути 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 "Текущий выбор был форматирован и скопирован в буфер обмена"

End Sub

Это для меня настоящая находка. У него есть несколько опций тоже.

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

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

@Ответ squillman работает прекрасно. Если вы хотите использовать дополнение пробелов вместо дополнения табуляцией, вы можете использовать

=CONCAT(A1,REPT(" ",MAX(LEN(A$1:A$10))+2-LEN(A1)))

Где вам нужно заменить

  1. A1 на ячейку, которую вы хотите дополнить справа
  2. 2 на количество пробелов, с которыми вы хотите разделить два последовательных столбца
  3. A$1:A$10 на ссылку на столбец в контексте.

Ответ или решение

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

Варианты экспорта в текстовый файл фиксированной ширины

  1. Использование формата PRN:
    Excel 2003 предоставляет возможность экспортировать данные в формате PRN (форматированный текст с пробелами). Вот шаги для осуществления этого метода:

    • Откройте свою таблицу в Excel.
    • Перейдите в меню "Файл" и выберите "Сохранить как".
    • В поле "Тип файла" выберите *Форматированный текст (разделенный пробелами) (.prn)**.
    • Сохраните файл. Excel автоматически определит ширину полей и добавит пробелы для соответствия.

    Обратите внимание, что этот метод может недостаточно точно соответствовать вашим требованиям по фиксированной ширине, так как Excel сам определяет ширину полей.

  2. Использование макросов Excel:
    Если вам нужно больше контроля над форматом и шириной столбцов, вы можете воспользоваться макросами. Вот пример кода макроса, который формирует данные с фиксированной шириной:

    Sub CopySelectionToClipboardAsText()
       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 "Текущие данные скопированы в буфер обмена в формате фиксированной ширины"
    End Sub

    Для использования этого макроса:

    • Откройте редактор Visual Basic (нажмите ALT + F11).
    • Вставьте приведённый код в новый модуль.
    • Выполните макрос, чтобы скопировать отформатированные данные в буфер обмена.
  3. Использование Microsoft Access:
    Если у вас установлен Microsoft Access (обычно входит в состав Office Professional), вы можете открыть таблицу в Access и использовать функцию экспорта для создания текстового файла фиксированной ширины с более точной настройкой ширины столбцов.

    Чтобы сделать это:

    • Импортируйте Excel файл в Access.
    • Используйте функцию экспорта, чтобы создать текстовый файл с необходимыми параметрами.

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

Оцените материал
Добавить комментарий

Капча загружается...