Поговорим о экспoрте листа в Excel, и сохранения его в библиотеке документов.
Очень часто возникает необходимость экспортировать не весь список в excel а только некую его часть. Я покажу пример того, как быстро и удобно построить такой экспорт. Использовать мы будем решение которое базируется на создании простого xml:
XmlDocument _report;
StringBuilder file_content = new StringBuilder();
file_content.Append(@"<?xml version='1.0'?>
<?mso-application progid='Excel.Sheet'?>
<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
xmlns:o='urn:schemas-microsoft-com:office:office'
xmlns:x='urn:schemas-microsoft-com:office:excel'
xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'
xmlns:html='http://www.w3.org/TR/REC-html40'>
<DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>
<Author>PIB</Author>
<LastAuthor>PIB</LastAuthor>
<LastPrinted>2009-09-15T12:46:54Z</LastPrinted>
<Created>2004-05-05T13:41:40Z</Created>
<LastSaved>2010-01-18T12:59:49Z</LastSaved>
<Company>PIB</Company>
<Version>1.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns='urn:schemas-microsoft-com:office:office'>
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns='urn:schemas-microsoft-com:office:excel'>
<SupBook>
<Path>Sheet2</Path>
<SheetName>Sheet2</SheetName>
</SupBook>
<WindowHeight>6450</WindowHeight>
<WindowWidth>9720</WindowWidth>
<WindowTopX>-15</WindowTopX>
<WindowTopY>-15</WindowTopY>
<TabRatio>831</TabRatio>
<PrecisionAsDisplayed/>
<DoNotSaveLinkValues/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID='Default' ss:Name='Normal'>
<Alignment ss:Vertical='Bottom'/>
<Borders/>
<Font ss:FontName='Arial Cyr' x:CharSet='204'/>
<Interior/>
<NumberFormat ss:Format='_(* #,##0_);_(* \(#,##0.00\);_(* ??_);_(@_)'/>
<Protection/>
</Style>
<Style ss:ID='s62'>
<Alignment ss:Vertical='Bottom' ss:WrapText='1'/>
<NumberFormat ss:Format='@'/>
</Style>
</Styles>
<Worksheet ss:Name='Рабочий лист");
Дальше объявляем поля:
file_content.Append(@"'>
<Names>
<NamedRange ss:Name='spp10test_akhz_bp_vw_day_real_plan_all'
ss:RefersTo='=Sheet2!R1C1:R31465C8'/>
</Names>
<Table ss:ExpandedColumnCount='14'>
<Column ss:Width='20'/>
<Column ss:Width='80'/>
<Column ss:Width='150'/>
<Column ss:Width='250'/>
<Column ss:Width='100'/>
<Column ss:Width='50'/>
<Column ss:Width='152'/>
<Column ss:Width='100'/>
<Column ss:Width='122'/>
<Column ss:Width='122'/>
<Column ss:Width='180'/>
<Column ss:Width='100'/>
<Column ss:Width='102'/>
<Column ss:Width='140'/>
<Row>");
Вносим название колонок из массива:
public static string[] Workshops = new string[] {
"№ п/п",
"Дата и время",
"Тема жалобы",
"Описание жалобы",
"Регион",
"Город",
"Ф.И.О. Клиента",
"Телефон клиента",
"Зарегистрировал",
"Исполнитель",
"Результат решения",
"Дата, время обратной связи",
"Примечания",
"Статус обращения"
};
Добавляем поля:
foreach(string name in Workshops)
{
file_content.Append(@"<Cell><Data ss:Type='String'>" +name + @"</Data></Cell>");
}
file_content.Append(@"</Row>");Дальше я написал фильтер по дате для выбору данных из input
start_date = Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.ParseExact(Hidden_start_date.Value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture));
end_date = Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.ParseExact(Hidden_end_date.Value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture));
и сам запрос к листу:
SPQuery query = new SPQuery();
query.Query = "<Where><And><Geq><FieldRef Name='CallbackDate' /><Value Type='DateTime'>" + start_date + "</Value></Geq><Leq><FieldRef Name='CallbackDate' /><Value Type='DateTime'>" + end_date + "</Value></Leq></And></Where>";
SPListItemCollection items = data_List.GetItems(query);
Теперь заполняем ячейки данными:
foreach (SPListItem item in items)
{
file_content.Append(@"<Row><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[0]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[1]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[2]]));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[3]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[4]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[5]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String' >");
file_content.Append(Get_String_From_Obj(item[Workshops[6]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[7]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(getUser(new SPFieldUserValue(web, Get_String_From_Obj(item["Author"]))));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(getUser(new SPFieldUserValue(web,Get_String_From_Obj(item[Workshops[9]]))));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[10]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[11]]));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[12]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[13]]));
file_content.Append(@"</Data></Cell></Row>");
}
<Cell ss:StyleID='s62'> это стиль для текстового поля с переносом по буквам в ячейке.
методы которые тут задействованы:
private string Get_String_From_Obj(object obj)
{
string str = "";
if (obj != null)
{
str = obj.ToString();
}
return str;
}
public string getUser(SPFieldUserValue field_user)
{
if (field_user != null)
{
return Get_String_From_Obj(field_user.LookupValue);
}
return "";
}
Дальше добавим в нашу xml следующие:
file_content.Append(@"</Table>
<WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
<PageSetup>
<Header x:Margin='0.3'/>
<Footer x:Margin='0.3'/>
<PageMargins x:Bottom='0.75' x:Left='0.7' x:Right='0.7' x:Top='0.75'/>
</PageSetup>
<Visible>SheetHidden</Visible>
<Print>
<ValidPrinterInfo/>
<HorizontalResolution>600</HorizontalResolution>
<VerticalResolution>600</VerticalResolution>
</Print>
<Selected/>
<FilterOn/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>25583</ActiveRow>
<ActiveCol>3</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>");
И теперь сохраним его в библиотеку:
MemoryStream stream = new MemoryStream();
_report = new XmlDocument();
_report.LoadXml(file_content.ToString());
_report.Save(stream);
SPUser user = web.CurrentUser;
SPFile file = web.Files.Add(web.Url + "/" + sourceListObj.RootFolder.ToString() + "/" + String.Format("{0}_отчет_{1}.xls", user.Name, date.ToString("dddd, dd MMMM yyyy h mm tt")), stream.GetBuffer(), true);
file.Update();
Вот и все!
Очень часто возникает необходимость экспортировать не весь список в excel а только некую его часть. Я покажу пример того, как быстро и удобно построить такой экспорт. Использовать мы будем решение которое базируется на создании простого xml:
XmlDocument _report;
StringBuilder file_content = new StringBuilder();
file_content.Append(@"<?xml version='1.0'?>
<?mso-application progid='Excel.Sheet'?>
<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'
xmlns:o='urn:schemas-microsoft-com:office:office'
xmlns:x='urn:schemas-microsoft-com:office:excel'
xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'
xmlns:html='http://www.w3.org/TR/REC-html40'>
<DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'>
<Author>PIB</Author>
<LastAuthor>PIB</LastAuthor>
<LastPrinted>2009-09-15T12:46:54Z</LastPrinted>
<Created>2004-05-05T13:41:40Z</Created>
<LastSaved>2010-01-18T12:59:49Z</LastSaved>
<Company>PIB</Company>
<Version>1.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns='urn:schemas-microsoft-com:office:office'>
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns='urn:schemas-microsoft-com:office:excel'>
<SupBook>
<Path>Sheet2</Path>
<SheetName>Sheet2</SheetName>
</SupBook>
<WindowHeight>6450</WindowHeight>
<WindowWidth>9720</WindowWidth>
<WindowTopX>-15</WindowTopX>
<WindowTopY>-15</WindowTopY>
<TabRatio>831</TabRatio>
<PrecisionAsDisplayed/>
<DoNotSaveLinkValues/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID='Default' ss:Name='Normal'>
<Alignment ss:Vertical='Bottom'/>
<Borders/>
<Font ss:FontName='Arial Cyr' x:CharSet='204'/>
<Interior/>
<NumberFormat ss:Format='_(* #,##0_);_(* \(#,##0.00\);_(* ??_);_(@_)'/>
<Protection/>
</Style>
<Style ss:ID='s62'>
<Alignment ss:Vertical='Bottom' ss:WrapText='1'/>
<NumberFormat ss:Format='@'/>
</Style>
</Styles>
<Worksheet ss:Name='Рабочий лист");
Дальше объявляем поля:
file_content.Append(@"'>
<Names>
<NamedRange ss:Name='spp10test_akhz_bp_vw_day_real_plan_all'
ss:RefersTo='=Sheet2!R1C1:R31465C8'/>
</Names>
<Table ss:ExpandedColumnCount='14'>
<Column ss:Width='20'/>
<Column ss:Width='80'/>
<Column ss:Width='150'/>
<Column ss:Width='250'/>
<Column ss:Width='100'/>
<Column ss:Width='50'/>
<Column ss:Width='152'/>
<Column ss:Width='100'/>
<Column ss:Width='122'/>
<Column ss:Width='122'/>
<Column ss:Width='180'/>
<Column ss:Width='100'/>
<Column ss:Width='102'/>
<Column ss:Width='140'/>
<Row>");
Вносим название колонок из массива:
public static string[] Workshops = new string[] {
"№ п/п",
"Дата и время",
"Тема жалобы",
"Описание жалобы",
"Регион",
"Город",
"Ф.И.О. Клиента",
"Телефон клиента",
"Зарегистрировал",
"Исполнитель",
"Результат решения",
"Дата, время обратной связи",
"Примечания",
"Статус обращения"
};
Добавляем поля:
foreach(string name in Workshops)
{
file_content.Append(@"<Cell><Data ss:Type='String'>" +name + @"</Data></Cell>");
}
file_content.Append(@"</Row>");Дальше я написал фильтер по дате для выбору данных из input
start_date = Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.ParseExact(Hidden_start_date.Value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture));
end_date = Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.ParseExact(Hidden_end_date.Value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture));
и сам запрос к листу:
SPQuery query = new SPQuery();
query.Query = "<Where><And><Geq><FieldRef Name='CallbackDate' /><Value Type='DateTime'>" + start_date + "</Value></Geq><Leq><FieldRef Name='CallbackDate' /><Value Type='DateTime'>" + end_date + "</Value></Leq></And></Where>";
SPListItemCollection items = data_List.GetItems(query);
Теперь заполняем ячейки данными:
foreach (SPListItem item in items)
{
file_content.Append(@"<Row><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[0]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[1]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[2]]));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[3]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[4]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[5]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String' >");
file_content.Append(Get_String_From_Obj(item[Workshops[6]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[7]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(getUser(new SPFieldUserValue(web, Get_String_From_Obj(item["Author"]))));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(getUser(new SPFieldUserValue(web,Get_String_From_Obj(item[Workshops[9]]))));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[10]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[11]]));
file_content.Append(@"</Data></Cell><Cell ss:StyleID='s62'><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[12]]));
file_content.Append(@"</Data></Cell><Cell><Data ss:Type='String'>");
file_content.Append(Get_String_From_Obj(item[Workshops[13]]));
file_content.Append(@"</Data></Cell></Row>");
}
<Cell ss:StyleID='s62'> это стиль для текстового поля с переносом по буквам в ячейке.
методы которые тут задействованы:
private string Get_String_From_Obj(object obj)
{
string str = "";
if (obj != null)
{
str = obj.ToString();
}
return str;
}
public string getUser(SPFieldUserValue field_user)
{
if (field_user != null)
{
return Get_String_From_Obj(field_user.LookupValue);
}
return "";
}
Дальше добавим в нашу xml следующие:
file_content.Append(@"</Table>
<WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'>
<PageSetup>
<Header x:Margin='0.3'/>
<Footer x:Margin='0.3'/>
<PageMargins x:Bottom='0.75' x:Left='0.7' x:Right='0.7' x:Top='0.75'/>
</PageSetup>
<Visible>SheetHidden</Visible>
<Print>
<ValidPrinterInfo/>
<HorizontalResolution>600</HorizontalResolution>
<VerticalResolution>600</VerticalResolution>
</Print>
<Selected/>
<FilterOn/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>25583</ActiveRow>
<ActiveCol>3</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>");
И теперь сохраним его в библиотеку:
MemoryStream stream = new MemoryStream();
_report = new XmlDocument();
_report.LoadXml(file_content.ToString());
_report.Save(stream);
SPUser user = web.CurrentUser;
SPFile file = web.Files.Add(web.Url + "/" + sourceListObj.RootFolder.ToString() + "/" + String.Format("{0}_отчет_{1}.xls", user.Name, date.ToString("dddd, dd MMMM yyyy h mm tt")), stream.GetBuffer(), true);
file.Update();
Вот и все!
Комментариев нет:
Отправить комментарий