Як я можу налаштувати Excel завжди імпортувати всі стовпці файлів CSV у вигляді тексту?


68

Хоча я намагаюся цього уникати, мені інколи доводиться відкривати файл CSV в Excel. Коли я це роблю, він форматує стовпці, що містять цифри, що робить їх марними для моїх цілей. Наскільки я можу сказати, єдиний спосіб запобігти цьому при імпорті - це перейменувати файл, щоб розширення не було .csv і використовувати майстра імпорту, щоб вказати формат кожного стовпця окремо. Для файлів з 50-60 стовпцями це недоцільно.

Оскільки кожна відповідь на це часто задане питання в Інтернеті передбачає або якийсь спосіб перетворення відформатованих чисел назад, коли файл відкриється (що для мене не буде працювати - я хочу вирішити загальну проблему, а не кілька конкретних випадків) або вручну вибираючи тип формату кожного стовпця (що я не хочу робити), я шукаю спосіб встановити глобальну перевагу або стиль таким, щоб усі стовпці всіх відкритих файлів CSV завжди форматувалися як текст. Я також знаю про "бронеавтоматизацію" цифр цитатами, але файли, які я отримую, не приходять таким чином, і я сподівався уникнути необхідності попередньої обробки файлів, щоб Excel не накрутив їх.

Чи є спосіб зробити конкретно це: Завжди форматувати всі стовпці в відкритих файлах CSV в вигляді тексту, без ручного вибору кожного шпальти щоразу , коли під час імпорту?

Я використовую Excel 2003, але я прийму відповіді за 2007 рік, якщо це ви знаєте.


1
Hey Scripting Guy зробив статтю в блозі про імпорт CSV в Excel, яка може мати корисні примхи для вас. Гра з об’єктом даних всередині shellhell може дозволяти вам робити те, що ви хочете. Не опубліковано як відповідь, оскільки це по суті лише посилання на сторону, але це може вам корисно.
Matrix Mole

Відповіді:


7

Це працює:

Sub OpenCsvAsText(ByVal strFilepath As String)

    Dim intFileNo As Integer
    Dim iCol As Long
    Dim nCol As Long
    Dim strLine As String
    Dim varColumnFormat As Variant
    Dim varTemp As Variant

    '// Read first line of file to figure out how many columns there are
    intFileNo = FreeFile()
    Open strFilepath For Input As #intFileNo
    Line Input #intFileNo, strLine
    Close #intFileNo
    varTemp = Split(strLine, ",")
    nCol = UBound(varTemp) + 1

    '// Prepare description of column format
    ReDim varColumnFormat(0 To nCol - 1)
    For iCol = 1 To nCol
        varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
        ' What's this? See VBA help for OpenText method (FieldInfo argument).
    Next iCol

    '// Open the file using the specified column formats
    Workbooks.OpenText _
            Filename:=strFilepath, _
            DataType:=xlDelimited, _
            ConsecutiveDelimiter:=False, Comma:=True, _
            FieldInfo:=varColumnFormat

End Sub

Використання:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Файл, відокремлений комами, тепер відкритий у вигляді листа Excel із усіма стовпцями, відформатованими у вигляді тексту.

Зверніть увагу, що рішення майстра @ Wetmelon працює просто чудово, але якщо ви відкриваєте багато файлів, то, як і я, ви можете втомлюватись кожного разу, прокручуючи до стовпця 60, щоб Shift-Click it.

EDIT @GSerg в коментарі нижче зазначає, що це "не працює" і "їсть пробіли та нулі". Я просто цитую коментар до питання, яке є більш описовим:

З невідомих причин, навіть якщо ви явно надаєте формати для всіх стовпців VBA, Excel буде ігнорувати його, якщо розширення файлу - CSV. Щойно ви зміните розширення, той самий код дасть правильні результати.

Таким чином, код вище "працює", але вбивається цим смішним поведінкою Excel. Яким би способом ви не вирізали, вам застрягло, що потрібно змінити розширення на щось інше, ніж ".csv", вибачте! Після цього ви вдома вільні.


1
Не працює. Їсть простори, їсть провідні нулі тощо
GSerg


1
Використовуваний метод Workbooks.OpenTextмає свої недоліки в дизайні (Дивіться мою відповідь нижче). Використовуйте QueryTablesзамість цього.
nixda

71

Як відкрити CSV в Excel

Хороший спосіб

  • Excel → Дані → Отримати зовнішні дані → Виберіть усі стовпці Shiftта виберіть Текст

    Наверх: трактує всі значення правильно як текст без будь-якого винятку

    Знизу: більше кроків, ніж простий подвійний клацання

Поганий спосіб

  • Відкрити CSV з подвійним кліком або в Excel Відкрити за допомогою діалогу

    Знизу: внутрішній обробник CSV програми Excel неправильно інтерпретує значення з ведучим -чи =знаком як формулою, а не текстом

    Нижня сторона: Ви втратите провідні нулі з двійкових значень, як-от 0001завдяки автоматичному виявленому формату стовпців у форматі Excel

Хороший шлях (для VBA)

  • Використовуйте QueryTables (аналог VBA Get external data) → Приклад коду

    Наверх: трактує всі значення правильно як текст без будь-якого винятку

    Даунсайд: Трохи більше коду , ніж OpenTextметод

Поганий шлях (для VBA)

  • Використовувати Workbooks.OpenTextметод → Приклад коду

    Знизу: Цей метод все ще використовує внутрішній обробник імпорту CSV Excel з усіма його недоліками

    Знизу: Крім того, fieldinfoпараметр OpenTextігнорується, якщо розширення CSV. Зазвичай цей параметр дозволяє вибирати кожен формат стовпців, але не, якщо розширення CSV. Ви можете прочитати більше про цю поведінку на Stack Overflow

    Тимчасове перейменування розширення джерела з CSV в TXT і потім повернення до CSV є дійсним рішенням, якщо ви маєте повний контроль над вихідним файлом

Додаткові методи

  • Якщо у вас є доступ до джерела, яке створює ваш CSV, ви можете змінити синтаксис CSV.
    Укладіть кожне значення подвійними лапками та приставте знак рівності, як-от ="00001"або додайте вкладку до кожного значення. Обидва способи змусять Excel трактувати значення як текст

    Оригінальний вміст CSV
    введіть тут опис зображення

    CSV в Excel при відкритті подвійним клацанням
    введіть тут опис зображення

    Зверніть увагу, як Excel не змінює рядок 2 (метод подвійної цитати) та рядок 3 (метод вкладки)

  • Відкрийте CSV у Блокноті та скопіюйте та вставте всі значення у Excel. Потім використовуйте Дані - Текст у
    нижній частині стовпців : Текст у стовпцях для зміни форматів стовпців від загального списку до тексту дає непослідовні результати. Якщо значення містить -оточені символи (наприклад, "= E1-S1"), Excel намагається розділити це значення на більш ніж один стовпець. Значення, розташовані прямо до цієї комірки, можуть бути перезаписані

    (Поведінка тексту до стовпців було змінено десь між Excel 2007 та 2013, тому вона більше не працює)


Excel надбудова для відкриття CSV та імпорту всіх значень у вигляді тексту

Це плагін Excel для спрощення дій з імпорту CSV.
Основна перевага: це рішення одним клацанням миші та використовує QueryTablesтой самий бронезахисний метод, що забезпечує поза зовнішні дані

  • Він додає нову команду меню в Excel, яка дозволяє імпортувати файли CSV і TXT. Усі значення імпортуються на активний аркуш, починаючи з поточно вибраної комірки
  • Додаток Excel доступний для всіх версій Office у Windows та Mac
  • Усього надбудови лише 35 рядків коду. Перевірте коментований вихідний код, якщо вам цікаво
  • Використовуваний роздільник списку CSV (кома або крапка з комою) взято з локальних налаштувань Excel
  • Кодування встановлено на UTF-8

Установка

  1. Завантажте надбудову та збережіть її у папці надбудови:%appdata%\Microsoft\AddIns
  2. Відкрийте Excel та активуйте надбудову: File tab → Options → Add-Ins → Go Toта виберітьImportCSV.xla
  3. Увімкнути макроси VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Перезапустіть Excel

Ви помітите новий запис рядка меню під назвою Add-Ins, і ви скористаєтеся цією кнопкою для швидкого відкриття файлів CSV, не проходячи клопоту діалогового вікна Імпорт

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


Сценарій PowerShell для відкриття CSV-файлів безпосередньо з Провідника Windows

Ви можете використовувати скрипт PowerShell, щоб відкрити файли CSV та автоматично передати їх у Excel. Сценарій мовчки використовує метод імпорту тексту Excel, який розглядає значення завжди як текст і, як бонус, обробляє кодування UTF-8

  1. Створіть новий текстовий файл та вставте нижченаведений сценарій. Коментовану версію можна знайти тут
$CSVs = @()
$args.ForEach({
    If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
        $CSVs += ,$_
    } 
})

if (-Not $null -eq $CSVs) {

    $excel = New-Object -ComObject excel.application 
    $excel.visible = $true
    $excel.SheetsInNewWorkbook = $CSVs.Count    
    $workbook = $excel.Workbooks.Add()

    for ($i=0; $i -lt $CSVs.Count; $i++){

        $csv = Get-Item $CSVs[$i]
        $worksheet = $workbook.worksheets.Item($i + 1)
        $worksheet.Name = $csv.basename

        $TxtConnector = ("TEXT;" + $csv.fullname)
        $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
        $query = $worksheet.QueryTables.item($Connector.name)
        $query.TextFilePlatform = 65001
        $query.TextFileTextQualifier = 1
        $query.TextFileOtherDelimiter = $Excel.Application.International(5) 
        $query.TextFileParseType  = 1
        $arrFormats = ,2 * $worksheet.Cells.Columns.Count
        $query.TextFileColumnDataTypes = $arrFormats
        $query.AdjustColumnWidth = 1
        $query.Refresh()
        $query.Delete()
    }
}
  1. Збережіть його де - то подобається C:\my\folder\myScript.ps1. (Зверніть увагу на розширення .ps1)
    • Відкрийте свою папку sendto через WinR» shell:sendto» Enter
  2. Створіть новий ярлик за допомогою правої кнопки миші »Новий» Ярлик і вставте цей рядок. Не забудьте змінити шлях на свій, куди ви поставили свій сценарій. Назвіть ярлик, наприклад, Excel

"% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" -NoProfile -NonInteractive -WindowStyle Hidden -File "C: \ my \ folder \ myScript.ps1"

Тепер ви можете вибрати (кілька) CSV-файлів і відкрити їх в Excel через Right-click » SendTo » Excel


1
Надбудова була протестована в Office 2003 та 2013
nixda

Топ "Найкращий спосіб" - це саме те, що мені було потрібно для одноразового імпорту. Не потрібно возитися з VBA і навіть можна контролювати, які стовпці приймаються за дату / числа (а решта - як текст). Я хотів би, що Excel запропонував би відкрити цей майстер імпорту при подвійному клацанні на CSV.
ADTC

@Vadzim Привіт, я вдячний вашим зусиллям, щоб виправити мертві посилання. Дійсно, ge.tt створює деякі проблеми в останні місяці. Але я думаю, що я виправив усі проблеми, і старі оригінальні посилання повинні працювати знову. Я не знаю, чому Google Chrome попереджає, перш ніж завантажувати що-небудь з ge.tt. Але всі інші браузери працюють нормально, і я можу запевнити вас, що вони не є зловмисними програмами
nixda

@nixda, дякую за відродження посилань та за чудову відповідь
Вадим

@nixda Посилання на ge.tt знову порушені. Більшість кажуть, що вони недоступні, оскільки власник порушив TOS. Однак, для OpenCSV.exe йдеться про те, що "ці файли більше не доступні, оскільки вони порушили умови надання послуг". Що змушує мене запитати, ви автор функції ImportMyCSV Excel? (вихідний код все ще доступний на пастібіні) Це дивовижний інструмент - я використовую його на роботі і рекомендував його іншим. Але мене цікавить походження коду, якщо не що інше, як правильно зарахувати автора.
GlennFromIowa

5

Спробуйте спершу відкрити .xlsx, потім створити з'єднання для передачі даних та імпортувати .csv. Виберіть "кома" з обмеженням, а потім виберіть опцію, щоб усі стовпці розглядалися як текст, а не "Загальні".

Редагувати: О, я не повністю прочитав питання. У майстрі імпорту виберіть перший заголовок стовпця, який потрібно імпортувати як текст, перейдіть до остаточного заголовка стовпця та клавішу Shift + клацніть на заголовку. Потім виберіть радіальний варіант «Текст».


2
Так, це працює добре - доки розширення файлу не буде ".csv". +1
Жан-Франсуа Корбетт

4

Пропозиція Wetmelon працює (навіть із .CSV), якщо ви зробите наступне:

  1. Відкрийте Excel до чистої робочої книги або робочого аркуша
  2. Клацніть на Дані> [Отримати зовнішні дані] з тексту
  3. Використовуйте "Майстер імпорту тексту", як описано Wetmelon (Розміщено кому, виберіть перший стовпець, SHIFT + КЛАЦНУЙ останній стовпець, встановіть усе на Text).

Я знаю, що це більше кроків, але принаймні це дозволяє мені відкривати CSV таким чином, не змінюючи розширення


2

Стережись!

Під час використання ручного методу "Excel → Дані → Отримати зовнішні дані → Виберіть усі стовпці та виберіть Текст" ......

Це дозволить встановити лише стовпці з текстом ", які містять дані в першому рядку" (зазвичай це заголовок). Цей майстер не показує вам стовпці, розташовані далі праворуч, які можуть мати дані далі нижче, але не в першому рядку. Наприклад:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Ви ніколи не побачите Col 4 в майстрі імпорту, тому перед імпортом ви не отримаєте можливість змінити його із загального на текстовий формат !!!!


1
Хороше попередження, оскільки 99,9999% часу люди не прокручуються вниз в майстрі імпорту, і навіть тоді важко вловити всі стовпці. Однак технічно ви можете прокручувати вниз, працюючи в майстрі імпорту, і вловлювати додаткові стовпці, які не мають даних у першому рядку.
GlennFromIowa

1

Ось альтернативна процедура коду, розміщена вище Жаном-Франсуа Корбеттом

Ця процедура імпортує CSV-файл у Excel із усіма стовпцями, відформатованими у вигляді тексту

Public Sub ImportCSVAsText()
    Dim TempWorkbook As Workbook
    Dim TempWorksheet As Worksheet
    Dim ColumnCount As Integer
    Dim FileName As Variant
    Dim ColumnArray() As Integer

    'Get the file name
    FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)

    If FileName = False Then Exit Sub

    Application.ScreenUpdating = False

    'Open the file temporarily to get the count of columns
    Set TempWorkbook = Workbooks.Open(FileName)
    ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    TempWorkbook.Close SaveChanges:=False

    'Resize the array to number of columns
    ReDim ColumnArray(1 To ColumnCount)

    For i = 1 To ColumnCount
        ColumnArray(i) = xlTextFormat
    Next i

    Set TempWorkbook = Workbooks.Add
    Set TempWorksheet = TempWorkbook.Sheets(1)

    Application.DisplayAlerts = False
    TempWorkbook.Sheets(2).Delete
    TempWorkbook.Sheets(2).Delete
    Application.DisplayAlerts = True

    With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = ColumnArray
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub

Ласкаво просимо до SuperUser, замість того, щоб додавати нову відповідь, ви мали б відредагувати відповідь Корбетта та вдосконалити її. Я усвідомлюю, що у вас ще недостатньо репутації для цього, але ви можете зв’язати свої зміни у коментарі, коли ви попросите його прочитати.
Властиміл Овчачик

0

Якщо ви завжди імпортуєте одні й ті самі дані (постійний формат запису, макет тощо), ви можете написати макрос Access за допомогою специфікації імпорту, а потім скинути дані назад у Excel. Зробити це може раз. Інший спосіб, який я це зробив, - це використовувати VBA і читати дані на робочому аркуші по одному запису за раз та аналізувати їх під час читання. Наскільки я знаю, немає можливості встановити формат за замовчуванням під час імпорту в Excel, і навіть якщо ви могли, це спричинить проблеми з наступним типом файлу, який ви намагаєтеся проаналізувати.


1
Ось у чому річ - я не намагаюся робити будь-який аналіз, за ​​винятком того, щоб вставити текстовий рядок, який знаходився між комами, у стовпці, коли я імпортую його. Якщо мені потрібно, щоб воно було певним чином відформатоване, я можу це зробити (наприклад, робити дати рядків дати тощо), але мені просто потрібні дані, що залишаються спочатку. Чому це повинно бути таким важким?
Вільям Ганн

0

Як запит, надішліть мій коментар як відповідь (з додаванням трохи більше інформації):

Hey Scripting Guy зробив статтю в блозі про імпорт CSV в Excel, яка може мати корисні примхи для вас. Гра з об’єктом даних всередині shellhell може дозволяти вам робити те, що ви хочете.

Хоча стаття конкретно згадує про імпорт даних у комірки, які можуть залишити формат чисел, можливо, можливо пограти з деякими властивостями та методами Excel ComObject, щоб змусити дані замість цього вводити клітинки як вихідний текст (або примушувати форматування комірок у текст до або після імпорту).


0

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

Деякі варіанти:

  • Створіть запит на імпорт даних, як пропонує Wetmelon .
    Недолік: можливо, вам не вистачає драйверів баз даних CSV на 64-бітній машині.

  • Використовуйте код Жана , але включіть копіювання файлу у тимчасову папку та зміну розширення копії.
    Недолік: немає посилання на вихідний файл (збереження перезаписує копію); після цього доведеться видалити копію вручну. Тим не менш, ви можете вручну Зберегти як над початковим CSV.

  • Відкрийте CSV в Блокноті Ctrl+A, Ctrl+Cвставте в Excel, то дані - Текст в колонки, то це звичайний майстер , де ви можете задати всі стовпці в текст на одному диханні. Це інший аромат попереднього варіанту, оскільки він також приховує дорогоцінне продовження від Excel.
    Недолік: посібник.

  • Майте дуже простий цикл VBA, який читає весь файл в пам'ять і кладе його на аркуш, комірку за коміркою.
    Недолік: повільніше, негарніше.


Хіба "Немає посилання на оригінальний файл [CSV]" є недоліком усіх цих методів? Мені подобається ідея скопіювати в темп-папку та змінити там розширення ... Можна навіть перезаписати оригінал (як CSV), як тільки копія відкриється.
Жан-Франсуа Корбетт

@ Jean-FrançoisCorbett, я весь час використовую Майстер імпорту, щоб імпортувати .csv файли з розширенням csv в Excel 2010. Я чітко вказую формат стовпців як Text, і він зберігає формат комірки як текст. Можливо, це було проблемою зі старими версіями Excel?
GlennFromIowa

-2

Якщо я правильно розумію питання, це легко вирішити за допомогою параметра Transpose у програмі Paste-Special, як описано тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.