Експортувати таблицю Excel до текстового файлу фіксованої ширини?


24

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

Чи він також має функціональні можливості, де, з огляду на наявну електронну таблицю, можна експортувати в текстовий файл фіксованої ширини?

Якщо так, то як я можу отримати доступ до цього? Я намагався використовувати Save As і вибирати текстовий файл, але він, схоже, зберігає лише як Tab-розмежування, що не допомагає мені.

Це Excel 2003, якщо це має значення.

Відповіді:


24

Я думаю, що найближчим, що ви можете отримати від нативного функціоналу Excel, є Save As | Форматований текст (пробіл) (* .prn) . Він автоматично визначить ширину і в міру необхідності вставить пробіли, щоб прокладати цю ширину.

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


3
Просто для додання ясності - вона "автоматично" визначатиме ширину на основі ширини, яку ви вказали для своїх стовпців. Хоча зазвичай вимірювання наближаються до ems (наскільки я пам'ятаю), при експорті до фіксованої ширини prn вони приймаються буквально і округляються вниз, щоб дати цілі значення, що використовуються для кількості символів у стовпці файлу prn. Пробіли додаються для прокладки ліворуч або праворуч залежно від вирівнювання у клітинках (тому за замовчуванням цифри будуть прокладені ліворуч, щоб примусити їх праворуч, текст праворуч, щоб примусити ліворуч, але якщо ви змінили вирівнювання, вони будуть різні)
АдамВ

Це робить те, що я шукав. Спасибі!
RationalGeek

1
Зверніть увагу: Форматований текст (.prn) обмежений 240 символами на рядок у
службі

Для того, щоб використовувати макрос, на який вказують iokevins, вам потрібно видалити "& роздільник" з двох місць, де визначено CellText. В іншому випадку це додасть додатковий простір для кожної комірки, що економити як prn не робить.
farrenthorpe

14

Якщо у вас є Office Professional, ви можете відкрити файл Excel в Access, а потім експортувати з доступу. Доступ дозволить вам вказати макет фіксованої ширини експортованого файлу та надасть надзвичайно детальні елементи керування для визначення цих ширин.


Хоча Access може це зробити, так і Excel, про що вимагали.
АдамВ

7
Дякую за голосування, але я подумав, що варто згадати, що в Access є повна версія цієї функції. Excel не дозволяє безпосередньо визначати ширину стовпців, Access робить. Так, ви можете отримати правильні ширини стовпців в Excel, розширившись по ширині стовпців на робочому аркуші, але це біль і тому, що комусь доводиться регулярно створювати файли фіксованої ширини, це не варто часу. Якщо у вас є доступ (який багато людей), є набагато кращий спосіб.
davidcl

Відмінно; дякую за цю альтернативу: o)
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, і ви отримаєте справжню фіксовану ширину.


Це чудово працювало для мене. Також я люблю форматувати все як текст, перш ніж це зробити. Таким чином усі дані залишаються вирівняними при збереженні.
Gary Brunton

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


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Рамхаунд

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.