对于一小部分项目,我需要从存储在客户的Sharepoint网站中的Excel文件中读取数据。
我的客户给了我一个访问此文件的链接。实际上,我可以手动访问它,但不能以编程方式访问它。我以前从未与Sharepoint合作过。
我在this帖子中使用Excel Interop进行了尝试。
excel.Worbooks.Open
行需要Microsoft识别我,因此我键入了电子邮件地址和密码,但得到了以下消息(翻译):
«访问被拒绝。与您的管理员联系。 »
我尝试使用手册URL和其他几个URL。他们中的一部分使用了OData,但都一样(例如here)。
感谢this的文章,我也尝试使用Graph API,但收到了404响应。
我认为问题出在文件权限上。
因此,如果我是对的,我的问题是:我的客户应该怎么做才能允许我进行此程序化访问?他不是IT专业人员。
如果我错了,这个问题是从哪里来的?我该怎么办?
感谢您的帮助。
答案 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();
}