TheKhanSoft Ответов: 3

Как сгенерировать PDF зарплатную квитанцию из datagridview в C#


Я делаю отступ, чтобы получить сгенерированную зарплатную квитанцию из каждой строки DataGridView в C#.

Каждая из зарплатных квитанций должна быть:
1 генерируется из одной строки
2 каждая ячейка должна быть включена в соответствующий раздел, т. е. вычет в вычет, основы в основы и т.д.
3 если ячейка в строке пуста или содержит 0, то она не должна быть включена в квитанцию о заработной плате
4 сохранено в формате PDF
5 назван SalarySlip-MonthYear, то есть SalarySlip-July2019
6 отправлено по электронной почте в виде вложения
7 удалено после отправки письма
8 1 - 7 следует повторить для каждого из рядов


Любой мог бы порадовать меня, чтобы создать Салай-слип подобный этому?

SalarySlip-July2019.pdf - Google Диск[^]

Благодарю вас в предвкушении

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Mail;

using System.Web.UI;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using System.Data.OleDb;

namespace TKSSalarySlipSender
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async Task SendPDFEmailAsync(System.Data.DataTable dt)
        {
            using (StringWriter sw = new StringWriter())
            {
                using (HtmlTextWriter dh = new HtmlTextWriter(sw))
                {
                    string companyName = "TheKhanSoft";
                    int orderNo = 2303;
                    StringBuilder sb = new StringBuilder();
                    sb.Append("");
                    sb.Append("Order Sheet");
                    sb.Append("");
                    sb.Append("Order No:");
                    sb.Append(orderNo);
                    sb.Append("Date: ");
                    sb.Append(DateTime.Now);
                    sb.Append(" ");
                    sb.Append("Company Name : ");
                    sb.Append(companyName);
                    sb.Append("");
                    sb.Append("");
                    sb.Append("");
                    sb.Append("");
                    sb.Append("");

                    foreach (DataColumn column in dt.Columns)
                    {
                        sb.Append("");
                        sb.Append(column.ColumnName);
                        sb.Append("");
                    }
                    sb.Append("");
                    foreach (DataRow row in dt.Rows)
                    {
                        sb.Append("");
                        foreach (DataColumn column in dt.Columns)
                        {
                            sb.Append("");
                            sb.Append(row[column]);
                            sb.Append("");
                        }
                        sb.Append("");
                    }
                    sb.Append("");
                    StringReader sr = new StringReader(sb.ToString());

                    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
                    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);

                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
                        pdfDoc.Open();
                        htmlparser.Parse(sr);
                        pdfDoc.Close();
                        byte[] bytes = memoryStream.ToArray();
                        memoryStream.Close();

                        MailMessage mm = new MailMessage("email@gmail.com");
                        mm.Subject = "TheKhanSoft Testing Email";
                        mm.Body = "PDF Attachment";
                        mm.Attachments.Add(new Attachment(new MemoryStream(bytes), "iTextSharpPDF.pdf"));
                        mm.IsBodyHtml = true;
                        SmtpClient smtp = new SmtpClient();
                        smtp.Host = "in-v3.mailjet.com";
                        smtp.EnableSsl = true;
                        NetworkCredential NetworkCred = new NetworkCredential();
                        NetworkCred.UserName = "USERNAME";
                        NetworkCred.Password = "PASSWORD";
                        smtp.UseDefaultCredentials = true;
                        smtp.Credentials = NetworkCred;
                        smtp.Port = 587;
                        smtp.Send(mm);
                        sent = true;
                    }
                }
            }
        }

        
        private void Form1_Load(object sender, EventArgs e)
        {
            cmbSheets.SelectedIndex = 0;
            button1.Enabled = (dataGridView1.RowCount > 0) ? true : false;
        }

        bool sent = false;
        private void button1_Click(object sender, EventArgs e)
        {
          

           // SendPDFEmailAsync(dt);
            
            if (sent)
            {
                MessageBox.Show("Email Sent.");
            }
        }

        string fileName;
        string strConn = string.Empty;
        OleDbConnection con;



        private void getDataFromExcel()
        {
            string sheetName = fileName;
            try
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();  //create openfileDialog Object
                openFileDialog1.Filter = "XML Files (*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb) |*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb";//open file format define Excel Files(.xls)|*.xls| Excel Files(.xlsx)|*.xlsx| 
                openFileDialog1.FilterIndex = 3;
                openFileDialog1.ValidateNames = true;

                openFileDialog1.Multiselect = false;        //not allow multiline selection at the file selection level
                openFileDialog1.Title = "Open Text File-R13";   //define the name of openfileDialog
                openFileDialog1.InitialDirectory = @"Desktop"; //define the initial directory

                if (openFileDialog1.ShowDialog() == DialogResult.OK)        //executing when file open
                {
                    string pathName = openFileDialog1.FileName;
                    fileName = Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
                    


                    FileInfo file = new FileInfo(pathName);
                    if (!file.Exists) { throw new Exception("Error, file doesn't exists!"); }
                    string extension = file.Extension;
                    switch (extension)
                    {
                        case ".xls":
                            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                            break;
                        case ".xlsx":
                            strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
                            //strConn = "Driver ={ Microsoft Excel Driver(*.xls, *.xlsx, *.xlsm, *.xlsb)}; DBQ =" + pathName + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'";
                            break;
                        default:
                            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                            break;
                    }
                    lblFileName.Text = fileName;
                    cmbSheets.Items.Clear();
                    
                    con = new OleDbConnection(strConn);
                    OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("SELECT * FROM [Sheet1$]"), con);
                    
                    con.Open();
                    System.Data.DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    con.Close();
                    cmbSheets.Items.Add("-- Select Salary Sheet Below -- ");
                    cmbSheets.SelectedIndex = 0;
                    foreach (DataRow drSheet in dt.Rows)
                        if (drSheet["TABLE_NAME"].ToString().Contains("$"))
                        {
                            string s = drSheet["TABLE_NAME"].ToString();
                            
                            cmbSheets.Items.Add(s.StartsWith("'") ? s.Substring(1, s.Length - 3) : s.Substring(0, s.Length - 1));
                        }

                    cmbSheets.Enabled = (cmbSheets.Items.Count > 1) ? true : false;
     
                }

            }
            catch (Exception e)
            {
                MessageBox.Show("Error! \n" + e.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            getDataFromExcel();
        }
        
        DataGridViewCheckBoxColumn dgvChkBxCol;
        private void cmbSheets_SelectedIndexChanged(object sender, EventArgs e)
        {
            dgvChkBxCol = new DataGridViewCheckBoxColumn {
                Name = "SendEmail",
                HeaderText = "Send Email",
                ValueType = typeof(bool),
                FalseValue = false,
                TrueValue = true,
                Frozen = false,
                ReadOnly = false
            };

            dataGridView1.DataSource = "";

            if (cmbSheets.SelectedIndex != 0)
            {
                System.Data.DataTable dataTable = new System.Data.DataTable();
                OleDbDataAdapter oda = new OleDbDataAdapter(
                    string.Format("SELECT * FROM [{0}$]", cmbSheets.SelectedItem),
                    con);
                

                oda.Fill(dataTable);

                if (dataTable.Rows.Count > 0)
                {
                    dataGridView1.DataSource = dataTable;

                    dataGridView1.Columns.Add(dgvChkBxCol);
                }
                else
                {
                    MessageBox.Show("Sheet does not have any record.");
                }
            }
            button1.Enabled = (dataGridView1.RowCount > 0) ? true : false;
        }

        private void lblFileName_Click(object sender, EventArgs e)
        {
            getDataFromExcel();
        }


        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string isSendEmailCol = dataGridView1.Columns[e.ColumnIndex].Name;
            
            dgvChkBxCol.ReadOnly = false;

            if (isSendEmailCol.Equals(dgvChkBxCol.Name))
            {
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !(bool)(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null ? false : dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
                MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
            }
        }
    }
}


Но я хочу, чтобы это было похоже
SalarySlip-July2019.pdf - Google Диск[^]
и с меньшим количеством кода

TheKhanSoft

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

Maciej Los

Что вы делали до сих пор?

TheKhanSoft

Добавлено в раздел Что я пробовал

Maciej Los

Не размещайте такой контент в комментариях. Воспользуйся "Улучшить вопрос- вместо виджета.

TheKhanSoft

Извините, я новичок в codeproject, вот почему....

3 Ответов

Рейтинг:
7

Maciej Los

Вы можете использовать iTextSharp[^] библиотека для создания pdf-файла.

Видеть: iTextSharp - введение таблиц[^]


Рейтинг:
24

Richard MacCutchan

Google для "печати C#", и вы найдете много полезных примеров и учебных пособий.


TheKhanSoft

Спасибо за ответ, но мне нужен PDF-файл, который будет автоматически отправлен по электронной почте на адрес электронной почты, указанный в конце каждой строки

Richard MacCutchan

Вам все равно нужно будет сделать макет и генерацию печати из вашего кода. Затем вы можете отправить окончательный вывод на PDF-принтер и отправить сгенерированный файл по электронной почте.

Рейтинг:
12

OriginalGriff

Начните с того, что посмотрите на Объект printdocument класса [^] - это основа для печати в C#.

Вам придется рисовать каждый пункт на каждом листе вручную, рассматривая каждый листок заработной платы как отдельную страницу и используя различные Методы класса Graphics [^] чтобы показать их.

Я настоятельно рекомендую вам начать с предварительного просмотра печати и установить XPS или PDF writer в качестве принтера по умолчанию, прежде чем начать тестирование, или вы собираетесь использовать бумагу и тонер / чернила как сумасшедшие!

Первая ссылка содержит базовый пример.