astReport 2018.2支持導出中的矢量圖形,現在一些條形碼和SVG圖像以矢量形式導出,適用于導出為PDF,HTML和SVG。條形碼——只能將線性條形碼導出為矢量圖像,在當前版本的2018.2.22中,在PDF導出設置窗口中添加了矢量圖像設置的特殊選項卡——“Vector Graphics矢量圖形”。
這里我們有兩種類型的設置——漸變質量和曲線。漸變的質量影響過渡的平滑度,即陰影的數量,漸變插值確定點處的漸變的維度。曲線插值允許繪制具有給定數量的段的曲線,相反,指定將用于創建段的點數,插值使曲線更圓,插值越高,獲得的曲線越圓。舊版本的一些PDF閱讀器在顯示矢量圖形方面存在問題,因此FastReport開發了自己的曲線構建器,如果關閉插值選項,PDF閱讀器將選擇如何構建曲線。
下面來看看漸變設置,PDF中的漸變是在漸變網格上生成的,即生成網格,在網格節點上計算網格顏色,然后創建復雜漸變。漸變的質量會影響將生成的網格的大小,漸變質量越高,生成的網格就越準確。但是,圖像創建的速度將受到影響,漸變的插值顯示PDF中將使用的網格大小,值越高,越漂亮,但磁盤上將占用更多空間。如果設置低質量并插值256,則這是漸變的外觀:
高質量,插值256。
眼睛幾乎看不到差異,但在復雜的梯度上可以更好地看到這種差異。例如,低質量:
高質量。
但是,如果將梯度插值的值更改為最小值,則通常的線性漸變會立即顯示出差異。例如,插值2:
插值為16:
現在考慮曲線的插值是如何操作的,例如有一個SVG圖像——圓圈,使用標簽實現:
使用8段進行渲染,設置值8來插入曲線:
插值越大,曲線越圓,例如,通過較大的圓圈近似,可以看到:
可以看出,圓圈完全不是圓形的,它由許多部分組成。這里的情況與曲線完全相同,畢竟,符號也包含曲線。因此,文本插值的值越大,看起來越“定性”。“為什么需要這些設置?顯然,需要使用最大設置來獲得高質量的圖像。 但是高設置會顯著增加生成文件的大小。如果不需要最高質量的漸變和曲線,可以犧牲它們來減小文檔的大小并提高其創建速度。 乍一看,新選項似乎對普通用戶沒什么用處,但是那些使用矢量圖形的人會青睞它們,FastReport提供了SVG圖像渲染器。
點擊“了解更多”下載產品最新版
↓↓↓
ASTREPORT VCL提供了創建報表所需的所有工具,包括報表引擎,可視化的報表設計器,預覽窗口,對話框設計工具,以及Pascal-like 宏解釋程序。它可用于在Embarcadero(比如Borland和CodeGear)Delphi 7-XE8和C++Builder 2005-XE8、Embarcadero RAD Studio 10 Seattle等開發工具中。
報告生成器FastReport VCL是一種在您的軟件中集成商業智能的現代解決方案。它是為希望使用現成組件進行報告的開發人員創建的,具有使用簡單、方便和小型分發的特點,幾乎可以在任何現代PC上提供高性能和高性能。
FastReport VCL v6.5.7最新試用版+編譯演示demo下載:https://www.fastreportcn.com/download.html
Delphi報表神器FastReport VCL v6.5.7來啦!那些個糟心BUG已修復
看看讓你頭疼的問題是否已解決?
-修復了DataMatrix c40和txt編碼的特殊符號
-修復了在Windows 10下在RichView控件中加載RTF文件的問題(有時以純文本格式加載)
+將GS1Rule屬性添加到DataMatrix條形碼(自動支持GS1規則)
-修復了XObject列表在每頁上都清除時PDF導出中的錯誤,該錯誤會增加帶有圖片的PDF文件的大小
+為所有條形碼類型添加了新的ColorBar屬性(設置條形碼數據的顏色)
-修復了大型XLS(Excel 97 BIFF8)文件中的錯誤
-修復了客戶端/服務器組件中的導出文件名(從Web瀏覽器)
-修復了使用GapX, GapY < 0的PDF導出
[6.5.1-6.5.5]
-修復了從Web瀏覽器導出帶有對話框頁面的報表時的客戶端/服務器組件
-修復了MDI預覽中的快速按鈕
-針對frxSynMemo的HiDPI修復:保存/加載不同DPI、GutterWidth、線條標記、斷點標記的字體大小
-針對RegEditorsDialog的HiDPI修復:復選框、組合框箭頭、首次顯示時的下拉列表寬度
-修復了HiDPI報表設計器中StatusBar上圖標的繪制
-修復了HiDPI的TfrxTreePanel FileterMinWidth/FileterMaxWidth
-修復了字體組合框預覽(HiDPI)中的字體大小
-修復了字體組合框(HiDPI)中的字體預覽位置
-修復了當主監視器的縮放比例大于150%時,在HiDPI模式下的band字幕
-修復了HiDPI中的TfrxComboBox.ListWidth(具有HiRes的主監視器)
-修復了在HiDPI Per-Monitor V2模式下的系統對話框(字體/顏色)
-修復了報表設計器中ComboBox位置的低自定義縮放比例(小于150%)
-修復了HiDPI模式下的frxProgress對話框
-修復了低縮放值(小于150%)的圖像資源
-修復了數據集編輯器中的錯誤錨點
-修復了關閉預覽后內部數據集的數據樹閃爍的問題
點擊“了解更多”免費體驗最新版,附編譯演示demo,用戶手冊,幫助文檔
們已經討論過如何將報表發送到數據庫中的一組電子郵件。在本文中,我們將做同樣的事情,但對于.Net Core MVC平臺上的Web應用程序。我們的任務是從某個數據庫中獲取電子郵件地址和用戶名列表,并將帶有附加報表的電子郵件發送到這些郵箱。我們使用MS SQL Server數據庫。
創建一個ASP應用程序.Net Core MVC應用程序。首先,使用NuGet Packages Manager將必要的庫添加到項目中。在一般的nuget存儲庫中,我們找到并安裝包:
從本地存儲庫 - FastReport.Net安裝目錄中的Nuget文件夾,安裝軟件包:
現在我們將使用數據庫和表的類本質創建工作上下文。為此,請打開包控制臺Nuget。打開Tools - > Nuget Package Manager - >Package Manager Console menu(包管理器控制臺菜單)。在控制臺中,鍵入以下命令:
Server=localhost;Database=testdb;Trusted_Connection=True;
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 當然,在這里您必須指定數據庫服務器的連接字符串和數據模型的文件夾(默認情況下為Models)。
PM> scaffold-dbcontext“Server = localhost; Database = testdb; Trusted_Connection = True;”
Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 之后,理論上,應該將兩個文件添加到Models文件夾:context和table實體。在我的例子中,這是testdbContext.cs和Emails.cs。 但是,在文件生成期間可能會發生錯誤:
錯誤MSB4064:“Csc”任務不支持“SharedCompilationId”參數。
有一個可設置的公共實例屬性。 如果發生這種情況,請在NuGet包管理器中再添加一個包:
Microsoft.Net.Compillers
讓我們馬上將FastReport連接到我們的項目。在Startup.cs文件中,添加以下行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); … }
現在回到數據模型。要從數據庫中獲取記錄,我們需要創建GetEmails方法。創建用于處理數據的類Facade:
namespace WebMailing.Models { public static class Facade { public static List<Emails> GetEmails() { using (Models.testdbContext context = new Models.testdbContext()) { var emails = (from adresses in context.Emails select adresses).ToList(); return emails; } } } }
我們來看看'HomeController'控制器吧。在Index方法中,加載報表以在站點的主頁上顯示它:
using System; using System.Collections.Generic; using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using WebMailing.Models; using FastReport; using FastReport.Export.Pdf; using FastReport.Export.Email; using FastReport.Web; … public IActionResult Index() { WebReport webReport = new WebReport(); webReport.Report.Load(Environment.CurrentDirectory + "/text.frx"); ViewBag.WebReport = webReport; return View(); }
我們將添加兩種發送電子郵件的方法。第一個將在問候語中發送帶有客戶名稱的私人信件,第二個將向一組地址發送一個字母。 所以,第一種方法是:
[HttpPost] public ActionResult SendMail() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export List<Emails> emails = Models.Facade.GetEmails(); foreach (Emails item in emails) { SendMessage(report1, pdf, email, item.Email, item.Name); } return View(); }
使用它,我們創建了一個報表,導出為PDF,導出到電子郵件。然后,在循環中,我們從表中獲取記錄并調用發送字母的方法。作為參數,我們傳遞報表對象,導出PDF,導出到電子郵件,電子郵件地址和客戶端名稱。以下是發送信件的方法:
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName) { string message = "This is test message."; email.Account.Address = "gromozekaster@yandex.ru"; email.Account.Name = "Test User"; email.Account.Host = "smtp.yandex.ru"; email.Account.Port = 25; email.Account.UserName = "Gromozekaster"; email.Account.Password = "*****"; //Your password email.Account.MessageTemplate = "Test"; email.Account.EnableSSL = true; //email addressee settings email.Address = recipient; email.Subject = "TestMessage"; email.MessageBody = custName is null ? message : string.Format("Dear, {0}! {1}", custName, message); email.Export = pdf; //Set export type email.SendEmail(report); //Send email }
在其中,我們設置了一個電子郵件客戶端來發送信件。并立即添加第二種方法,將一個字母發送到一組地址:
[HttpPost] public ActionResult SendAll() { Report report1 = new Report(); //Create new report object report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report report1.Prepare(); //Prepare report PDFExport pdf = new PDFExport(); //Cteate PDF export EmailExport email = new EmailExport(); //Create Email export List<Emails> emails = Models.Facade.GetEmails(); string addresses = ""; foreach (Emails item in emails) { if (addresses == "") addresses = item.Email; else addresses = addresses + ", " + item.Email; } SendMessage(report1, pdf, email, addresses, null); return View(); }
正如您所看到的,它與之前的方法非常相似,唯一的區別是在循環中我們收到所有電子郵件地址,并發送一次這封信。作為電子郵件參數,我們傳遞一個包含所有電子郵件地址的字符串變量,但我們不傳遞客戶端名稱。
對于SendMail()和SendAll()方法,我們需要創建相同名稱的視圖 - 視圖。 他們的內容非常簡單:
@{ ViewBag.Message = "Report was sent"; } @ViewBag.Message
我們只是告知發送。讓我們轉到Index.cshtml視圖。在其中,我們需要添加兩個按鈕來使用不同的方法發送字母,以及顯示報表:
@{ ViewData["Title"] = "Home Page"; } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script> <form action="SendMail" method="POST"> <input type="button" id="SendPersonal" value="Send Personal Email"> <input type="button" id="SendAll" value="Send Email to All"> <div class="answer"/> </form> <script type="text/javascript"> $('#SendPersonal').on("click", function () { $.ajax({ type: 'POST', // dispatch method url: '@Url.Action("SendMail", "Home")', // path to handler dataType: 'text', success: function (data) { $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer } }); return false; }) $('#SendAll').on("click", function () { $.ajax({ type: 'POST', // dispatch method url: '@Url.Action("SendAll", "Home")', // path to handler dataType: 'text', success: function (data) { $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer } }); return false; }) </script> @await ViewBag.WebReport.Render()
要使用ajax jquery,我們添加了一個指向jquery.min.js腳本的鏈接。接下來,為每個表單添加一個帶有兩個按鈕和兩個腳本的表單。腳本非常簡單 - 從控制器調用方法并返回結果視圖。
最后 - 我們從Index方法推導出報表。讓我們運行應用程序,看看我們的網頁是什么樣的:
我們通過不同的方式發信:
和:
在第一種情況下,在信函的文本中,我們通過名稱引用客戶端,在第二種情況下,沒有,就這樣。
點擊“了解更多”下載產品最新試用版
↓↓↓
*請認真填寫需求信息,我們會在24小時內與您取得聯系。