Остановить Excel от автоматического преобразования определенных текстовых значений в даты - PullRequest
476 голосов
/ 03 октября 2008

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

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

Ответы [ 34 ]

1 голос
/ 20 декабря 2017

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

  1. Открыть данные в Excel
  2. Установите формат столбца с неверными данными в Текст (Формат> Ячейки> Число> Текст)
  3. Загрузите .csv в Google Drive и откройте его с помощью Google Sheets
  4. Скопировать ошибочный столбец
  5. Вставить столбец в Excel как текст («Правка»> «Специальная вставка»> «Текст»)

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

1 голос
/ 29 февраля 2016

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

1 голос
/ 17 апреля 2015

Я знаю, что это старая тема. Для тех, кто, как я, у которых все еще есть эта проблема при использовании Office 2013 с помощью PowerShell объекта может использовать метод 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, когда ячейки содержат разрывы строк. Это поддерживается csv, но реализация microsofts кажется ошибочной. Также он как-то не обнаружил специфических немецких символов. Придание ему правильной культуры не изменило этого поведения. Все файлы (csv и script) сохраняются в кодировке 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++;}

Но это очень медленно, поэтому я искал альтернативу. Судя по всему, 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 и символу разделителя внизу.

0 голосов
/ 03 октября 2008

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

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

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

0 голосов
/ 03 октября 2008

Альтернативный метод:

Преобразуйте формат столбца, который вы хотите изменить, в «Текст». Выберите все ячейки, которые вы хотите сохранить, скопируйте. Не отменяя выбор этих столбцов, нажмите «Редактировать> Специальная вставка> В качестве значений»

Сохранить как CSV. Обратите внимание, что это должно быть последним, что вы делаете с файлом, потому что при повторном открытии он будет форматироваться как даты, поскольку форматы ячеек не могут быть сохранены в файлах CSV.

0 голосов
/ 17 сентября 2017

Я сделал этот макрос vba, который в основном форматирует диапазон вывода в виде текста перед вставкой чисел. Прекрасно работает для меня, когда я хочу вставить такие значения, как 8/11, 23/6, 1/3 и т. Д. Без Excel, интерпретируя их как даты.

Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup

Columns(ActiveCell.Column).NumberFormat = "@"

Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard

ActiveCell.PasteSpecial

End Sub

Мне очень интересно знать, работает ли это и на других людей. Некоторое время я искал решение этой проблемы, но я не видел быстрого решения vba, в котором раньше не было вставки перед входным текстом. Этот код сохраняет данные в исходном виде.

0 голосов
/ 16 августа 2016

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

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

0 голосов
/ 24 февраля 2011
SELECT CONCAT('\'',NOW(),'\''), firstname, lastname 
FROM your_table
INTO OUTFILE 'export.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '\"' 
LINES TERMINATED BY '\n'
0 голосов
/ 03 мая 2013

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

0 голосов
/ 24 октября 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...