找回密码
 立即注册

QQ登录

只需一步,快速开始

Lenka.Guo 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-8-28 17:15  /   查看:3114  /  回复:0
客户需求:
客户只需要简单的二维表展示,二维表中的所有列都是根据输入SQL 语句后,执行的查询结果,来展示所选择的数据列。
因为又牵扯到MVC+Angular+.Net Core平台展示,所以在这个需求内,需要使用报表的API来动态生成报表,其实报表结构不复杂,主要修改Startup.cs 类中。


1. 在 Startup.cs
  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2.         {
  3.             app.UseDeveloperExceptionPage();

  4.             app.UseStaticFiles();
  5.             app.UseSpaStaticFiles();

  6.             // Configure reporting to get reports from folder.
  7.             // You can also use the reports embedded into the assembly (UseEmbeddedTemplates method)
  8.             // or your own reports store (UseCustomStore method).
  9.             app.UseReporting(settings =>
  10.             {
  11.                 //settings.UseEmbeddedTemplates(EmbeddedReportsPrefix, Assembly.GetAssembly(GetType()));
  12.                 settings.UseCustomStore(GetReport);
  13.                 settings.UseCompression = true;
  14.             });

  15.             app.UseMvc(routes =>
  16.             {
  17.                 routes.MapRoute(
  18.                     name: "default",
  19.                     template: "{controller}/{action=Index}/{id?}");
  20.             });

  21.             app.UseSpa(spa =>
  22.             {
  23.                 spa.Options.SourcePath = "ClientApp";

  24.                 if (env.IsDevelopment())
  25.                 {
  26.                     spa.UseAngularCliServer(npmScript: "start");
  27.                 }
  28.             });
  29.         }
复制代码


2. 在GetReport 方法里面调用报表API 生成报表


  1.         private object GetReport(string arg)
  2.         {
  3.             
  4.             int columnNumber=3;// 用于获取前台传递SQL 语句的列数,根据数量去生成表格的列数量
  5.             int tableTextbox = columnNumber * 2;
  6.             GrapeCity.ActiveReports.PageReportModel.Report report = new GrapeCity.ActiveReports.PageReportModel.Report();
  7.             // 从 SQL 语句中获取到列名,及为表格控件绑定数据字段,前三个为列标题,后三个为数据字段引用
  8.             String[] columnNameFromSQL = new String[6] { "MoviedID", "Title", "YearReleased", "=Fields!MoviedID.Value", "=Fields!Title.Value", "=Fields!YearReleased.Value" };
  9.             report.Body.Height = "5cm";
  10.             report.Width = "20cm";

  11.             // 根据列名及字段名创建表格控件,用于展示报表
  12.             Table tb = CreateTable(columnNumber,columnNameFromSQL);
  13.             report.Body.ReportItems.Add(tb);
  14.             report = AddDataSetDataSource(report);
  15.             
  16.             return report;



  17.         }
复制代码


3. 添加数据源和数据集

  1.   private Table CreateTable(int NumOfColumn,String[] NameOfField)
  2.         {
  3.             Table table = new Table();
  4.             table.Name = "Table1";

  5.             TextBox[] tableTextBoxes = new TextBox[NumOfColumn*2];
  6.             TableCell[] tableCells = new TableCell[NumOfColumn*2];
  7.             TableRow[] tableRows = new TableRow[2];
  8.             TableColumn[] tableColumns = new TableColumn[NumOfColumn];
  9.             String[] textBoxValues = new String[] { };
  10.             textBoxValues = NameOfField;
  11.             //定义表格的列宽
  12.             String[] columnsWidth = new String[] { "3cm", "3cm", "3cm" };
  13.             String[] rowsHeight = new String[] { "1.5cm", "1.5cm" };

  14.             //Setting properties for the Textboxes to be placed in the TableCells
  15.             for (int i = 0; i < tableTextBoxes.Length; i++)
  16.             {
  17.                 tableTextBoxes.SetValue(new TextBox(), i);
  18.                 tableTextBoxes[i].Name = "textBox" + (i + 1);
  19.                 tableTextBoxes[i].Value = ExpressionInfo.FromString(textBoxValues[i]);
  20.                 tableTextBoxes[i].Style.PaddingBottom = tableTextBoxes[i].Style.PaddingLeft = tableTextBoxes[i].Style.PaddingRight = tableTextBoxes[i].Style.PaddingTop = ExpressionInfo.FromString("2pt");
  21.                 tableTextBoxes[i].Style.TextAlign = ExpressionInfo.FromString("Left");
  22.                 tableCells.SetValue(new TableCell(), i);
  23.                 tableCells[i].ReportItems.Add(tableTextBoxes[i]);//Adding the TextBoxes to the TableCells
  24.                 if (i < rowsHeight.Length)
  25.                 {
  26.                     tableRows.SetValue(new TableRow(), i);
  27.                     tableRows[i].Height = "1.25cm";
  28.                     table.Height += "1.25cm";
  29.                 }
  30.                 if (i < columnsWidth.Length)
  31.                 {
  32.                     tableColumns.SetValue(new TableColumn(), i);
  33.                     tableColumns[i].Width = columnsWidth[i];
  34.                     table.Width += columnsWidth[i];
  35.                     table.TableColumns.Add(tableColumns[i]);
  36.                     tableCells[i].ReportItems[0].Style.BackgroundColor = ExpressionInfo.FromString("LightBlue");
  37.                     tableRows[0].TableCells.Add(tableCells[i]);
  38.                 }
  39.                 else
  40.                 {
  41.                     tableCells[i].ReportItems[0].Style.BackgroundColor = ExpressionInfo.FromString("=Choose((RowNumber("Table1") +1) mod 2, "PaleGreen",)");
  42.                     tableRows[1].TableCells.Add(tableCells[i]);
  43.                 }
  44.             }
  45.             table.Header.TableRows.Add(tableRows[0]);
  46.             table.Details.TableRows.Add(tableRows[1]);
  47.             table.Top = "1cm";
  48.             table.Left = "0.635cm";




  49.             return table;
  50.         }
复制代码



4. 添加 AddDataSetDataSource 方法为报表绑定数据源
  1. public static Report AddDataSetDataSource(Report report)
  2.         {
  3.             // 以 DataSet数据集为示例,通过输入SQL 语句获取到查询结果后后传递给报表即可
  4.             // create DataSource for the report
  5.             DataSource dataSource = new DataSource();
  6.             dataSource.Name = "Reels Database";
  7.             dataSource.ConnectionProperties.DataProvider = "OLEDB";
  8.             dataSource.ConnectionProperties.ConnectString = ExpressionInfo.FromString(@"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=Data\Reels.mdb");
  9.             //Create DataSet with specified query and load database fields to the DataSet
  10.             DataSet dataSet = new DataSet();
  11.             Query query = new Query();
  12.             dataSet.Name = "Sample DataSet";
  13.             query.DataSourceName = "Reels Database";
  14.             query.CommandType = QueryCommandType.Text;
  15.             query.CommandText = ExpressionInfo.FromString(@"SELECT Movie.MovieID, Movie.Title, Movie.YearReleased FROM Movie ORDER BY Movie.YearReleased");
  16.             dataSet.Query = query;

  17.             String[] fieldsList = new String[] { "MoviedID", "Title", "YearReleased" };

  18.             foreach (string fieldName in fieldsList)
  19.             {
  20.                 Field field = new Field(fieldName, fieldName, null);
  21.                 dataSet.Fields.Add(field);
  22.             }
  23.             //create report definition with specified DataSet and DataSource
  24.             report.DataSources.Add(dataSource);
  25.             report.DataSets.Add(dataSet);
  26.             return report;
  27.         }
复制代码




0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部