使用R连接到SharePoint列表

huwehgph  于 2023-05-20  发布在  其他
关注(0)|答案(4)|浏览(106)

有人能在R中导入SharePoint列表作为 Dataframe 吗?
我有两个独立的数据源,一个来自SharePoint列表,另一个来自我希望运行分析的DB。我能够连接到数据库没有任何问题,但似乎无法找到任何连接到SharePoint列表。
SharePoint服务器是2007

11dmarpk

11dmarpk1#

我一直在使用R阅读SharePoint 2010列表有一段时间了。基本上,我使用SharePoint Web服务从列表中返回结果,然后使用xmlToDataFrame转换为 Dataframe 。

URL <- "http://yoursharepointserver/_vti_bin/ListData.svc/yourlist"    
data = xmlParse(readLines(URL))

## get the individual list items    
items = getNodeSet(data, "//m:properties")

## convert to a data frame
df = xmlToDataFrame(items, stringsAsFactors = FALSE)

因为我使用的是Web服务,所以我可以在返回结果之前过滤列表,这对于克服SharePoint Web服务的限制非常有帮助。下面的链接很有用…http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2010/01/21/introduction-to-querying-lists-with-rest-and-listdata-svc-in-sharepoint-2010.aspx

nafvub8i

nafvub8i2#

如果ListData.svc正在运行和/或您对SharePoint服务器具有管理访问权限,那么门多萨的答案可能很有效。
如果这两个都不是真的:以下可能会起作用。在SharePoint 2010中,我是这样做的。如果在ListData.svc不存在时有更好的方法,我很想听听。

library(RCurl)
 library(XML)
 library(data.table)
 URL <- "http://<site>/_vti_bin/owssvr.dll?Cmd=Display&Query=*&XMLDATA=TRUE&List={GUID_OF_LIST}"
 rawData <- getURL(URL, userpwd = "username:password")
 # in real life  prompt for user credentials, don't put in script
 xmlData <- xmlParse (rawData, options=HUGE, useInternalNodes=TRUE)
 dataList <- xmlToList(xmlRoot(xmlData)[["data"]])
 # check the system return, on my SP2010 server the data block is 
 # named rs:data so this works
 dataMatrix <- do.call(rbind,dataList)
 finalDataTable <- data.table(dataMatrix)
vshtjzan

vshtjzan3#

上面的答案只适用于<= 1000行的列表。在URL中使用“$Top”和“$Skip”,您可以使用下面的函数,该函数多次迭代并从列表中导入所有数据,而不管大小。(这可能不是最干净的写作方式,但它的工作!)

sp_import <- function(ListName) {

        urlstring <- "http://yoursharepointserver/_vti_bin/ListData.svc/yourlist" 
        data <- xmlParse(readLines(paste(urlstring, ListName, sep = ""), warn = FALSE))
        items <- getNodeSet(data, "//m:properties")
        df <- xmlToDataFrame(items, stringsAsFactors = FALSE)
        iterate <- nrow(df)
        skip <- 1

        while (nrow(df) == 1000 * skip) {
            data <- xmlParse(readLines(paste(urlstring, ListName, "?$top=1000&$skip=", iterate, sep = ""), warn = FALSE))
            items <- getNodeSet(data, "//m:properties")
            df <- rbind(df, xmlToDataFrame(items, stringsAsFactors = FALSE))
            iterate <- nrow(df)
            skip <- skip + 1
        }
        return(df)
}
tjrkku2a

tjrkku2a4#

上述方法对我不起作用。但是,下面的方法对我很有效。首先,我去了一个SharePoint列表,我点击了“提取为Excel文件”,生成了一个“.iqy”文件。“.iqy”文件的内容的示例在下面的文本变量中。我在需要隐藏信息的地方添加了一些X。这个方法很简单。基本上,首先创建一个临时的“.iqy”文件。之后,您使用Excel打开“.iqy”文件,它会自动提取SharePoint列表的信息并将信息保存在Excel工作表中。然后,您只需从Excel文件中提取信息。

library(RDCOMClient)
library(openxlsx)

xlApp <- COMCreate("Excel.Application")
xlApp[["DisplayAlerts"]] <- FALSE
xlApp[["Visible"]] <- TRUE

text <- c("WEB", "1",
          "https://xxx.sharepoint.com/sites/xxx/_vti_bin/owssvr.dll?XMLDATA=1&List=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&View=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&RowLimit=0&RootFolder=",
          "", "Selection=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "EditWebPage=", "Formatting=None", "PreFormattedTextToColumns=True", "ConsecutiveDelimitersAsOne=True",
          "SingleBlockTextImport=False", "DisableDateRecognition=False", "DisableRedirections=False",
          "SharePointApplication=https://xxxx.sharepoint.com/sites/xxxx/_vti_bin",
          "SharePointListView=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "SharePointListName=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "RootFolder=")

temp_IQY_File <- tempfile(fileext = ".iqy")  
fileConn <- file(temp_IQY_File)
writeLines(text, fileConn)
close(fileConn)

temp_Excel_File <- gsub(pattern = ".iqy", replacement = ".xlsx", x = temp_IQY_File)

xlWbk <- xlApp$Workbooks()$Open(temp_IQY_File)
xlWbk$SaveAs(temp_Excel_File)

df <- openxlsx::read.xlsx(temp_Excel_File)

相关问题