SharePoint рдХреЗ рд▓рд┐рдП Excel рдирд┐рд░реНрдпрд╛рдд рдореЗрдВ рд╕реБрдзрд╛рд░

SharePoint рдореЗрдВ Excel рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдирд┐рд░реНрдпрд╛рдд рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ SharePoint рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз рдлрд╝рд╛рдЗрд▓ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХреНрд╕реЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИ, рдФрд░ рдПрдХреНрд╕реЗрд▓ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рдкрд░ рдбреНрд░реИрдЧ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдФрд░ рднреА рдиреБрдХрд╕рд╛рди рд╣реИрдВ:


рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде, рдЖрдк рдорд╛рдирдХ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рднреА рдиреЛрдЯрд┐рд╕ рди рдХрд░реЗрдВред


рдирд┐рд░реНрдпрд╛рдд рдмрдЯрди рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди


рд░рд┐рдмрди рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреА рдЖрдИрдбреА рдХреЗ рдмрд░рд╛рдмрд░ Location рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ CommandUIDefinition рдЬреЛрдбрд╝реЗрдВред рд╕рднреА рдорд╛рдирдХ рддрддреНрд╡ рдлрд╝рд╛рдЗрд▓ C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ 14 \TEMPLATE\GLOBAL\XML\CMDUI.XML рдореЗрдВ SharePoint 2010 (рдпрд╛ SharePoint 2013 рдХреЗ рд▓рд┐рдП 15 ) рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рдд рд╣реИрдВред

рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдмрдЯрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Ribbon.List.Actions.ExportToSpreadsheet рдФрд░ Ribbon.Library.Actions.ExportToSpreadsheet рдмрд░рд╛рдмрд░ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдмрдЯрди рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВред рдирдП рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП Location рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдЗрди рдЖрдИрдбреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ
 <CommandUIDefinitions> <CommandUIDefinition Location="Ribbon.Library.Actions.ExportToSpreadsheet"> <Button Id="Ribbon.Library.Actions.ExportToSpreadsheet-Replacement" Sequence="40" Command="ExportToSpreadsheet-Replacement" Image16by16="/_layouts/$Resources:core,Language;/images/formatmap16x16.png" Image16by16Top="-152" Image16by16Left="-32" Image32by32="/_layouts/$Resources:core,Language;/images/formatmap32x32.png" Image32by32Top="-352" Image32by32Left="0" LabelText="$Resources:core,cui_ButExportToSpreadsheet;" ToolTipTitle="$Resources:core,cui_ButExportToSpreadsheet;" ToolTipDescription="$Resources:core,cui_STT_ButExportListToSpreadsheet;" TemplateAlias="o2" /> </CommandUIDefinition> <CommandUIDefinition Location="Ribbon.List.Actions.ExportToSpreadsheet"> <Button Id="Ribbon.List.Actions.ExportToSpreadsheet-Replacement" Sequence="40" Command="ExportToSpreadsheet-Replacement" Image16by16="/_layouts/$Resources:core,Language;/images/formatmap16x16.png" Image16by16Top="-152" Image16by16Left="-32" Image32by32="/_layouts/$Resources:core,Language;/images/formatmap32x32.png" Image32by32Top="-352" Image32by32Left="0" LabelText="$Resources:core,cui_ButExportToSpreadsheet;" ToolTipTitle="$Resources:core,cui_ButExportToSpreadsheet;" ToolTipDescription="$Resources:core,cui_STT_ButExportListToSpreadsheet;" TemplateAlias="o1" /> </CommandUIDefinition> </CommandUIDefinitions> 


Id="Ribbon.Calendar.Calendar.Actions.ExportToSpreadsheet" рд╕рд╛рде рдХреИрд▓реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдмрдЯрди рднреА рд╣реИ, рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдПрдБ


рдмрдЯрди рдХреЛ рдХреБрдЫ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирдХ рдмрдЯрди рдХреЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрд▓рд┐рдЧреЗрдЯрдХрдВрдЯреНрд░реЛрд▓ рдмрдирд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ Id="AdditionalPageHead" :
 <Control Id="AdditionalPageHead" Sequence="1000" ControlAssembly="$SharePoint.Project.AssemblyFullName$" ControlClass="$SharePoint.Type.7fd7c6f0-4eda-48ce-ac8f-aa9f9d2666ac.FullName$"/> 

рдПрдХ рдХрд╕реНрдЯрдо рдмрдЯрди рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд, рдкреЛрд╕реНрдЯрдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдмрдЯрди рдХреЛ рд╕реВрдЪреА рджреГрд╢реНрдп рдкреГрд╖реНрда рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реВрдЪреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡реЗрдм рднрд╛рдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЖрдкрдХреЛ рд╕реВрдЪреА рдЖрдИрдбреА рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХрд╛рд╢, рдЙрд╕ рджреГрд╢реНрдп рдХреА рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рд╕реВрдЪреА рдЖрдИрдбреА рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ред

 <CommandUIHandlers> <CommandUIHandler Command="ExportToSpreadsheet-Replacement" CommandAction="javascript:(function(){var x=SP.ListOperation.Selection.getSelectedList(); if (x) {__doPostBack('ExportToSpreadsheet-Replacement', x);}})();" /> </CommandUIHandlers> 


рдЕрдЧрд▓рд╛, рд╕рд░реНрд╡рд░ рдкрд░, рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмрдЯрди рд╕реВрдЪреА рджреГрд╢реНрдп рдкреГрд╖реНрда рдкрд░ рдпрд╛ рдирд┐рдпрдорд┐рдд рдкреГрд╖реНрда рдкрд░ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ:

 protected override void OnLoad(EventArgs e) { if (this.Page.Request["__EVENTTARGET"] == "ExportToSpreadsheet-Replacement") { var spContext = SPContext.Current; SPList list; SPView view; if (spContext.ViewContext.View != null) { list = spContext.List; view = spContext.ViewContext.View; } else { var listId = new Guid(this.Page.Request["__EVENTARGUMENT"]); var web = spContext.Web; list = web.Lists[listId]; view = list.DefaultView; } ExportData(list.Title + " - " + view.Title, GetDataTable(list, view)); } } 


рдПрдХ рджреГрд╢реНрдп рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

 private static System.Data.DataTable GetDataTable(SPList list, SPView view) { var query = new SPQuery(view); SPListItemCollectionPosition position; var flags = SPListGetDataTableOptions.UseBooleanDataType | SPListGetDataTableOptions.UseCalculatedDataType; var result = list.GetDataTable(query, flags, out position); while (position != null) { list.AppendDataTable(query, flags, result, out position); } return result; } 


рдПрдХреНрд╕реЗрд▓ рдлрд╝рд╛рдЗрд▓ рдкреАрдврд╝реА



рдЕрдВрддрд┐рдо рдЪрд░рдг рдПрдХ рдПрдХреНрд╕реЗрд▓ рдлрд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреЗрдирд╛ рд╣реИред Excel рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ClosedXml рд▓рд╛рдЗрдмреНрд░реЗрд░реА ( http://closedxml.codeplex.com/ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

 private void ExportData(string title, System.Data.DataTable table) { var wb = new XLWorkbook(); var ws = wb.Worksheets.Add(title); ws.Cell(1, 1).InsertTable(table); var response = this.Page.Response; response.Clear(); response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; var filename = title+".xlsx"; response.AddHeader("content-disposition", GetContentDisposition(filename)); // Flush the workbook to the Response.OutputStream using (var memoryStream = new MemoryStream()) { wb.SaveAs(memoryStream); memoryStream.WriteTo(response.OutputStream); } response.End(); } 


рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рддреАрди рд▓рд╛рдЗрдиреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреНрд╕реЗрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (ClosedXml рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж) рдмрдирд╛рддреА рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ content-disposition рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХреЛ рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╣реА рд░реВрд╕реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреИрдореНрдмреЛрд░рд┐рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╛рдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ StackOverflow stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http рдкрд░ рд╕рд╣реА content-disposition рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдорд┐рд▓рд╛

 private string GetContentDisposition(string filename) { var request = this.Page.Request; string contentDisposition; if (request.Browser.Browser == "IE" && (request.Browser.Version == "7.0" || request.Browser.Version == "8.0")) contentDisposition = "attachment; filename=" + Uri.EscapeDataString(filename); else if (request.UserAgent != null && request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android) contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(filename) + "\""; else contentDisposition = "attachment; filename=\"" + filename + "\"; filename*=UTF-8''" + Uri.EscapeDataString(filename); return contentDisposition; } private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@┬г$тВм!┬╜┬з~'=()[]{}0123456789".ToDictionary(c => c); private string MakeAndroidSafeFileName(string fileName) { char[] newFileName = fileName.ToCharArray(); for (int i = 0; i < newFileName.Length; i++) { if (!AndroidAllowedChars.ContainsKey(newFileName[i])) newFileName[i] = '_'; } return new string(newFileName); } 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЙрддреНрдкрд╛рджрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ ClosedXml.dll рдФрд░ DocumentFormat.OpenXml.dll рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд░рд┐рдмрди рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдЯрди рдХреЛ рд╕рд╛рдЗрдЯ рдпрд╛ рд╡реЗрдм рд╕реНрддрд░ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - spsamples.codeplex.com/SourceControl/latest#ExportToExcel

рдпрд╣рд╛рдВ рддреИрдпрд╛рд░ рдбрдмреНрд▓реНрдпреВрдПрд╕рдкреА рдлрд╛рдЗрд▓ - spsamples.codeplex.com/releases/view/117220

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдФрд░ SharePoint рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА ASP.NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In208948/


All Articles