On Tue, 7 Apr 2009, Yuri Volchik wrote:


Hi,

i'm trying to read some data from excel files but it seems that neither
xlsReadWrite nor sqlFetch (RODBC) doesn't like the format (Excel 5.0).
When i open the file in Excel and save it in a new format Excel 97 -2003
everything works fine.
Is it possible to use ODBC connection to open old format files, or i guess i
will have to open and save every file in Excel in new format, which isn't
very practical.


Your question is a bit confusing. This is the current state of play regarding reading and writing Excel files with xlsReadWrite and RODBC.

xlsReadWrite will read and write from Excel 97-2003 files (.xls files) including reading from named sheets, but only writing a single sheet workbook.

RODBC can be used to read both Excel 97-2003 files and the latest version of Excel files (.xlsx) files. It can be used to update these files too I believe but I have not tested that. Here follows tested code (examples given to my students) showing how to read from various Excel files. The example builds on the example provided by Hans-Peter Suter on the R-wiki page concerning reading and writing from Excel.

Note that in the following bikesWithDate.xls is an Excel 97-2003 file obtained from bikes.xls by formatting the Date column as an Excel date. In addition the table has been made into a named range for use with RODBC. bikesWithDate.xlsx is the same file but saved in .xlsx format

The code illustrates date conversions also.

### Using xlsReadWrite
### Load xlsReadWrite
library(xlsReadWrite)
tdat <- data.frame(Price = c(6399,3699,2499),
                   Amount = c(2,3,1),
                   Date = c(39202,39198,39199),
                   row.names = c("Pro machine","Road racer", "Streetfire"))
### Write
write.xls(tdat, "bikes.xls")

### Read and check
bikes1 <- read.xls(file = "bikes.xls")
bikes1
class(bikes1[,"Date"])

### Read as data.frame (custom colnames, date as iso-string)
bikes2 <- read.xls(file = "bikes.xls",
                   colNames = c("","CHF","Number","Date"), from = 2,
                   colClasses = c("numeric","numeric","isodate"))
bikes2
class(bikes2[,"Date"])
### Date is actually of class character
### Convert Date to class Date
bikes2[,"Date"] <- as.Date(bikes2[,"Date"])
bikes2[,"Date"]
class(bikes2[,"Date"])
### Convert Date to class POSIXct
bikes2[,"Date"] <- as.POSIXct(bikes2[,"Date"])
bikes2[,"Date"]
class(bikes2[,"Date"])

### Read Excel file with date column
bikes3 <- read.xls("bikesWithDate.xls", dateTimeAs = "isodate")
bikes3
class(bikes3[,"Date"])
### Date is of class character---needs to be converted to a date class

### Try with RODBC
library(RODBC)
bikes4 <- sqlFetch(odbcConnectExcel("bikes.xls"), sqtable = "Sheet1",
                   na.strings = "NA", as.is = TRUE)
bikes4
str(bikes4)
class(bikes4[,"Date"])
### Dates are actually in Excel format, number of days since 1899-12-30
bikes4 <- sqlFetch(odbcConnectExcel("bikes.xls"), sqtable = "Sheet1",
                   na.strings = "NA", as.is = TRUE)
bikes4[,"Date"] <- as.Date(bikes4[,"Date"], origin = "1899-12-30")
bikes4[,"Date"]
class(bikes4[,"Date"])

### Try with formatted date
bikes5 <- sqlFetch(odbcConnectExcel("bikesWithDate.xls"),
                   sqtable = "DateAsDate",
                   na.strings = "NA", as.is = TRUE)
bikes5
class(bikes5[,"Date"])
### Convert to Date class??
bikes5[,"Date"] <- as.Date(bikes5[,"Date"])
bikes5[,"Date"]
class(bikes5[,"Date"])

### Use a named range
channel <- odbcConnectExcel("bikesWithDate.xls")
bikes6 <- sqlQuery(channel, "SELECT * FROM DataRange",
                    na.strings = "NA", as.is = TRUE)
bikes6
class(bikes6[,"Date"])
bikes6[,"Date"] <- as.Date(bikes6[,"Date"])
bikes6[,"Date"]
class(bikes6[,"Date"])

### Read from .xlsx file
channel <- odbcConnectExcel2007("bikesWithDate.xlsx")
bikes7 <- sqlQuery(channel, "SELECT * FROM DataRange",
                    na.strings = "NA", as.is = TRUE)
bikes7
class(bikes7[,"Date"])
bikes7[,"Date"] <- as.Date(bikes7[,"Date"])
bikes7[,"Date"]
class(bikes7[,"Date"])

### Clean up
odbcCloseAll()


David Scott


_________________________________________________________________
David Scott     Department of Statistics
                The University of Auckland, PB 92019
                Auckland 1142,    NEW ZEALAND
Phone: +64 9 373 7599 ext 85055         Fax: +64 9 373 7018
Email:  d.sc...@auckland.ac.nz

Graduate Officer, Department of Statistics
Director of Consulting, Department of Statistics

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to