将Excel电子表格导出为固定宽度的文本文件?


24

Excel具有导入固定宽度文本文件的功能,其中它提供了一个对话框,允许您选择字段的开头和结尾放在列中的位置。

它是否也具有功能,在给定现有电子表格的情况下,您可以导出到固定宽度的文本文件?

如果是这样,我该如何访问它?我尝试过使用“另存为”并选择“文本文件”,但它似乎只保存为制表符分隔,但对我没有帮助。

如果重要的话,这是Excel 2003。

Answers:


24

我认为从本机Excel功能中获得的最接近的是另存为 格式化文本(空格分隔)(* .prn)。它将自动确定宽度并根据需要插入填充到该宽度的空间。

除此之外,你需要一个宏或其他加载项,让你做更多。


3
只是为了增加一些清晰度 - 它将根据您为列指定的宽度“自动”确定宽度。虽然通常测量近似于ems(据我所记),当导出到固定宽度prn时,它们按字面顺序并向下舍入,以给出用于prn文件列中字符数的整数值。根据单元格中的对齐方式添加空格以向左或向右填充(因此默认情况下,数字将在左侧填充以强制它们向右,右侧的文本强制向左,但如果您更改了对齐,则它们将是不同)
AdamV 2010年

这确实做了我想要的。谢谢!
RationalGeek 2010年

1
请注意:格式化文本(.prn)限制为Excel 支持
.microsoft.com

为了使用iokevins指向的宏,你必须从定义了CellText的两个地方删除“&delimiter”。否则,它将为每个单元格添加一个额外的空间,这样可以保存为prn。
farrenthorpe 2015年

14

如果您有Office Professional,则可以在Access中打开Excel文件,然后从Access中导出。Access允许您为导出的文件指定固定宽度的布局,并为您提供极其精细的控件来指定这些宽度。


虽然Access可能会这样做,但Excel也是如此。
AdamV 2010年

7
感谢downvote,但我认为值得一提的是Access具有此功能的完整版本。Excel不允许您直接指定列宽,Access可以。是的,您可以通过在工作表中使用列宽来调整Excel中的正确列宽,但这很痛苦,并且作为必须定期创建固定宽度文件的人不值得花时间。如果你有Access(许多人这样做),那就有更好的方法。
davidcl 2010年

优秀的; 谢谢你的替代选择:o)
iokevins

5

哇,我本来会问这个问题,但已经有人问了。tab默认情况下,所有Excel剪贴板输出都是分隔的。当您具有固定宽度字体但不一定是制表符分隔符支持时,这对于“真实”纯文本输出有点烦人。

无论如何,我找到并修改了一个小的Excel宏,它将当前选中的区域复制为一个简单的固定宽度列ASCII表 - 如下所示:

187712 201 37 0.18   
2525 580 149 0.25   
136829 137 43 0.31   

这是宏代码。要使用它,请确保使用Excel 2007或更高版本时启用Excel选项中的“开发人员”选项卡

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 2013年

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


虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面发生更改,则仅链接答案可能会无效。
Ramhound 2015年

2
@Ramhound - 总的来说,我同意。在这种情况下,我无法在这里复制任何内容。该网站是您粘贴输入数据并获得“Excel格式”输出的地方。如果链接无效,则服务消失。
sancho.s 2015年

这项服务已经感动:senseful.github.io/web-tools/text-table,和源可用:github.com/senseful/web-tools
NGM

这又一次转移到:senseful.github.io/text-table
Chris于

0

它适用于Access开箱即用:https//support.office.com/en-ie/article/export-data-to-a-text-file-f72dfc38-a8a0-4c5b-8c2c-bf2950814140#bmsteps with this我非常容易和快速地管理它 - 比用Excel更好。在我的情况下,它是表的转换。


看起来你已经在错误的问题上发布了你的答案;-)这个问题是询问Excel,而你的答案是谈论Access。同样为了将来的答案:提供参考链接很有用,但您还必须在帖子中包含基本信息
robinCTS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.