Представление списка с динамической фильтрацией и экспорт в Excel

Создаем VisualWebPart

aspx

<asp:Panel ID="FilterPanel" runat="server">
    
    <asp:Label ID="_title_lbl" runat="server" Text="Название: "></asp:Label>
    <asp:TextBox ID="_title_box" runat="server"></asp:TextBox>
    <br/><br/>
    <asp:Label ID="_user_lbl" runat="server" Text="Сотрудник: "></asp:Label>
    <asp:TextBox ID="_user_box" runat="server"></asp:TextBox>
    <br/><br/>
    <asp:Button ID="_search_btn" runat="server" Text="Найти" OnClick="_search_btn_Click" />
    
    <asp:Panel ID="ResultsPanel" runat="server"></asp:Panel>

</asp:Panel>

ascx.cs

UpdatePanel mainUpdatePanel;
SPList list;
ListViewWebPart lvwp;

protected void Page_Load(object sender, EventArgs e)
{
    // Список
    list = SPContext.Current.Web.GetList(SPUrlUtility.CombineUrl(SPContext.Current.Web.Url, "Lists/FiltredList"));
    // Результаты
    lvwp = new ListViewWebPart();
    lvwp.ListName = list.ID.ToString("B").ToUpper();
    lvwp.ViewGuid = list.DefaultView.ID.ToString("B").ToUpper();
    lvwp.ChromeType = PartChromeType.Default;

    mainUpdatePanel = new UpdatePanel();
    mainUpdatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;

    mainUpdatePanel.ContentTemplateContainer.Controls.Add(_search_btn);
    mainUpdatePanel.ContentTemplateContainer.Controls.Add(lvwp);


    ResultsPanel.Controls.Add(mainUpdatePanel);

    // Статическое условие
    string query = string.Empty;
    string additionalCondition = "<Or><Eq><FieldRef Name='ID' /><Value Type='Counter'>1</Value></Eq><Eq><FieldRef Name='ID' /><Value Type='Counter'>2</Value></Eq></Or>";
    query = (query.Length > 0 ? "<And>" + query + additionalCondition + "</And>" : additionalCondition);

    LoadData(query);
}

/// <summary>
/// Кнопка поиска
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void _search_btn_Click(object sender, EventArgs e)
{
    string query = string.Empty;
    string tempAdding = string.Empty;
    if (!string.IsNullOrEmpty(_title_box.Text))
    {
        query = "<Contains><FieldRef Name='Title' /><Value Type='Text'>" + _title_box.Text + "</Value></Contains>";
    }
    if (!string.IsNullOrEmpty(_user_box.Text))
    {
        tempAdding = "<Contains><FieldRef Name='Users' /><Value Type='UserMulti'>" + _user_box.Text + "</Value></Contains>";
        query = (query.Length > 0 ? "<And>" + query + tempAdding + "</And>" : tempAdding);
    }

    // Статическое условие
    string additionalCondition = "<Or><Eq><FieldRef Name='ID' /><Value Type='Counter'>1</Value></Eq><Eq><FieldRef Name='ID' /><Value Type='Counter'>2</Value></Eq></Or>";
    query = (query.Length > 0 ? "<And>" + query + additionalCondition + "</And>" : additionalCondition);


    LoadData(query);
}

/// <summary>
/// Загрузка данных
/// </summary>
/// <param name="query"></param>
private void LoadData(string query)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(lvwp.ListViewXml);
    XmlNode queryNode = doc.SelectSingleNode("//Query");
    XmlNode whereNode = queryNode.SelectSingleNode("Where");

    if (whereNode != null) queryNode.RemoveChild(whereNode);
    XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "Where", String.Empty);
    newNode.InnerXml = query.ToString();
    queryNode.AppendChild(newNode);
    lvwp.ListViewXml = doc.OuterXml;
}

Для экспорта в Excel используем клиентский код, который работает в IE

<script language="javascript" type="text/javascript">
	function generateexcel() {
		var x = document.getElementById('{7BA8873E-1B90-4EAB-B446-23F93A590249}-{73FEA2BD-79BD-4F55-A8FE-E6DB310018DD}').rows;
		var xls = new ActiveXObject("Excel.Application");
		xls.visible = true
		xls.Workbooks.Add
		for (i = 0; i < x.length; i++) {
			var y = x[i].cells;
			for (j = 0; j < y.length; j++) {
				xls.cells(i + 1, j + 1).value = y[j].innerText;
			}
		}
	}
 </script>
<input type='button' value='Export To Excel' onclick="generateexcel();"/>

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *