Неправильный формат сохранения файлов XLS: автоматическое преобразование в числа - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть строка, которую мне нужно сохранить как есть в формате XLS, но функция WriteXLS, кажется, всегда конвертирует в число. Ошибка также присутствует при открытии xls вручную. Как я могу это исправить?

nb <- data.frame("92343E102", stringsAsFactors = F)
WriteXLS::WriteXLS(nb, "testdf.xls")
readxl::read_xls("testdf.xls")
> read_xls("testdf.xls")
# A tibble: 1 x 1
  X.92343E102.
         <dbl>
1     9.23e106

Ожидаемый результат: 92343E102

Мне нужно было бы сделать это без установки Python, если это возможно, поэтому dataframes2xls для меня не вариант - все равно оцените попытку

Ответы [ 4 ]

0 голосов
/ 03 ноября 2018

Хорошо, наконец, я думаю, что нашел способ избежать XLS преобразования строк типа "12E123" в научный double, который не требует взаимодействия с Excel, используя XLConnect

nb <- data.frame(as.character('92343E102'), stringsAsFactors = F)
WriteXLS::WriteXLS(nb, "testdf.xls")
readxl::read_xls("testdf.xls")
wb <- XLConnect::loadWorkbook("testdf.xls")
XLConnect::createSheet(wb, name="newsheet")
XLConnect::writeWorksheet(wb, nb, sheet = "newsheet")
XLConnect::saveWorkbook(wb)
readxl::read_xls("testdf.xls", sheet=1) #converted string to wrong number
readxl::read_xls("testdf.xls", sheet=2) # success! string stays string

результат:

> readxl::read_xls("testdf.xls", sheet=1)
# A tibble: 1 x 1
  as.character..92343E102..
                      <dbl>
1                  9.23e106
> readxl::read_xls("testdf.xls", sheet=2)
# A tibble: 1 x 1
  as.character..92343E102..
  <chr>                    
1 92343E102                

Конечно, поскольку у меня только 32-битная JAVA на работе, мне, возможно, придется переключиться на R32 для этого или написать подпрограммы 32bit-R для правильного сохранения моих файлов XLS ..

Одна вещь за один раз ... Надеюсь, это кому-нибудь поможет

0 голосов
/ 02 ноября 2018

Если у вас все в порядке, сохраните это как CSV, а затем откройте его в Excel. Одним из вариантов является использование мастера извлечения внешних данных из текста на вкладке «Данные». Затем выберите файл CSV, настройте соответствующие параметры и на третьем шаге мастера выберите импорт в виде текста в столбце, в котором находится текст, как показано ниже. Затем вы можете сохранить его в формате .xls и открыть его снова, при этом Excel изменит тип данных на научный.

enter image description here

0 голосов
/ 02 ноября 2018

Установить пакет writexl:

 install.packages("devtools", dependencies=TRUE)
# devtools has a _lot_ of dependencies
# it also has a bunch of system tool requirements
 devtools::install_github("ropensci/writexl")
#make a copy of iris
 tmp <- iris
# set [1,1] to your string:
 tmp[1,1] <- "92343E102"  # makes that column 'character'
 tmp2 <- writexl::write_xlsx(tmp)
 readxl::read_xlsx(tmp2)

# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
   <chr>              <dbl>        <dbl>       <dbl> <chr>  
 1 92343E102            3.5          1.4         0.2 setosa 
 2 4.9                  3            1.4         0.2 setosa 
 3 4.7                  3.2          1.3         0.2 setosa 
 4 4.6                  3.1          1.5         0.2 setosa 
 5 5                    3.6          1.4         0.2 setosa 
 6 5.4                  3.9          1.7         0.4 setosa 
 7 4.6                  3.4          1.4         0.3 setosa 
 8 5                    3.4          1.5         0.2 setosa 
 9 4.4                  2.9          1.4         0.2 setosa 
10 4.9                  3.1          1.5         0.1 setosa 
# ... with 140 more rows
0 голосов
/ 02 ноября 2018

Я бы предложил вам использовать dataframes2xls::write.xls() вместо:

# Make a sample dataframe:
nb <- data.frame(A = "92343E102", B = 92343E102, stringsAsFactors = F)
WriteXLS::WriteXLS(nb, "testdf.xls") # Write out using WriteXLS() ...
readxl::read_xls("testdf.xls") # Doesn't work, per your post
#> # A tibble: 1 x 2
#>          A        B
#>      <dbl>    <dbl>
#> 1 9.23e106 9.23e106
# Maybe we can specify what kind of column it is when reading in the data?
readxl::read_xls("testdf.xls", col_types = "text")
# Still doesn't work, it must be the writer
#> # A tibble: 1 x 2
#>   A           B          
#>   <chr>       <chr>      
#> 1 -2147483648 -2147483648
dataframes2xls::write.xls(nb, "testdf2.xls") # So, try a different writer
readxl::read_xls("testdf2.xls")#, col_types = "text") # Works!
#> # A tibble: 1 x 2
#>   A                      B
#>   <chr>              <dbl>
#> 1 "\"92343E102\"" 9.23e106

Создано в 2018-11-02 пакетом Представить (v0.2.1)

...