如何访问SharePoint网站中存储的Excel共享文件中的数据?

时间:2019-04-16 10:33:01

标签: excel sharepoint

对于一小部分项目,我需要从存储在客户的Sharepoint网站中的Excel文件中读取数据。

我的客户给了我一个访问此文件的链接。实际上,我可以手动访问它,但不能以编程方式访问它。我以前从未与Sharepoint合作过。

我在this帖子中使用Excel Interop进行了尝试。

excel.Worbooks.Open行需要Microsoft识别我,因此我键入了电子邮件地址和密码,但得到了以下消息(翻译):

  

«访问被拒绝。与您的管理员联系。 »

我尝试使用手册URL和其他几个URL。他们中的一部分使用了OData,但都一样(例如here)。

感谢this的文章,我也尝试使用Graph API,但收到了404响应。

我认为问题出在文件权限上。


因此,如果我是对的,我的问题是:我的客户应该怎么做才能允许我进行此程序化访问?他不是IT专业人员。

如果我错了,这个问题是从哪里来的?我该怎么办?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以通过CSOM访问SHarePoint联机文件。

然后通过EPPlus在excel中读取数据。

using (var clientContext = new ClientContext("https://tenant.sharepoint.com/sites/lee"))
            {
                Console.ForegroundColor = ConsoleColor.Green;
                string password = "password";
                SecureString sec_pass = new SecureString();
                Array.ForEach(password.ToArray(), sec_pass.AppendChar);
                sec_pass.MakeReadOnly();
                clientContext.Credentials = new SharePointOnlineCredentials("user@tenant.onmicrosoft.com", sec_pass);

                File file = clientContext.Web.GetFileByServerRelativeUrl("/sites/lee/MyDoc3/Book.xlsx");
                ClientResult<System.IO.Stream> data=file.OpenBinaryStream();
                clientContext.Load(file);
                clientContext.ExecuteQuery();
                using (var pck = new OfficeOpenXml.ExcelPackage())
                {
                    //using (var stream = File.OpenRead(""))
                    //{
                    //    pck.Load(stream);
                    //}
                    using (System.IO.MemoryStream mStream = new System.IO.MemoryStream())
                    {
                        if (data != null)
                        {
                            data.Value.CopyTo(mStream);
                            pck.Load(mStream);
                            var ws = pck.Workbook.Worksheets.First();
                            DataTable tbl = new DataTable();
                            bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
                            foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
                            {
                                tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
                            }
                            var startRow = hasHeader ? 2 : 1;
                            for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
                            {
                                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                                var row = tbl.NewRow();
                                foreach (var cell in wsRow)
                                {
                                    if (null != cell.Hyperlink)
                                        row[cell.Start.Column - 1] = cell.Hyperlink;
                                    else
                                        row[cell.Start.Column - 1] = cell.Text;
                                }
                                tbl.Rows.Add(row);
                            }
                            Console.WriteLine('1');

                        }
                    }



                }

                Console.WriteLine("Done");
                Console.ReadKey();

            }