Експортувати таблицю 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.