Генерация отчетов - формирование ценников по шаблону из данных DOCX-документа на C# и .NET


     Генерация отчетов - популярная функция для быстрого и легкого создания документов, таких как письма, этикетки, платежные ведомости, счет-фактуры и так далее.
Sautinsoft.Document позволяет создавать документы из шаблонов с заполняемыми полями.

Заполняемое поле - это поле, которое можно вставить в шаблон, чтобы включить определенные значения из записи какого-либо источника данных в выходные документы.

     В данном примере кода есть Прайс лист на продукты питания и шаблон ценника в DOCX формате с полями как см. ниже:

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

     Выходным документом, в нашем случае, является структурированный документ result.docx с ценниками на продовольственные товары в удобном виде.

     Кроме этого, Sautinsoft.Document позволяет вставлять изображения во время генерации отчета, выполнять любую пользовательскую логику, вставлять разнообразное содержимое с помощью обработчиков событий, заполнять документы данными из любого типа источника данных: База Данных, XML или Json файлы, Excel-Таблица или любой струкутированный документ.

Полный код

using System.Collections.Generic;
using System;
using System.IO;
using System.Linq;
using SautinSoft.Document;
using SautinSoft.Document.Tables;
using System.Drawing;

namespace Example
{
    class Program
    {
        public class ItemModel
        {
            public string Name { get; set; }
            public string EdIzm { get; set; }
            public string BarCode { get; set; }
            public string PriceOne { get; set; }
          
        }

        static void Main(string[] args)
        {
            ReportsPriceTags();
        }

        static void ReportsPriceTags()
        {
            string dataPath = @"..\..\..\price.docx";
            string templatePath = @"..\..\..\template.docx";
            string outFile = @"result.html";

            #region Считаем данные из файла
            DocumentCore dc = DocumentCore.Load(dataPath);

            List<ItemModel> items = new List<ItemModel>();

            var sections = dc.Sections;

            foreach (var section in sections)
            {
                var blocks = section.Blocks;

                foreach (var block in blocks)
                {
                    if (block is Table)
                    {
                        var localTable = block as Table;

                        foreach (var row in localTable.Rows)
                        {
                            var cells = row.Cells;

                            // Проверяем на наличие ячеек в строке (пустая строка нас не интересует).
                            if (cells.Count >5 && int.TryParse(cells[1].Content.ToString(), out int c))
                            {
                                items.Add(new ItemModel
                                {
                                    Name = cells[0].Content.ToString().Replace("\r\n", ""),
                                    EdIzm = cells[2].Content.ToString().Replace("\r\n", ""),
                                    BarCode = cells[3].Content.ToString().Replace("\r\n", ""),
                                    PriceOne = cells[4].Content.ToString().Replace("\r\n", ""),
                                }); ;
                            }
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            #endregion
            #region заполним шаблон данными
            DocumentCore dc2 = DocumentCore.Load(templatePath);

            var dataSource = items.Select(t => new { NameProd = t.Name, Cena = t.PriceOne, Shtrich = t.BarCode, Ed_izm = t.EdIzm });

            dc2.MailMerge.Execute(dataSource);
            #endregion

            #region придадим красивую структуру документу
            DocumentCore dcresult = new DocumentCore();

            Section s = new Section(dcresult);

            s.PageSetup.PaperType = PaperType.A4;
            s.PageSetup.TextColumns= new TextColumnCollection(3);
            s.PageSetup.TextColumns.SpaceBetween = 10;
            s.PageSetup.PageMargins.Bottom = 30;
            s.PageSetup.PageMargins.Left = 10;
            s.PageSetup.PageMargins.Right = 10;
            s.PageSetup.PageMargins.Top = 20;
            
            dcresult.Sections.Add(s);

            foreach (Section p in dc2.Sections)
            {
                
                var block = dcresult.Import(p.Blocks[0], true);
                s.Blocks.Add(block);
                s.Blocks.Add(new Paragraph(dcresult, ""));
            }

            dcresult.Save(outFile);
            #endregion 

            // откройте результат в демонстрационных целях.
            // если результрующий файл не содержит штрихкод, пожалуйста, установите шрифт "BarCode".
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(outFile) { UseShellExecute = true });
        }
    }
}

Скачать

Option Infer On

Imports Microsoft.VisualBasic
Imports System.Collections.Generic
Imports System
Imports System.IO
Imports System.Linq
Imports SautinSoft.Document
Imports SautinSoft.Document.Tables
Imports System.Drawing

Namespace Example
	Friend Class Program
		Public Class ItemModel
			Public Property Name() As String
			Public Property EdIzm() As String
			Public Property BarCode() As String
			Public Property PriceOne() As String

		End Class

		Shared Sub Main(ByVal args() As String)
			ReportsPriceTags()
		End Sub

		Private Shared Sub ReportsPriceTags()
			Dim dataPath As String = "..\..\..\price.docx"
			Dim templatePath As String = "..\..\..\template.docx"
			Dim outFile As String = "result.html"

'			#Region "Считаем данные из файла"
			Dim dc As DocumentCore = DocumentCore.Load(dataPath)

			Dim items As New List(Of ItemModel)()

			Dim sections = dc.Sections

			For Each section In sections
				Dim blocks = section.Blocks

				For Each block In blocks
					If TypeOf block Is Table Then
						Dim localTable = TryCast(block, Table)

						For Each row In localTable.Rows
							Dim cells = row.Cells

							' Проверяем на наличие ячеек в строке (пустая строка нас не интересует).
							Dim c As Integer
							If cells.Count >5 AndAlso Integer.TryParse(cells(1).Content.ToString(), c) Then
								items.Add(New ItemModel With {
									.Name = cells(0).Content.ToString().Replace(vbCrLf, ""),
									.EdIzm = cells(2).Content.ToString().Replace(vbCrLf, ""),
									.BarCode = cells(3).Content.ToString().Replace(vbCrLf, ""),
									.PriceOne = cells(4).Content.ToString().Replace(vbCrLf, "")
								})

							End If
						Next row
					Else
						Continue For
					End If
				Next block
			Next section
'			#End Region
'			#Region "заполним шаблон данными"
			Dim dc2 As DocumentCore = DocumentCore.Load(templatePath)

			Dim dataSource = items.Select(Function(t) New With {
				Key .NameProd = t.Name,
				Key .Cena = t.PriceOne,
				Key .Shtrich = t.BarCode,
				Key .Ed_izm = t.EdIzm
			})

			dc2.MailMerge.Execute(dataSource)
'			#End Region

'			#Region "придадим красивую структуру документу"
			Dim dcresult As New DocumentCore()

			Dim s As New Section(dcresult)

			s.PageSetup.PaperType = PaperType.A4
			s.PageSetup.TextColumns= New TextColumnCollection(3)
			s.PageSetup.TextColumns.SpaceBetween = 10
			s.PageSetup.PageMargins.Bottom = 30
			s.PageSetup.PageMargins.Left = 10
			s.PageSetup.PageMargins.Right = 10
			s.PageSetup.PageMargins.Top = 20

			dcresult.Sections.Add(s)

			For Each p As Section In dc2.Sections

				Dim block = dcresult.Import(p.Blocks(0), True)
				s.Blocks.Add(block)
				s.Blocks.Add(New Paragraph(dcresult, ""))
			Next p

			dcresult.Save(outFile)
'			#End Region 

			' откройте результат в демонстрационных целях.
			' если результрующий файл не содержит штрихкод, пожалуйста, установите шрифт "BarCode".
			System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo(outFile) With {.UseShellExecute = True})
		End Sub
	End Class
End Namespace

Скачать


Если вам нужен пример кода или у вас есть вопрос: напишите нам по адресу [email protected] или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже:



Вопросы и предложения всегда приветствуются!

Мы разрабатываем компоненты .Net с 2002 года. Мы знаем форматы PDF, DOCX, RTF, HTML, XLSX и Images. Если вам нужна помощь в создании, изменении или преобразовании документов в различных форматах, мы можем вам помочь. Мы напишем для вас любой пример кода абсолютно бесплатно.