Динамическое создание отформатированных отчетов Excel с элегантным графиком

Обзор

Существуют определенные веб-сценарии, которые требуют как отчетов, так и презентаций, комбинации частей или объектов, которые могут хорошо работать вместе. В статье объясняется, как легко динамически разрабатывать и создавать стильные отчеты Excel в формате WYSIWYG. Он экспортирует данные из файла XML (вы также можете использовать другие источники данных) в элемент управления Aspose.Cells.GridWeb, который предоставляет вам реальную среду, позволяющую применять богатый и привлекательный формат к данным и вычислять результаты формул, такие как MS Excel. Он также создает сложную диаграмму на основе исходных данных рабочего листа, используяAspose.Cells компонента и вставляет изображение диаграммы в отчет о продажах. Наконец, отчет Excel с прикрепленным графиком сохраняется на диск с помощью компонента Aspose.Cells.

Эта статья включает исходный код и полнофункциональный демонстрационный проект для такой функциональности.

Это позволяет пользователям с подробным пониманием того, как создать бизнес-отчет, вводить данные в рабочий лист сетки и применять некоторое форматирование к ячейкам в строках и столбцах, вставлять график на основе исходного диапазона данных перед сохранением отчет excel на диск.

Компоненты Aspose

Я использую три изAspose компоненты для выполнения задачи с легкостью.Aspose , Издатель компонентов .NET и Java предоставляет множество многофункциональных компонентов.Aspose предоставляет большую линейку компонентов .NET и Java. Продукты, которым доверяют тысячи клиентов по всему миру, включают компоненты форматов файлов, продукты для создания отчетов, визуальные компоненты и служебные компоненты, которые позволяют программно открывать, изменять, генерировать, сохранять, объединять, преобразовывать и т. д. документы в различных форматах, включая DOC, RTF, WordML, HTML, PDF, XLS, SpreadsheetML, Tab Delimited, CSV, PPT, SWF, EMF, WMF, MPX, MPD и другие форматы.

Я хотел бы воспользоваться этой возможностью, чтобы представить вам три из этих компонентов, которые использовались в этом квесте.

Aspose.Cells Элементы управления сетью

Aspose.Cells Grid Controls — комплексное решение для сетки. Aspose.Cells Элементы управления Grid поставляются в комплекте с двумя различными компонентами GUI .NET (Aspose.Cells.GridDesktop и Aspose.Cells.GridWeb): один для поддержки настольных приложений, а другой — для поддержки веб-приложений. Обе версии в равной степени согласованы, чтобы упростить внедрение на любой платформе. Aspose.Cells.GridWeb предоставляет возможность импорта и экспорта в электронные таблицы Excel. Таким образом, любой, кто знаком с Excel (даже конечные пользователи), может спроектировать внешний вид сетки. Aspose.Cells.GridWeb также предлагает простой в использовании, многофункциональный API, который предоставляет разработчикам полный контроль над внешним видом, поведением и поведением их сетки. Чтобы узнать больше о продукте, его функциях и получить руководство для программистов, ознакомьтесь с кратким описанием списка функций, Aspose.Cells. Документация по GridWeb и онлайн-рекламаДемо

Aspose.Cells

Aspose.Cells— это компонент отчетности по электронным таблицам Excel, который позволяет вам читать и писать электронные таблицы Excel без использования Microsoft Excel, устанавливаемого на клиентской или серверной стороне.Aspose.Cells — это многофункциональный компонент, который предлагает гораздо больше, чем просто экспорт данных. СAspose.Cells разработчики могут экспортировать данные, форматировать электронные таблицы во всех деталях и на каждом уровне, импортировать изображения, импортировать диаграммы, создавать диаграммы, манипулировать диаграммами, передавать данные Excel в потоковом режиме, сохранять в различных форматах, включая XLS, CSV, SpreadsheetML, TabDelimited, TXT, XML (Aspose.Pdf комплексные) и многое другое.Aspose.Cells предлагает простой в использовании, многофункциональныйAPI для программистов. Он имеет огромный список функций. Чтобы узнать больше о продукте, его функциях и получить руководство программиста, ознакомьтесь с кратким описаниемСписок функций, Aspose.Cells Документация и онлайн-демонстрации. Вы можетескачать его оценочная версия бесплатно.

Проектирование интерфейса

Мы начинаем создавать новое веб-приложение Asp.Net в Visual Studio.Net.

яДобавить ссылкук трем компонентам ieAspose.Cells.GridWeb.dll, Aspose.Chart.dll и Aspose.Cells.dll к проекту в первую очередь. Я помещаю некоторые элементы управления на страницу и устанавливаю их свойства, т.е. выпадающий список, командную кнопку и метку. затем я размещаюAspose.Cells.GridWeb****контроль(GridWeb) к нему из панели инструментов, так как после добавления ссылок на три компонентаGridWebэлемент управления появился на панели инструментов. Два других компонента (Aspose.ChartиAspose.Cells) — это просто библиотеки, которые ссылаются только на проект.

Также создаю две папки “file” и “images”, добавляю в эти папки соответственно “Products.xml” и “chart.gif”. Файл xml представляет собой файл источника данных, из которого будут извлекаться данные для заполненияGridWebрабочий лист. Файл изображения предоставит изображение для пользовательской кнопки, размещенной наGridWebконтроль.

Теперь я создаю пользовательскую командную кнопку. Я просто щелкаю правой кнопкой мыши поGridWebуправления и нажмите «Пользовательские кнопки управления…».

Это активирует редактор пользовательских командных кнопок, редактор позволяет создавать пользовательские кнопки изображения команд с прикрепленной подсказкой. Я указываю значения для некоторых свойств кнопки, например, Command (Name) -> “btnChart”, ImageUrl -> указать путь к файлу изображения (“chart.gif”) и ToolTip -> дать всплывающую подсказку.

Итак, пользовательская командная кнопка добавлена, как вы можете видеть (обведена красным цветом) на следующем снимке экрана.

дело:изображение_альтернативный_текст

Наконец, я установил некоторые атрибуты шрифта (выделены полужирным шрифтом) для метки и командной кнопки. Я также регулирую размер элементов управления, чтобы получить окончательный вид.

дело:изображение_альтернативный_текст

Получение данных из XML-файла

Ниже приведена файловая структура XML, используемая в проекте.

Структура XML-файла

XML

 <?xml version="1.0" standalone="yes"?>

<SalesData>

  <Products>

    <ProductName>Data</ProductName>

    <QuantityPerUnit>Data</QuantityPerUnit>

    <CategoryName>Data</CategoryName>

    <UnitPrice>Data</UnitPrice>

    <Sale>Data</Sale>

  </Products>

 .........

</SalesData>
 private void Page_Load(object sender, System.EventArgs e)

{

if (!IsPostBack)

{

	// Uncomment the code below when you have purchased license

	// for Aspose.Cells.GridWeb, Aspose.Chart and Aspose.Cells. You need

	// to deploy the licenses in the same folder as your executable,

      // alternatively you can add the license files as an embedded

      // resource to your project.

	//

	// Set the license for Aspose.Cells.GridWeb

	// Aspose.Cells.GridWeb.License gridwebLicense = new

	// Aspose.Cells.GridWeb.License();

	// gridwebLicense.SetLicense("Aspose.Grid.lic");

	//

	// // Set the license for Aspose.Chart

	// Aspose.Chart.License chartLicense = new

	// Aspose.Chart.License();

	// chartLicense.SetLicense("Aspose.Chart.lic");

	//

	// // Set the license for Aspose.Cells

	// Aspose.Cells.License cellsLicense = new

	// Aspose.Cells.License();

	// cellsLicense.SetLicense("Aspose.Cells.lic");

	//Create a DataSet object.

	DataSet ds = new DataSet();

	//Get the Virtual Folder Path.

	string path = MapPath(".");

	//Reads XML data from xml file into DataSet object.

	ds.ReadXml(path + "\\file\\Products.xml");

	//Call the custom method to obtain distinct values from

	//CategoryName field and store data into an object array.

	object [] drs = GetDistinctValues(ds.Tables[0],"CategoryName");

	//Fill the drop down list with distinct field items.

	for(int i = 0;i<drs.Length;i++)

	{

		DropDownList1.Items.Add(drs[i].ToString());

	}

}

}

//This method is used to filter distinct values from CategoryName field in the datatable.

private object[]GetDistinctValues(DataTable dtable, string colName)

{

	// Create a Hashtable object.

	Hashtable hTable = new Hashtable();

	// Loop through the datatable rows and add distinct values to

	// Hashtable object minimizing the duplicates in the field.

	foreach (DataRow drow in dtable.Rows)

	if(!hTable.ContainsKey(drow[colName]))

	hTable.Add(drow[colName], string.Empty);

	// Create an object array based on the distinct key values of the Hashtable object.

	object[] objArray = new object[hTable.Keys.Count];

	// Copy the disctinct values to fill the array.

	hTable.Keys.CopyTo(objArray, 0);

	// Return the array object.

	return objArray;

}

Заполнение рабочего листа элемента управления Aspose.Cells.GridWeb данными

Я использую некоторые API изGridWebдля заполнения рабочего листа данными из исходного XML-файла. Я пишу код в обработчике кликов командной кнопки (с надписью «Показать отчет»). Отчет данных фильтруется на основе выбранного элемента из раскрывающегося списка.

 //Clears datasheets of the GridWeb control.

GridWeb1.WebWorksheets.Clear();

//Create a DataSet object.

DataSet ds = new DataSet();

//Get the Virtual Folder path.

string path = MapPath(".");

//Reads XML data from xml file into DataSet object.

ds.ReadXml(path + "\\file\\Products.xml");

//Create a DataView based on the datatable.

DataView dv = new DataView(ds.Tables[0]);

//Filter data in the DataView object based on the selected drop down list item.

dv.RowFilter = "CategoryName ='" + DropDownList1.SelectedItem.Text + "'";

//Importing data from the filtered DataView object to create and

//fill "Products" Worksheet start from A4 cell.

GridWeb1.WebWorksheets.ImportDataView(dv, null, null,"Products",3,0);

Форматирование данных в Cells

Чтобы различать различные типы информации на рабочем листе, для оптимального отображения данных на вашем рабочем листе и для облегчения сканирования рабочего листа, вы форматируете рабочий лист. АФорматпредставляет собой стиль и определяется как набор характеристик, таких как шрифты и размеры шрифта, числовые форматы, границы ячеек, затенение ячеек сплошным цветом фона или определенным цветовым шаблоном, отступы, выравнивание и ориентация текста в ячейках.

Я объединяю еще несколько строк кода выше. Я размещаю заголовок/подзаголовок отчета, форматирую заголовок, подзаголовок и ячейки с подробностями. Я также применяю форматирование чисел к двум полям (устанавливаю числовой формат валюты в поля UnitPrice и Sale) и настраиваю высоту/ширину строк и столбцов, используяAspose.Cells.GridWebAPI.

 //Создаем ячейку заголовка (A1) на листе и применяем форматирование.

//Следующие строки вводят в ячейку строковое значение, указываем

//размер шрифта, указать параметры горизонтального и вертикального выравнивания, установить

//цвета переднего плана и фона и объединение ячеек (A1:E2).

Лист WebWorksheet = GridWeb1.WebWorksheets[0];

лист.Cells["A1"].PutValue("Продажи товаров по категориям");

лист.Cells["A1"].Style.Font.Size = новый FontUnit("20pt");

лист.Cells["A1"].Style.HorizontalAlign = HorizontalAlign.Center;

лист.Cells["A1"].Style.VerticalAlign = VerticalAlign.Middle;

лист.Cells["A1"].Style.BackColor = Color.SkyBlue;

лист.Cells["A1"].Style.ForeColor = Color.Blue;

лист.Cells.Объединить(0, 0, 2, 5);

//Создаем ячейку подзаголовка (A3) на листе и применяем форматирование.

//Следующие строки вводят в ячейку строковое значение, указываем

//размер шрифта с атрибутами, указать горизонтальное и вертикальное выравнивание

//настройки, установить цвета переднего плана и фона и объединить ячейки

//(А3:Е3).

лист.Cells["A3"].PutValue(DropDownList1.SelectedItem.Text);

лист.Cells["A3"].Style.Font.Size = новый FontUnit("13pt");

лист.Cells["A3"].Style.Font.Bold = true;

лист.Cells["A3"].Style.Font.Italic = true;

лист.Cells["A3"].Style.HorizontalAlign = HorizontalAlign.Left;

лист.Cells["A3"].Style.VerticalAlign = VerticalAlign.Middle;

лист.Cells["A3"].Style.BackColor = Color.SeaGreen;

лист.Cells["A3"].Style.ForeColor = Color.Yellow;

лист.Cells.Объединить(2, 0, 1, 5);

//Получить индексы последней строки и столбца (которые содержат данные).

int totalrow = лист.Cells.MaxRow +1;

int totalcol = лист.Cells.MaxColumn;

//Получить лист Cells collections

Ячейки WebCells = лист.Cells;

//Определяем объект Cell.

ячейка WebCell;

//Проходим по данным на листе и форматируем два поля с помощью

// Стиль номера валюты.

для (целое i = 4;i<=totalrow;i++)

{

	//Format the Sale Column.

	cell = cells[i,totalcol];

	cell.PutValue(cell.StringValue,true);

	cell.NumberType = NumberType.Currency1;

	//Format the UnitPrice Column.

	cell = cells[i,totalcol-1];

	cell.PutValue(cell.StringValue,true);

	cell.NumberType = NumberType.Currency1;

}

//Insert the Total row with data, formula and formatting style.

//It will calculate the total Sales of a Category.

cells[totalrow,0].PutValue( DropDownList1.SelectedItem.Text + " Total" );

cells[totalrow,0].Style.Font.Bold = true;

cells[totalrow,totalcol].Formula = "=SUM(E5:E" + totalrow.ToString() + ")";

cells[totalrow,totalcol].Style.Font.Bold = true;

//Specify some Row and Column formattings. It will set row height

//and column width accordingly.

cells.SetRowHeight(2, new Unit("17pt"));

cells.SetColumnWidth(0, new Unit("157pt"));

cells.SetColumnWidth(1, new Unit("106pt"));

cells.SetColumnWidth(2, new Unit("87pt"));

cells.SetColumnWidth(3, new Unit("56pt"));

cells.SetColumnWidth(4, new Unit("50pt"));

Создание отформатированного отчета (файл .XLS) с графиком с использованием компонента Aspose.Cells

Теперь я напишу код для сохранения отформатированного отчета с графиком на диск. я используюGridWeb хСохранятькнопка,GridWeb хСохранитьКомандасобытие запускается, когда вы нажимаете кнопку «Сохранить», поэтому я справлюсь с этим. Здесь я используюAspose.Cellsкомпонент для экспорта отформатированного отчета в MS Excel, создания диаграммы и встраивания ее в выходной файл Excel. Я не вставил изображение диаграммы (созданныйAspose.Chartкомпонент), а создайте аналогичную диаграмму, используя API изAspose.Cellsтак что вы можете редактировать диаграмму в MS Excel для ваших нужд.

 //This GridWeb control event is fired when you click on the "Save" button

//of the control. After Clicking this button "File Download" dialog is

//displayed and you may open into MS Excel / save the output excel file //with graph to disk.

private void GridWeb1_SaveCommand(object sender, System.EventArgs e)

{

	//Create MemoryStream object.

	System.IO.MemoryStream ms = new System.IO.MemoryStream();

	//Save the GridWeb's Report to the stream.

	this.GridWeb1.WebWorksheets.SaveToExcelFile(ms);

	//Create a new Workbook.

	Workbook workbook = new Workbook();

	//Open the stream into the Workbook.

	workbook.Open(ms);

	//Call the custom method which creates Chart.

	Workbook book = CellsChart(workbook);

	//Save the excel file displaying "File Download" dialog box.

	book.Save(ms, FileFormatType.Default);

	this.Response.ContentType = "application/vnd.ms-excel";

	this.Response.AddHeader("content-disposition", "attachment; filename=Export.xls");

	this.Response.BinaryWrite(ms.ToArray());

}

//This custom method is used to create the Chart based on the data source

//range in the GridWeb control. In this method we will use Aspose.Cells

//APIs to create the graph which will be saved later into the output //excel file.

private Workbook CellsChart(Workbook workbook)

{

	//Get the first Worksheet.

	Aspose.Cells.Worksheet sheet = workbook.Worksheets[0];

	//Get the Cells collection in the sheet.

	Aspose.Cells.Cells cells = workbook.Worksheets[0].Cells;

	//Get the last row index.

	int maxrow = sheet.Cells.MaxDataRow;

	//Unmerge the cells.

	sheet.Cells.UnMerge(maxrow,0,15,10);

	int chartIndex = 0;

	//Add a new Chart into the sheet's Chart Collection.

chartIndex = sheet.Charts.Add(Aspose.Cells.ChartType.Pie,maxrow,0,maxrow+28,5);

	//Get the Chart object.

	Aspose.Cells.Chart chart = sheet.Charts[chartIndex];

	//Set the Chart Area.

	Aspose.Cells.ChartArea chartarea = chart.ChartArea;

	chartarea.Area.Formatting = FormattingType.Custom;

	chartarea.Border.IsVisible = false;

		chartarea.Area.FillFormat.SetTwoColorGradient(Color.PowderBlue, Color.LightSkyBlue, GradientStyleType.FromCenter,1);

	//Set some properties of Chart Plot Area.

	chart.PlotArea.Area.Formatting = FormattingType.None;

	chart.PlotArea.Border.IsVisible = false;

	//Set properties of Chart Title.

	chart.Title.Text = DropDownList1.SelectedItem.Text + " Sales";

	chart.Title.TextFont.Size = 20;

	//Set properties of NSeries

	int lastdatarow = maxrow-1;

	chart.NSeries.Add("E5:E" + lastdatarow.ToString(), true);

	chart.NSeries.CategoryData = "A5:A" + lastdatarow.ToString();

	//Set the Data Labels in the chart

	Aspose.Cells.DataLabels datalabels;

	for ( int i = 0; i < chart.NSeries.Count ;i ++ )

	{

		datalabels = chart.NSeries[i].DataLabels;

		datalabels.Postion = Aspose.Cells.LabelPositionType.Center;

		datalabels.IsPercentageShown = true;

	}

	//Set the Legend settings.

	Aspose.Cells.Legend legend = chart.Legend;

	legend.Position = Aspose.Cells.LegendPositionType.Bottom;

	legend.Height = 85;

	legend.Width = 330;

	legend.AutoScaleFont = true;

	legend.Border.Color = Color.Blue;

	legend.Area.Formatting = FormattingType.Custom;

	FillFormat fillformat = legend.Area.FillFormat;

	legend.Area.Formatting = FormattingType.None;

	legend.Border.IsVisible = false;

	//Autofit the first column.

	sheet.AutoFitColumn(0);

	//Return the Workbook.

	return workbook;

}

Запуск приложения

Теперь запускаю приложение. Выпадающий список заполнен отдельными категориями.

дело:изображение_альтернативный_текст

Я выбираю категорию, по которой хочу показать отчет о продажах и нажимаю кнопку “Показать отчет”.

дело:изображение_альтернативный_текст

Итак, отчет отображается вGridWebв зависимости от выбранной категории. Отчет форматируется по умолчанию на основе кода (написанного ранее).

дело:изображение_альтернативный_текст

Если вы хотите отформатировать данные в некоторых ячейках в режиме WYSIWYG, вы можете сделать это довольно легко.Aspose.Cells.GridWebобеспечиваетФормат Cellsредакторе, выберите нужную ячейку (ячейки) и щелкните ее правой кнопкой мыши, выберите параметр «Формат Cell…».

дело:изображение_альтернативный_текст

Появится диалоговое окно Формат Cell.

дело:изображение_альтернативный_текст

Я указываю некоторые атрибуты шрифта и нажимаю «ОК».

дело:изображение_альтернативный_текст

И получить результат.

дело:изображение_альтернативный_текст

Помимо форматирования ячеек, вы также можете редактировать значения ячеек. Дважды щелкните нужную ячейку (ячейки) и отредактируйте значение.

дело:изображение_альтернативный_текст

Для отправки результата редактирования и пересчета всей формулы я нажимаю соответствующую кнопку (обведенную красным цветом), чтобы обновить отчет.

дело:изображение_альтернативный_текст

Теперь я создам диаграмму и вставлю ее в элемент управления. Я нажимаю пользовательскую кнопку команды (обведенную красным цветом), чтобы создать круговую диаграмму на основе диапазона данных.

дело:изображение_альтернативный_текст

Наконец, я экспортирую этот отчет с графиком в MS Excel. я нажимаюСохранятькнопка (обведена красным цветом). Нажав наСохранятькнопка будет отображатьсяЗагрузка файладиалог, вы можете либоОткрытымполученный отчет (выходной файл excel с графиком) в MS Excel или сохранить на диск.

дело:изображение_альтернативный_текст

Когда я нажимаю кнопку «Открыть» (диалоговое окно «Загрузка файла»), отчет Excel с графиком экспортируется в MS Excel. Показана верхняя часть отчета.

дело:изображение_альтернативный_текст

Показана нижняя часть отчета Excel.

дело:изображение_альтернативный_текст