将Excel文件保存为无引号的.txt格式

18

我有一个Excel工作表,在A列中有许多包含特殊字符的单元格。当我将该工作表保存为.txt格式时,每行开头会出现引号。我尝试了手动和宏方式保存文件为.txt格式,但问题依旧存在。为什么会这样?如何去除它们? 我无法删除这些引号。 附上一张图片 enter image description here


我猜你一定是用逗号分隔符保存工作表。也许投票关闭问题的人也是这么认为的。然而,我曾经使用制表符分隔符保存工作表,可以证实Excel会在包含逗号的值周围添加不必要的引号。我的唯一解决方案是使用VBA构建行,但这将是一个缓慢的方法。 - Tony Dallimore
我可以为大家节省一些时间,因为Excel会在单元格中包含逗号(以及如果单元格已经有引号)时将其放入引号中。打勾的解决方案是唯一可行的,因为最后提出的流行解决方案建议使用文件格式xlTextPrinter,这会将所有内容移动到可打印的位置,包括截断列(即:丢失文本),将页面外的文本移到末尾等。 - www-0av-Com
8个回答

19

我看到这个问题已经得到了回答,但是想提供一个替代方案,以防后来的某个人发现它有用。

根据所需的分隔符,可以不编写任何代码实现这一点。原始问题没有给出所需输出类型的详细信息,但是这里有一个替代方案:

PRN 文件类型

最简单的选择是将文件保存为“格式化文本(空格分隔)”类型。VBA 代码行类似于此:

ActiveWorkbook.SaveAs FileName:=myFileName, FileFormat:=xlTextPrinter, CreateBackup:=False

在Excel 2007中,这将令文件名末尾带有annoyingly的.prn文件扩展名,但可以通过手动重命名更改为.txt。

在Excel 2010中,您可以在另存为对话框中指定任何文件扩展名。

需要注意的一点是:文本文件中使用的分隔符数量与Excel列的宽度有关。

观察:

Excel Screenshot

变成:

Text Screenshot


1
谢谢你。当我试图自己解决问题时,列宽让我感到困惑,但是你详细的笔记让我挽救了这个努力! - Jason R. Escamilla
在Excel 2010中,保存为.html时,每行字符数限制在大约255个字符左右,否则会出现不可预测的结果。 - Jason R. Escamilla
4
如果您的单元格跨度超过打印页面的宽度,它们将被移动到页面底部并干扰您的数据。 - TadLewis

12

这段代码能实现您所需的功能。

逻辑

  1. 将文件保存为制表符分隔的文件(TAB delimited File)并保存到用户临时目录中。
  2. 一次性读取文本文件。
  3. 同时将""替换为空格,并写入新文件。

代码

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Const MAX_PATH As Long = 260

'~~> Change this where and how you want to save the file
Const FlName = "C:\Users\Siddharth Rout\Desktop\MyWorkbook.txt"

Sub Sample()
    Dim tmpFile As String
    Dim MyData As String, strData() As String
    Dim entireline As String
    Dim filesize As Integer
    
    '~~> Create a Temp File
    tmpFile = TempPath & Format(Now, "ddmmyyyyhhmmss") & ".txt"
    
    ActiveWorkbook.SaveAs Filename:=tmpFile _
    , FileFormat:=xlText, CreateBackup:=False
    
    '~~> Read the entire file in 1 Go!
    Open tmpFile For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1
    strData() = Split(MyData, vbCrLf)
    
    '~~> Get a free file handle
    filesize = FreeFile()
  
    '~~> Open your file
    Open FlName For Output As #filesize
    
    For i = LBound(strData) To UBound(strData)
        entireline = Replace(strData(i), """", "")
        '~~> Export Text
        Print #filesize, entireline
    Next i
    
    Close #filesize
    
    MsgBox "Done"
End Sub

Function TempPath() As String
    TempPath = String$(MAX_PATH, Chr$(0))
    GetTempPath MAX_PATH, TempPath
    TempPath = Replace(TempPath, Chr$(0), "")
End Function

快照

实际工作簿

enter image description here

保存后

enter image description here


@ankitagrawal:请查看下面的附加答案。如果空格足够作为分隔符,您可以使用Excel的内置功能。 - nicholas
上述代码会留下临时文件,可以使用以下代码进行清理:With New FileSystemObject If .FileExists(yourFilePath) Then .DeleteFile yourFilepath End If End With - ekkis
您也可以使用 Kill tmpFile 命令来删除该文件,OERN @ekkis。 - Siddharth Rout
1
@ekkis:OERN:继续执行下一个错误 :) - Siddharth Rout
这段代码有一个问题。注意文本文件末尾的两个空行?其中一个是由于上下限差异(0到Excel使用的行数,而不是1到Excel使用的行数)。另一个可能是当您写入新文件时,该行以vbCrLf结尾。我该如何修改您的代码以删除最后一个vbCrLf?我将其更改为删除其中一个空行(For i = LBound(strData) To UBound(strData) -1)。 - mooseman
@mooseman: 参见 这里 ,还有其他的例子。只需在 Google 中输入“vb6 remove last blank line from text file”即可。 - Siddharth Rout

10

你可以尝试以下步骤:

复制你的单元格。
打开记事本。
粘贴。

注意没有引号、没有反引号,并保留特殊字符,这正是OP所要求的。 它也由回车符分隔,就像OP没有将其列为不好的事情(或好的事情)一样。

我真的不确定为什么一个简单的答案,可以提供所需的结果,会给我带来负面评价。


4
建议采用非手动解决方案更好。手动解决方案成本高且并非真正的解决方案。 - ekkis
3
这对我不起作用。在记事本中仍然是引用的。 - shazbot
我不明白为什么这个答案会被负评。它是一个简单的解决方案,符合我的需求。 - Nikos Tsokos
这并不比在Excel中将XLS或XLSX文件保存为.txt文件手动。只需简单地选择列,复制并粘贴到记事本中的新.txt文件即可。比所谓的自动化解决方案节省了大量时间。这是我们偶尔需要为ADP上传接口创建它们的方式。它非常简单且有效。这也是其他论坛中被接受的解决方案,例如这里: http://superuser.com/questions/206060/saving-a-tab-separated-file-in-excel-without-quotes - Jim
1
我点赞了,这个答案非常简单且有效。 - Brandon Spilove
它没有提供期望的结果 - 我仍然在记事本中得到引号。 - gatinueta

2
这篇答案来自这个问题,更简单地回答了这个问题。

Write是一种特殊的语句,旨在生成机器可读的文件,稍后使用Input进行消耗。

使用Print可以避免与数据的任何操作。

感谢用户GSerg


2

我刚刚花了一整个下午来完成这个任务。

写入文件有两种常见的方法,第一种是直接访问文件的"write"语句。这会添加引号。

第二种是使用"ActiveWorkbook.SaveAs"或"ActiveWorksheet.SaveAs",它们都有一个非常糟糕的副作用,就是更改活动工作簿的文件名。

这里的解决方案是我在网上找到的几个解决方案的混合体。基本上做到了以下几点: 1)将选定的单元格复制到一个新的工作表中 2)逐个遍历每个单元格,并将其“打印”到打开的文件中 3)删除临时工作表。

该函数适用于选定的单元格,并接受一个字符串作为文件名或提示输入文件名。

Function SaveFile(myFolder As String) As String
tempSheetName = "fileWrite_temp"
SaveFile = "False"

Dim FilePath As String
Dim CellData As String
Dim LastCol As Long
Dim LastRow As Long

Set myRange = Selection
'myRange.Select
Selection.Copy

'Ask user for folder to save text file to.
If myFolder = "prompt" Then
    myFolder = Application.GetSaveAsFilename(fileFilter:="XML Files (*.xml), *.xml, All Files (*), *")
End If
If myFolder = "False" Then
    End
End If

Open myFolder For Output As #2

'This temporarily adds a sheet named "Test."
Sheets.Add.Name = tempSheetName
Sheets(tempSheetName).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

LastCol = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

For i = 1 To LastRow
    For j = 1 To LastCol
        CellData = CellData + Trim(ActiveCell(i, j).Value) + "   "
    Next j

    Print #2, CellData; " "
    CellData = ""

Next i

Close #2

'Remove temporary sheet.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'Indicate save action.
MsgBox "Text File Saved to: " & vbNewLine & myFolder
SaveFile = myFolder

结束函数


1
我有同样的问题:我需要从Excel文件中生成一个特定的用于银行付款的.txt文件。该.txt文件不能由任何字符分隔,因为标准要求在每个必填字段后面有一定数量的逗号。最简单的方式是将Excel文件的内容复制并粘贴到记事本中。

1
我之前使用的是Write #1 "Print my Line",现在我尝试使用Print #1, "Print my Line",它会将所有数据输出而不包含默认的引号(")。
Dim strFile_Path As String
strFile_Path = ThisWorkbook.Path & "\" & "XXXX" & VBA.Format(VBA.Now, "dd-MMM-yyyy hh-mm") & ".txt"
Open strFile_Path For Output As #1

Dim selectedFeature As String

For counter = 7 To maxNumberOfColumn

        selectedFeature = "X"
        Print #1, selectedFeature
        'Write #1, selectedFeature

Next counter
Close #1

谢谢。使用“print”代替“write”即可。这里不需要其他更长的代码。 - Blaisem

0

PRN解决方案仅适用于单元格中的简单数据,对我来说,它只从200个字符单元格中剪切前6个符号。

这些是Excel 2007-2016中的主要文件格式, 注意:在Mac上的Excel中,值为+1

51 = xlOpenXMLWorkbook (without macro's in 2007-2016, xlsx)
52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2016, xlsm)
50 = xlExcel12 (Excel Binary Workbook in 2007-2016 with or without macro's, xlsb)
56 = xlExcel8 (97-2003 format in Excel 2007-2016, xls)

XlFileFormat 文件格式 属性

记住其他 SaveAs 方法 的文件格式编号:

FileExtStr = ".csv": FileFormatNum = 6
FileExtStr = ".txt": FileFormatNum = -4158
FileExtStr = ".prn": FileFormatNum = 36

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接