Сохранение файла Excel в формате .txt без кавычек

У меня есть лист Excel с данными в столбце A. В ячейках много специальных символов. Когда я сохраняю лист в формате .txt, я получаю кавычки в начале каждой строки. Я пробовал как вручную, так и с помощью макроса сохранить файл в формате .txt, почему это так? Как их убрать? Я не могу удалить цитаты. Прикрепление рисунка   введите описание изображения здесь


person ankit agrawal    schedule 16.07.2012    source источник
comment
Я предположил, что вы, должно быть, сохраняете лист с разделителями-запятыми. Возможно, тот, кто проголосовал за закрытие вопроса, предположил то же самое. Однако, сохранив листы с разделителями табуляции, я могу подтвердить, что Excel помещает ненужные кавычки вокруг значений, содержащих запятые. Мое единственное решение - построить строки с помощью VBA, что было бы медленным подходом.   -  person Tony Dallimore    schedule 16.07.2012
comment
Могу я сэкономить время, сказав, что Excel помещает ячейку в кавычки, если в ячейке есть запятые (а также, если в ячейке уже есть кавычки). Решение с галочкой - единственное, которое работает, потому что популярное решение в конце, предлагающее использовать формат файла xlTextPrinter, перемещает все вокруг, чтобы представить его как пригодное для печати, что включает в себя усечение столбцов (например, потерю текста), перемещение текста страницы в конец и т. Д. .   -  person www-0av-Com    schedule 24.01.2018


Ответы (8)


Попробуйте этот код. Делай то, что хочешь.

ЛОГИКА

  1. Сохраните файл как файл с разделителями табуляции во временном каталоге пользователя.
  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

СНИМКИ

Фактическая рабочая книга

введите описание изображения здесь

После сохранения

введите описание изображения здесь

person Siddharth Rout    schedule 16.07.2012
comment
@ankitagrawal: см. дополнительный ответ ниже. если пробелы являются подходящими разделителями, вы можете обойтись встроенной функциональностью Excel - person nicholas; 26.07.2012
comment
приведенный выше код оставляет временный файл, который можно очистить чем-то вроде этого With New FileSystemObject If .FileExists(yourFilePath) Then .DeleteFile yourFilepath End If End With - person ekkis; 14.05.2015
comment
Вы также можете удалить этот файл, используя Kill tmpFile с OERN @ekkis - person Siddharth Rout; 14.05.2015
comment
@ekkis: OERN: при ошибке продолжить дальше :) - person Siddharth Rout; 15.05.2015
comment
Один вопрос по этому коду. Обратите внимание на две пустые строки в конце текстового файла? Один из них связан с разницей в верхней и нижней границах (от 0 до количества используемых строк в Excel, а не от 1 до количества используемых строк в Excel). Другой наиболее вероятно, что когда вы пишете в новый файл, строка заканчивается на vbCrLf. Как я могу изменить ваш код, чтобы удалить последний vbCrLf? Я изменил это, чтобы удалить одну из пустых строк (для i = LBound (strData) To UBound (strData) -1) - person mooseman; 12.08.2015
comment
@mooseman: см. Это есть и другие примеры. Просто введите vb6 remove last blank line from text file в Google - person Siddharth Rout; 13.08.2015

Я вижу, что на этот вопрос уже дан ответ, но я хотел предложить альтернативу на случай, если кто-то еще найдет это позже.

В зависимости от необходимого разделителя это можно сделать без написания кода. Исходный вопрос не дает подробностей о желаемом типе вывода, но вот альтернатива:

Тип файла PRN

Самый простой вариант - сохранить файл как «Форматированный текст (с разделителями-пробелами)». Строка кода VBA будет выглядеть примерно так:

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

В Excel 2007 это приведет к раздражающему добавлению расширения файла .prn в конце имени файла, но его можно изменить на .txt, переименовав вручную.

В Excel 2010 вы можете указать любое расширение файла в диалоговом окне «Сохранить как».

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

Наблюдать:

Снимок экрана Excel

Становится:

Скриншот текста

person nicholas    schedule 26.07.2012
comment
Спасибо за это. Ширина столбца сбила меня с толку, когда я пытался разобраться в этом самостоятельно, но ваши подробные записи позволили мне спасти усилия! - person Jason R. Escamilla; 18.10.2015
comment
В Excel 2010 при сохранении в .html я был ограничен примерно 255 символами в строке до получения непредсказуемых результатов. - person Jason R. Escamilla; 11.12.2015
comment
Работает, НО если размер ваших ячеек превышает ширину распечатки, они будут перемещены в нижнюю часть страницы и нарушат ваши данные. - person TadLewis; 06.04.2018

Эммм, как насчет этого.

Скопируйте ячейки.
Откройте Блокнот.
Вставьте.

Не ищите кавычек, кавычек и запятых, а также сохраните специальные символы, это то, что запрашивал OP. Это также обозначено возвратом каретки, как и прикрепленный рисунок, который OP не упомянул как плохой вещь (или хорошая вещь).

Не совсем уверен, почему простой ответ, который дает желаемые результаты, дает мне отрицательную оценку.

person Eric Gross    schedule 19.03.2014
comment
было бы лучше предложить не ручное решение. ручные решения дорогостоящие и не совсем решения - person ekkis; 28.03.2015
comment
У меня это не работает. Это все еще цитируется в Блокноте. - person shazbot; 07.07.2015
comment
Я не понимаю, почему этот ответ получил отрицательные голоса. Это простое решение, соответствующее моим потребностям. - person Nikos Tsokos; 07.06.2016
comment
Это не больше ручного труда, чем сохранение файла XLS или XLSX в виде файла .txt из Excel. Это простой выбор столбца, копирование и вставка в новый файл .txt в Блокноте. Занимает намного меньше времени, чем так называемые автоматизированные решения. Вот как мы их создаем, когда они нам время от времени нужны для нашего интерфейса загрузки ADP. Это очень просто, и это работает. Это также общепринятое решение на других форумах, например здесь: superuser.com/questions/206060/ - person Jim; 07.10.2016
comment
Я поддержал его, этот ответ был очень простым и работал нормально. - person Brandon Spilove; 06.03.2017
comment
Не дает желаемых результатов - цитаты все равно получаются в блокноте. - person gatinueta; 17.05.2018

Я просто потратил на это большую часть дня

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

Второй - 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

Конечная функция

person asdf30    schedule 11.03.2014

ответ от этот вопрос дает гораздо более простой ответ на этот вопрос.

Запись - это специальный оператор, предназначенный для создания машиночитаемых файлов, которые позже используются с Вводом.

Используйте Печать, чтобы не возиться с данными.

Спасибо пользователю GSerg

person timclancy    schedule 01.10.2018

У меня та же проблема: мне нужно сделать специальный файл .txt для банковских платежей из файла excel. Файл .txt не должен быть разделен какими-либо символами, потому что стандарт требует определенного количества запятых после каждого обязательного поля. Самый простой способ сделать это - скопировать контекст файла Excel и вставить его в блокнот.

person Vali Ploiesti    schedule 25.02.2015

Я использовал 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
person Yain Patel    schedule 11.03.2020
comment
Спасибо. Печатайте, а не пишите работает. Здесь нет необходимости во всех других более длинных кодах. - person Blaisem; 28.06.2020

Решение PRN работает только для простых данных в ячейках, для меня оно вырезает только первые 6 знаков из 200-символьной ячейки.

Это основные форматы файлов в Excel 2007-2016. Примечание. В Excel для Mac значения равны +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 FileFormat

Помните о других FileFormatNumbers для метода SaveAs:

FileExtStr = ".csv": FileFormatNum = 6
FileExtStr = ".txt": FileFormatNum = -4158
FileExtStr = ".prn": FileFormatNum = 36
person Krzysztof Gapski    schedule 06.06.2018