Остановить автоматическое преобразование определенных текстовых значений в даты в Excel

кто-нибудь знает, есть ли токен, который я могу добавить в свой csv для определенного поля, чтобы Excel не пытался преобразовать его в дату?

Я пытаюсь написать .csv-файл из моего приложения, и одно из значений выглядит достаточно похожим на дату, что Excel автоматически преобразует его из текста в дату. Я попытался поместить все мои текстовые поля (включая тот, который выглядит как дата) в двойные кавычки, но это не имеет никакого эффекта.

30 ответов


Я обнаружил, что, поставив " = " перед двойными кавычками, вы достигнете того, чего хотите. Это заставляет данные быть текстом.

например. ="2008-10-03",="текст"

EDIT (согласно другим сообщениям) из-за ошибка Excel 2007, отмеченная Jeffiekins нужно использовать решение, предложенное Эндрю: "=""2008-10-03"""


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

проблема не только в времени в текстовых полях, но что-нибудь числовое также преобразуется из текста в числа. Несколько примеров, где это проблематично:

  • почтовые коды
  • номера телефонов
  • правительственные идентификационные номера

что иногда can начните с одного или нескольких нулей (0), которые выбрасываются при преобразовании в числовые. Или значение содержит символы, которые можно спутать с математическими операторами (как в dates: /, -).

два случая, которые я могу придумать, что решение " prepending =", как упоминалось ранее,может быть не идеально is

  • где файл может быть импортирован в программу, отличную от MS Excel (функция слияния почты MS Word приходит на ум),
  • где человеческая читаемость может быть важна.

мой хак, чтобы обойти эту

Если один pre / добавляет нечисловой и / или не-дата символ в значение, значение будет распознано как текст и не преобразуется. Непечатаемый символ будет хорош, поскольку он не изменит отображаемое значение. Однако простой старый символ пробела (\s, ASCII 32) не работает для этого, поскольку он прерывается Excel, а затем значение все еще преобразуется. но существуют различные другие печатные и непечатные символы пробела, которые будут работать хорошо. проще это добавить (добавить после) символ простой вкладки (\t, ASCII 9).

преимущества такого подхода:

  • доступный от клавиатуры или с легк-к-вспомните Код ASCII (9),
  • это не беспокоит ввоз,
  • обычно не беспокоит результаты слияния (в зависимости от макета шаблона - но обычно он просто добавляет широкое пространство в конце строки). (Если это, однако, проблема, посмотрите на другие символы, например, пространство нулевой ширины (ZWSP, Unicode U+200B)
  • не является большой помехой при просмотре CSV в блокноте (etc),
  • и может быть удален с помощью find / replace в Excel (или блокнот и т. д.).
  • не нужно импорт CSV, но можно просто дважды щелкнуть по открыть CSV в Excel.

Если есть причина, по которой вы не хотите использовать вкладку, найдите в таблице Unicode что-то еще подходящее.

другой вариант

может быть для создания XML-файлов, для которых определенный формат также принимается для импорта более новыми версиями MS Excel, и который позволяет гораздо больше возможностей подобный. Формат XLS, Но у меня нет опыта с этим.

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


дополнение

нужно сказать, что более новые версии (2013+) MS Excel больше не открывают CSV в формате электронных таблиц - еще один speedbump в своем рабочем процессе делает Excel менее полезным... По крайней мере, существуют инструкции, как его обойти. См., например, это Stackoverflow:Как правильно отобразить .csv-файлы в Excel 2013? .


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

"May 16, 2011"

to

"=""May 16, 2011"""

У меня была аналогичная проблема, и это обходной путь, который помог мне без необходимости редактировать содержимое файла csv:

Если у вас есть возможность задать имя файла, отличное от ".csv", вы можете назвать его ".расширение" txt", например " Myfile.txt " или " Myfile.csv.формат txt." Затем, когда вы откроете его в Excel (не перетаскиванием, а с помощью File->Open или списка последних используемых файлов), Excel предоставит вам "мастер импорта текста".

на первой странице в Мастере выберите "Delimited" для типа файла.

на второй странице мастера выберите", " в качестве разделителя, а также выберите квалификатор текста, если вы окружили свои значения кавычками

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

надеюсь, это поможет вам или кому-то с подобной проблемой!


предупреждение: Excel ' 07 (по крайней мере) имеет ошибку (nother): если в содержимом поля есть запятая, она не анализирует ="поле, содержимое" правильно, а помещает все после запятой в следующее поле, независимо от кавычек.

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

Это может означать, что есть некоторые поля, которые невозможно представить точно "правильно" в Excel, но теперь я верю, что никто не слишком удивлен.


при создании строки для записи в мой CSV-файл на C# мне пришлось отформатировать ее следующим образом:

"=\"" + myVariable + "\""

в Excel 2010 откройте новый лист. На ленте данных нажмите кнопку "Получить внешние данные из текста". Выберите CSV-файл и нажмите кнопку "Открыть". нажимать далее." Снимите флажок "Tab", установите флажок рядом с" запятой", затем нажмите"Далее". Щелкните в любом месте первого столбца. Удерживая клавишу shift, перетащите ползунок до щелчка в последнем столбце, затем отпустите клавишу shift. Нажмите переключатель "текст", затем нажмите"Готово"

все столбцы будут импортированы как текст, так же, как они были в CSV-файле.


все еще проблема в выпуске Microsoft Office 2016, довольно тревожная для тех из нас, кто работает с именами генов, такими как MARC1, MARCH1, SEPT1 и т. д. Решение, которое я нашел, является наиболее практичным после генерации ".csv " файл в R, который затем будет открыт / совместно с пользователями Excel:

  1. откройте файл CSV в виде текста (Блокнот)
  2. скопируйте его (ctrl+a, ctrl+c).
  3. вставьте его в новый лист excel-все это будет вставляться в один столбец как длинный текст веревка.
  4. - > выбрать этот столбец.
  5. перейти к данным - " текст в столбцы...", в открывшемся окне выберите "delimited" (далее). Убедитесь, что" запятая " отмечена (пометка уже покажет разделение данных на столбцы ниже) (Далее), в этом окне вы можете выбрать нужный столбец и пометить его как текст (вместо общего) (готово).

HTH


вот простой метод, который мы используем на работе здесь при создании файла csv в первую очередь, он немного меняет значения, поэтому он не подходит во всех приложениях:

добавьте пробел ко всем значениям в csv

Это пространство будет удалено excel из таких чисел, как" 1"," 2.3 " и " -2.9e4", но останется на датах, таких как "01/10/1993" и логические значения, такие как "TRUE", останавливая их преобразование во внутренние типы данных excel.

Это также останавливает двойные кавычки при чтении, поэтому надежный способ сделать текст в csv неизменным excel, даже если какой-то текст, например "3.1415", должен окружать его двойными кавычками и добавлять всю строку пробелом, т. е. (используя одинарные кавычки, чтобы показать, что вы наберете) ' "3.1415"'. Тогда в excel у вас всегда есть исходная строка, за исключением того, что она окружена двойными кавычками и дополнена пробелом, поэтому вам нужно учитывать их в любых формулах и т. д.


(Предполагая Excel 2003...)

при использовании мастера "текст-столбцы" на Шаге 3 Вы можете диктовать тип данных для каждого из столбцов. Нажмите на столбец в предварительном просмотре и измените столбец "плохое поведение" с "общего" на "текст"."


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

изменить .csv расширение файла .txt; это остановит Excel от автоматического преобразования файла при его открытии. Вот как я это делаю: откройте Excel на пустой лист, закройте пустой лист, затем File => Open и выберите файл с помощью .расширение txt. Это заставляет Excel открыть " мастер импорта текста" где он будет задавать вам вопросы о том, как вы хотите интерпретировать файл. Сначала вы выбираете разделитель (запятая, вкладка и т. д...), затем (вот важная часть) вы выбираете набор столбцов столбцов и выбираете форматирование. Если вы хотите точно, что находится в файле, выберите "текст", и Excel отобразит только то, что находится между разделителями.


(EXCEL 2007 и более поздние версии)

как заставить excel не "обнаруживать" форматы дат без редактирования исходного файла

либо:

  • переименовать файл .txt
  • если вы не можете этого сделать, вместо того, чтобы открывать файл CSV непосредственно в excel, создайте новую книгу, а затем перейдите в
    Data > Get external data > From Text
    и выберите CSV.

в любом случае, вам будут представлены параметры импорта, просто выберите каждый столбец, содержащий даты, и скажите excel Форматировать как "текст", а не"общие".


Это не Excel. Windows распознает формулу, данные как дату и автоисправления. Вы должны изменить настройки Windows.

"Панель управления" (- >"переключиться на классический вид") - > " региональный и язык Параметры "- > вкладка "региональные параметры" - > "настройка..."- >вкладка "числа" - > и затем измените символы в соответствии с хотеть.

http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html

Он будет работать на вашем компьютере, если эти настройки не будут изменены, например, на компьютере ваших клиентов они будут видеть даты вместо данных.


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

Пример 1: =("012345678905") отображается как 012345678905

Пример 2: =("1954-12-12") отображается как 1954-12-12, не 12/12/1954.


Привет у меня такая же проблема,

Я пишу этот vbscipt для создания другого CSV-файла. Новый CSV-файл будет иметь пробел в шрифте каждого поля, поэтому excel будет понимать его как текст.

таким образом, вы создаете.VBS файл с кодом ниже (например, Modify_CSV.vbs), сохранить и закрыть его. перетащить ваш исходный файл в файл vbscript. Он создаст новый файл с "SPACE_ADDED" для имени файла в том же месте.

Set objArgs = WScript.Arguments

Set objFso = createobject("scripting.filesystemobject")

dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine  ' holding text to write to new file

'Looping through all dropped file
For t = 0 to objArgs.Count - 1
    ' Input Path
    inPath = objFso.GetFile(wscript.arguments.item(t))

    ' OutPut Path
    outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")

    ' Read the file
    set objTextFile = objFso.OpenTextFile(inPath)


    'Now Creating the file can overwrite exiting file
    set aNewFile = objFso.CreateTextFile(outPath, True) 
    aNewFile.Close  

    'Open the file to appending data
    set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending

    ' Reading data and writing it to new file
    Do while NOT objTextFile.AtEndOfStream
        arrStr = split(objTextFile.ReadLine,",")

        sLine = ""  'Clear previous data

        For i=lbound(arrStr) to ubound(arrStr)
            sLine = sLine + " " + arrStr(i) + ","
        Next

        'Writing data to new file
        aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop


    Loop

    'Closing new file
    aNewFile.Close  

Next ' This is for next file

set aNewFile=nothing
set objFso = nothing
set objArgs = nothing

без изменения файла csv вы можете:

  1. измените параметр ячейки формата excel на "текст"
  2. затем с помощью" мастера импорта текста", чтобы определить ячейки csv.
  3. после импорта удалите эти данные
  4. затем просто вставьте как обычный текст

excel будет правильно форматировать и отделять ваши ячейки csv как текст, отформатированный игнорируя форматы автоматической даты.

вид глупой работы вокруг, но это бьет изменение csv данные перед импортом. Энди Бэйрд и Ричард вроде как ускользнули от этого метода, но пропустили пару важных шагов.


что я сделал для этой же проблемы, чтобы добавить следующее Перед каждым значением csv: "=""" и одна двойная кавычка после каждого значения CSV, прежде чем открывать файл в Excel. Принимать следующие значения, например:

012345,00198475

Они должны быть изменены перед открытием в Excel на:

"="""012345","="""00198475"

после этого каждое значение ячейки отображается как формула в Excel и поэтому не будет отформатировано как число, дата и т. д. Например, появляется значение 012345 as:

="012345"

ни одно из предлагаемых здесь решений не является хорошим решением. Он может работать для отдельных случаев, но только если вы контролируете окончательный дисплей. Возьмите мой пример: моя работа производит список продуктов, которые они продают в розницу. Это в формате CSV и содержит частично коды, некоторые из них начинаются с нуля, установленных производителями (не под нашим контролем). Уберите ведущие нули, и вы действительно можете соответствовать другому продукту. Розничные клиенты хотят получить список в формате CSV из-за фоновой обработки программы, которые также находятся вне нашего контроля и разные для каждого клиента, поэтому мы не можем изменить формат файлов CSV. Нет префикса'=', нет добавленных вкладок. Данные в файлах raw CSV верны; это когда клиенты открывают эти файлы в Excel начинаются проблемы. И многие клиенты не очень разбираются в компьютерах. Они могут просто открыть и сохранить вложение электронной почты. Мы думаем о предоставлении данных в двух несколько разных форматах: один как Excel Friendly (используя варианты, предложенные выше добавление вкладки, другой как "мастер". Но это может быть желаемое за действительное, так как некоторые клиенты не поймут, зачем нам это нужно. Между тем мы продолжаем объяснять, почему они иногда видят "неправильные" данные в своих электронных таблицах. До тех пор, пока Microsoft не внесет соответствующие изменения, я не вижу надлежащего решения для этого, пока никто не имеет контроля над тем, как конечные пользователи используют файлы.


Я знаю, что это старый нить. Для таких, как я, у которых все еще есть эта проблема с помощью office 2013 через powershell com-объект, можно использовать метод opentext. Проблема в том, что этот метод имеет много аргументов, которые иногда являются взаимоисключающими. Для решения этой проблемы можно использовать метод invoke-namedparameter, представленный в этот пост. Примером может служить

$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}

к сожалению, я только что обнаружил, что этот метод каким-то образом нарушает csv синтаксический анализ, когда ячейки содержат linebreaks. Это поддерживается csv, но реализация microsofts, похоже, прослушивается. Также он как-то не обнаружил немецких специфических символов. Придавая ему правильную культуру не изменить это behaveiour. Все файлы (csv и скрипт) сохраняются с кодировкой utf8. Сначала я написал следующий код, чтобы вставить CSV ячейку за ячейкой.

$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";"; 
$row = 1; 
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}

но это чрезвычайно медленно, поэтому я искал альтернативу. Appearently Excel позволяет установить значения диапазон ячеек с матрицей. Поэтому я использовал алгоритм в этот блог для преобразования csv в многолучевой.

function csvToExcel($csv,$delimiter){
     $a = New-Object -com "Excel.Application"
     $a.visible = $true

    $a.workbooks.add()
     $a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
     $data = import-csv -delimiter $delimiter $csv; 
     $array = ($data |ConvertTo-MultiArray).Value
     $starta = [int][char]'a' - 1
     if ($array.GetLength(1) -gt 26) {
         $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
     } else {
         $col = [char]($array.GetLength(1) + $starta)
     }
     $range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
     $range.value2 = $array;
     $range.Columns.AutoFit();
     $range.Rows.AutoFit();
     $range.Cells.HorizontalAlignment = -4131
     $range.Cells.VerticalAlignment = -4160
}

 function ConvertTo-MultiArray {
     param(
         [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
         [PSObject[]]$InputObject
     )
     BEGIN {
         $objects = @()
         [ref]$array = [ref]$null
     }
     Process {
         $objects += $InputObject
     }
     END {
         $properties = $objects[0].psobject.properties |%{$_.name}
         $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
         # i = row and j = column
         $j = 0
         $properties |%{
             $array.Value[0,$j] = $_.tostring()
             $j++
         }
         $i = 1
         $objects |% {
             $item = $_
             $j = 0
             $properties | % {
                 if ($item.($_) -eq $null) {
                     $array.value[$i,$j] = ""
                 }
                 else {
                     $array.value[$i,$j] = $item.($_).tostring()
                 }
                 $j++
             }
             $i++
         }
         $array
     } 
} 
csvToExcel "storage_stats.csv" ";"

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


вставить таблицу в Word. Выполните поиск / замену и измените all - (тире) на -- (двойная тире). Скопируйте и вставьте в Excel. Может делать то же самое для других символов ( / ) и т. д. Если нужно вернуться к тире один раз в Excel, просто отформатируйте столбец в текст, а затем внесите изменения. Надеюсь, это поможет.


в моем случае" Sept8 "в csv-файле, сгенерированном с помощью R, был преобразован в" 8-Sept " Excel 2013. Проблема была решена с помощью write.функция xlsx2 () в пакете xlsx для генерации выходного файла в формате xlsx, который может быть загружен Excel без нежелательного преобразования. Таким образом, если вам предоставлен csv-файл, вы можете попробовать загрузить его в R и преобразовать в xlsx с помощью записи.xlsx2 (функция).


Я делаю это для номеров кредитных карт, которые продолжают преобразовываться в научную нотацию: я в конечном итоге импортирую мой .csv в Google листы. Параметры импорта позволяют отключить автоматическое форматирование числовых значений. Я устанавливаю любые чувствительные столбцы в обычный текст и загружаю как xlsx.

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


обходной путь с помощью Google Drive (или номера, если вы находитесь на Mac):

  1. откройте данные в Excel
  2. установите формат столбца с неверными данными в текст (формат > ячейки > номер > текст)
  3. загрузить .csv в Google Drive и откройте его с помощью Google Sheets
  4. скопируйте оскорбительную колонку
  5. вставить столбец в Excel в виде текста (Правка > Вставить специальный > текст)

альтернативно, если вы находитесь на Mac для шага 3 Вы можете открыть данные в цифрах.


(EXCEL 2016 и более поздние версии, на самом деле я не пробовал в старых версиях)

  1. открыть новую пустую страницу
  2. перейдите на вкладку "Сведения"
  3. нажмите "из текста / CSV" и выберите файл csv
  4. Проверьте предварительный просмотр правильности ваших данных.
  5. в случае, когда какой-либо столбец преобразуется в дату, нажмите "Изменить", а затем выберите тип текста, нажав на календарь в голове столбца
  6. Нажмите "Закрыть И Загрузить"

2018

единственное правильное решение, которое сработало для меня (а также без изменения CSV).

Excel 2010:

  1. создать новую книгу
  2. данные > из текста > выберите CSV-файл
  3. во всплывающем окне выберите переключатель" с разделителями", затем нажмите "Далее>"
  4. разделители флажки: отметьте только " запятая "и снимите другие параметры, затем нажмите "Далее>"
  5. In "предварительный просмотр данных", прокрутите вправо, затем удерживайте shift и нажмите на последний столбец (это выделит все столбцы). Теперь в разделе " формат данных столбца "установите переключатель" текст", затем нажмите кнопку"Готово".

Excel office365: (версия клиента)

  1. создать новую книгу
  2. данные > из текста / CSV > Выберите файл CSV
  3. обнаружение типа данных > не обнаруживать

Примечание: Excel office365 (веб-версия), поскольку я пишу это, вы не сможете этого сделать.


Если вы поместите перевернутую запятую в начале поля, она будет интерпретироваться как текст.

пример: 25/12/2008 становится '25/12/2008

вы также можете выбрать тип поля при импорте.


Okay нашел простой способ сделать это в Excel 2003 по 2007. Откройте пустую книгу xls. Затем перейдите в меню "Данные", импортируйте внешние данные. Выберите csv-файл. Пройдите через Мастер, а затем в" формат данных столбца "выберите любой столбец, который необходимо принудительно"текст". Это позволит импортировать весь столбец в текстовый формат, чтобы Excel не пытался обрабатывать какие-либо определенные ячейки как дату.


начинаются пробел в двойных кавычках решен вопрос!!

У меня были такие данные, как "7/8" в одном из .столбцы csv-файлов и MS-Excel конвертировали его в дату как "07-Aug". Но с "LibreOffice Calc" не было никаких проблем.

чтобы решить эту проблему, я просто префикс пробел (добавлено пространство до 7), как "7/8" и это сработало для меня. Это тестируется для Excel-2007.


эта проблема все еще присутствует в Mac Office 2011 и Office 2013, я не могу предотвратить это. Это кажется такой простой вещью.

в моем случае у меня были такие значения, как "1 - 2" & "7 - 12" в CSV, правильно заключенном в перевернутые запятые, это автоматически преобразуется в дату в excel, если вы попытаетесь впоследствии преобразовать его в простой текст, вы получите числовое представление даты, такое как 43768. Кроме того, он переформатирует большие числа, найденные в штрих-кодах и EAN числа в 123E+ номера снова, которые не могут быть преобразованы обратно.

Я обнаружил, что Google Таблицы Google Диска не преобразуют числа в даты. Штрих-коды имеют запятые в них каждые 3 символа, но они легко удаляются. Он обрабатывает CSVs очень хорошо, особенно при работе с Mac / Windows CSVs.

может спасти кого-нибудь.


САМОЕ ПРОСТОЕ РЕШЕНИЕ Я только сегодня это понял.

  • открыть в Word
  • заменить все дефисы на en тире
  • сохранить и закрыть
  • открыть в Excel

Как только вы закончите редактирование, вы всегда можете снова открыть его в Word, чтобы снова заменить тире en дефисами.