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

125828
RationalGeek

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

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

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

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

22

7 ответов на вопрос

23
squillman

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

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

Просто для большей ясности - он будет «автоматически» определять ширину на основе ширины, которую вы указали для своих столбцов. Хотя обычно измерения приближаются к ems (насколько я помню), при экспорте в фиксированную ширину prn они берутся буквально и округляются в меньшую сторону, чтобы получить целочисленные значения, используемые для количества символов в столбце файла prn. Для отступа добавляются пробелы, влево или вправо, в зависимости от выравнивания в ячейках (поэтому по умолчанию числа будут дополнены слева, чтобы заставить их вправо, текст справа - для выравнивания влево, но если вы изменили выравнивание, они будут разные) AdamV 14 лет назад 3
Это делает то, что я искал. Спасибо! RationalGeek 14 лет назад 0
Обратите внимание: форматированный текст (.prn) ограничен 240 символами на строку в Excel. Http://support.microsoft.com/kb/249885 iokevins 11 лет назад 1
Чтобы использовать макрос, на который указывает iokevins, вы должны удалить «& delimiter» из двух мест, где определен CellText. В противном случае, это добавит дополнительное пространство для каждой ячейки, что не делает сохранение как prn. farrenthorpe 8 лет назад 0
12
davidcl

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

В то время как Access мог бы сделать это, Excel также сделает то, о чем просили. AdamV 14 лет назад 0
Спасибо за отрицательный отзыв, но я подумал, что стоит упомянуть, что в Access есть полная версия этой функции. Excel не позволяет напрямую указывать ширину столбцов, а Access. Да, вы можете получить правильную ширину столбцов в Excel, немного поигравшись с шириной столбцов на рабочем листе, но это трудная задача, и для тех, кому приходится регулярно создавать файлы фиксированной ширины, это не стоит времени. Если у вас есть доступ (что делают многие), есть гораздо лучший способ. davidcl 14 лет назад 6
Отлично; спасибо за эту альтернативу: о) iokevins 11 лет назад 0
5
Jeff Atwood

Вау, я собирался задать этот вопрос сам, но он уже был задан. Все выходные данные буфера обмена 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
dkusleika

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

Это отлично сработало для меня. Мне также нравится форматировать все как текст, прежде чем я это сделаю. Таким образом, все данные остаются выровненными при сохранении. Gary Brunton 11 лет назад 0
2
Peter

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

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

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
sancho.s

This is a killer for me. It has a few options as well.

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

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы. Ramhound 8 лет назад 0
@Ramhound - В общем, я согласен. Но в этом случае я ничего не могу скопировать здесь. Этот веб-сайт - это место, где вы вставляете свои входные данные и получаете вывод в формате «Excel». Если ссылка становится недействительной, то служба исчезла. sancho.s 8 лет назад 2
Служба перемещена: https://senseful.github.io/web-tools/text-table/, а источник доступен по адресу: https://github.com/senseful/web-tools ngm 7 лет назад 0
Который снова переехал в: https://senseful.github.io/text-table/ Chris 6 лет назад 0
0
Alex

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

Похоже, вы разместили свой ответ на неправильный вопрос ;-) Этот вопрос задает вопрос об Excel, а ваш ответ - о доступе. Также для будущих ответов: Предоставление ссылки для справки полезно, но вы также должны [включить необходимую информацию] (// meta.stackoverflow.com/q/8259) в сообщение. robinCTS 5 лет назад 0