SharePoint рдореЗрдВ Excel рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдирд┐рд░реНрдпрд╛рдд рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ SharePoint рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз рдлрд╝рд╛рдЗрд▓ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХреНрд╕реЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИ, рдФрд░ рдПрдХреНрд╕реЗрд▓ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рдкрд░ рдбреНрд░реИрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдФрд░ рднреА рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
- рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ Excel рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- рдкреНрд░рд╛рдкреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХ "рдХрдЪреНрдЪреЗ" рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИред
рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде, рдЖрдк рдорд╛рдирдХ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рднреА рдиреЛрдЯрд┐рд╕ рди рдХрд░реЗрдВред
рдирд┐рд░реНрдпрд╛рдд рдмрдЯрди рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
рд░рд┐рдмрди рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреА рдЖрдИрдбреА рдХреЗ рдмрд░рд╛рдмрд░
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));
рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рддреАрди рд▓рд╛рдЗрдиреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХреНрд╕реЗрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (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"))
рдирд┐рд╖реНрдХрд░реНрд╖
рдЙрддреНрдкрд╛рджрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ ClosedXml.dll рдФрд░ DocumentFormat.OpenXml.dll рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд░рд┐рдмрди рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдЯрди рдХреЛ рд╕рд╛рдЗрдЯ рдпрд╛ рд╡реЗрдм рд╕реНрддрд░ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ -
spsamples.codeplex.com/SourceControl/latest#ExportToExcelрдпрд╣рд╛рдВ рддреИрдпрд╛рд░ рдбрдмреНрд▓реНрдпреВрдПрд╕рдкреА рдлрд╛рдЗрд▓ -
spsamples.codeplex.com/releases/view/117220рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдФрд░ SharePoint рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА ASP.NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред