Генерация отчетов - популярная функция для быстрого и легкого создания документов, таких как письма, этикетки, платежные ведомости, счет-фактуры и так далее.
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] или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже: