Экспорт таблицы Excel в текстовый файл с фиксированной шириной?
Excel имеет функцию импорта текстовых файлов с фиксированной шириной, где он представляет диалоговое окно, которое позволяет вам выбрать, где начинаются и заканчиваются поля, которые он помещает в столбцы.
Имеет ли он также функциональность, позволяющую экспортировать данные в существующую электронную таблицу в текстовый файл с фиксированной шириной?
Если так, как я могу получить доступ к этому? Я пытался использовать Сохранить как и выбрать текстовый файл, но кажется, что сохранить только как разделитель табуляции, что мне не помогает.
Это Excel 2003, если это имеет значение.
7 ответов
Я думаю, что самая близкая вы можете получить из нативной функциональности Excel это Сохранить как | Форматированный текст (с пробелами) (*.prn). Он автоматически определит ширину и вставит пробелы для заполнения этой ширины по мере необходимости.
Помимо этого вам нужно иметь макрос или другую надстройку, которая позволит вам сделать больше.
Если у вас есть Office профессиональный, вы можете открыть файл Excel в Access, а затем экспортировать из Access. Доступ позволит вам указать макет с фиксированной шириной для экспортируемого файла и предоставит вам чрезвычайно детальные элементы управления для определения этой ширины.
Вау, я собирался задать этот вопрос сам, но он уже был задан. Все выходные данные буфера обмена 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
Сначала отформатируйте данные как Courier New (или какой-либо другой шрифт фиксированной ширины). Затем сохраните как.prn, и вы получите истинную фиксированную ширину.
Расширяя ответ Джеффа Этвуда, поскольку он не позволил бы мне комментировать там:
Я изменил его макрос, чтобы установить ширину столбца в самую широкую ячейку в этом столбце, чтобы каждый столбец имел собственную ширину. Его макрос нашел только самую широкую ячейку в первом ряду, а затем установил ширину всех столбцов.
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
Это убийца для меня. Также есть несколько вариантов.
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 с этим Я справился с этим довольно легко и быстро - лучше, чем с Excel. В моем случае это было преобразование таблицы.