Los informes son una parte integral del flujo de trabajo y los informes electrónicos, del flujo de trabajo electrónico. Uno de los mecanismos principales para repartir informes electrónicos es através del correo electrónico. Quizás todos los generadores de informes modernos tengan un cliente de correo instalado para poder enviar informes directamente desde el programa.
FastReport.Net no es una excepción. Puede enviar informe en el modo de vista previa o directamente a través del código de la aplicación. Esto es conviniente si envia informe a un recipiente único. Aunque sea possible añadir varios recipientes, no es siempre oportuno. Por ejemplo, cuando quiere crear un boletín con el nombre del usario: “Querido Ivan Ivanovich...”. Por lo tanto, vamos a examiner un ejemplo de cómo enviar un informe a varios recipientes cuyos direcciones y nombres se cogen de la base de datos. Primero, cree una base de datos y una tabla dentro. Por ejemplo, base de datos acces en el formato mdb :
Cree una aplicación WinForms : Añada dos botones y campos de texto para los ajustes de e-mail:
El primer botón sirve para mandar informe separadamente y el segundo sirve para mandar informe a una lista de direcciones. Entenderá como funciona todo más tarde del código.
Cada campo tiene un valor por defecto; si quiere, puede establecer un valor distinto.
Cree una fuente de datos de aplicación utilizando el asistente:
A continuación, ajuste la cadena de conexión a la base de datos y seleccione tabla:
Añada al proyecto un hipervínculo a la biblioteca FastReport . También necesitamos un archivo con un modelo de informe que vamos a repartir por correo. Añádalo al proyecto. Por ejemplo, vamos a utilizar el informe text.frx de la carpeta Demo
Ahora cree un manipulador del evento "pulsar el botón Direct email".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Data; using System.Windows.Forms; using FastReport; using FastReport.Utils; using FastReport.Export.Pdf; using FastReport.Export.Email; private void SendReport_Click(object sender, EventArgs e) { Config.ReportSettings.ShowProgress = false; //Disable progress window 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 EmailsDataSet ds = new EmailsDataSet(); EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter(); adapter.Fill(ds.Customer); DataTable table = ds.Customer; foreach (DataRow row in table.Rows) { SendMessage(report1, pdf, email, row["Email"].ToString(), row["Name"].ToString()); } } |
Aquí primero cree objeto del informe, cargue el modelo en él y cree Exportar en PDF y E-mail. El informe se adjuntará al correo en el formato PDF.
A continuación, tenemos que crear una fuente de datos y rellenar la tabla con datos. Revise las entradas de la tabla y mande un mensaje para cada una. Claro, si tiene una lista larga, este método es muy lento. Pero puede insertar en el texto del correo el nombre del cliente.
Como ve, hemos sacado el enviar del correo a un método separado, SendMessage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName) { email.Account.Address = AddressFromTxt.Text; email.Account.Name = SenderNameTxt.Text; email.Account.Host = HostTxt.Text; email.Account.Port = Convert.ToInt16(PortTxt.Text); email.Account.UserName = UserNameTxt.Text; email.Account.Password = PasswordTxt.Text; email.Account.MessageTemplate = "Test"; email.Account.EnableSSL = true; email.Address = recipient; email.Subject = MailSubjectTxt.Text; email.MessageBody = custName is null? MessageTxt.Text : string.Format("Dear, {0}! {1}", custName, MessageTxt.Text); email.Export = pdf; //Set export type email.SendEmail(report); //Send email } |
Y para el botón Send to all vamos a crear otro manipulador de evento, OnClick .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
private void Send_to_all_Click(object sender, EventArgs e) { Config.ReportSettings.ShowProgress = false; //Disable progress window 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 string emails = ""; EmailsDataSet ds = new EmailsDataSet(); EmailsDataSetTableAdapters.CustomerTableAdapter adapter = new EmailsDataSetTableAdapters.CustomerTableAdapter(); adapter.Fill(ds.Customer); DataTable table = ds.Customer; foreach (DataRow row in table.Rows) { if (emails == "") emails = row["Email"].ToString(); else emails = emails + ", " + row["Email"].ToString(); } SendMessage(report1, pdf, email, emails, null); MessageBox.Show(emails); } |
A diferencia del código anterior, aquí en el ciclo añadimos direcciones para enviar a una variable y después la mandamos al método de enviar correos. Este método funciona mucho más rápido que el anterior, sobre todo si la lista de correo es larga. Aquí mandamos un correo en lugar de varios.
De esta manera, la tarea de enviar informes se reduce a exportar en e-mail y enviar correo a cada dirección desde la base de datos..