Вопрос или проблема
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)))
Где вам нужно заменить
- A1 на ячейку, которую вы хотите дополнить справа
- 2 на количество пробелов, с которыми вы хотите разделить два последовательных столбца
- A$1:A$10 на ссылку на столбец в контексте.
Ответ или решение
Экспорт данных из Excel в текстовый файл фиксированной ширины может быть необходим для различных целей, включая интеграцию с другими системами или создание отчётов. В данном ответе мы рассмотрим возможности Excel 2003 для выполнения этой задачи и предоставим подробные инструкции.
Варианты экспорта в текстовый файл фиксированной ширины
-
Использование формата PRN:
Excel 2003 предоставляет возможность экспортировать данные в формате PRN (форматированный текст с пробелами). Вот шаги для осуществления этого метода:- Откройте свою таблицу в Excel.
- Перейдите в меню "Файл" и выберите "Сохранить как".
- В поле "Тип файла" выберите *Форматированный текст (разделенный пробелами) (.prn)**.
- Сохраните файл. Excel автоматически определит ширину полей и добавит пробелы для соответствия.
Обратите внимание, что этот метод может недостаточно точно соответствовать вашим требованиям по фиксированной ширине, так как Excel сам определяет ширину полей.
-
Использование макросов 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
). - Вставьте приведённый код в новый модуль.
- Выполните макрос, чтобы скопировать отформатированные данные в буфер обмена.
- Откройте редактор Visual Basic (нажмите
-
Использование Microsoft Access:
Если у вас установлен Microsoft Access (обычно входит в состав Office Professional), вы можете открыть таблицу в Access и использовать функцию экспорта для создания текстового файла фиксированной ширины с более точной настройкой ширины столбцов.Чтобы сделать это:
- Импортируйте Excel файл в Access.
- Используйте функцию экспорта, чтобы создать текстовый файл с необходимыми параметрами.
В заключение, несмотря на то, что Excel 2003 не предоставляет прямой возможности экспорта в фиксированный текстовый файл, предлагаемые методы позволят вам обойти это ограничение. Выберите подходящий вариант в зависимости от ваших требований к формату и точности.