Files
XLIMS/XLIMS.CORE/Helpers/OpenPsv.cs
Курнат Андрей f0e11d6379 first edit
2026-01-31 16:11:36 +03:00

125 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.IO;
namespace XLIMS.CORE.Helpers
{
public class OpenPsv
{
#region Fields
private readonly dynamic _wordApp;
private readonly dynamic _wordDocument;
private readonly dynamic _table;
private readonly DocViewModel _document;
private readonly XLAB7Repository _repository;
private readonly int _copies;
#endregion
#region Constructor
public OpenPsv(DocViewModel document, XLAB7Repository repository, int copies = 1)
{
_document = document ?? throw new ArgumentNullException(nameof(document));
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
_copies = copies < 1 ? 1 : copies;
var templatePath = Path.Combine("Resources", "DOCX", "OpenPsv.docx");
if (!File.Exists(templatePath))
throw new FileNotFoundException("Шаблон Word не найден", templatePath);
var wordType = Type.GetTypeFromProgID("Word.Application");
if (wordType == null)
throw new InvalidOperationException("Microsoft Word не установлен");
_wordApp = Activator.CreateInstance(wordType);
_wordApp.Visible = false;
_wordDocument = _wordApp.Documents.Open(templatePath);
if (_wordDocument.Tables.Count < 1)
throw new InvalidOperationException("В документе отсутствует таблица");
_table = _wordDocument.Tables[1];
}
#endregion
#region Methods
private void Replace(string placeholder, string value)
{
dynamic range = _wordDocument.Content;
dynamic find = range.Find;
find.ClearFormatting();
find.Text = placeholder;
find.Replacement.ClearFormatting();
find.Replacement.Text = value ?? string.Empty;
find.Execute(
Replace: 2, // wdReplaceAll
Wrap: 1 // wdFindContinue
);
}
public void Print()
{
Replace("number", _document.Number);
Replace("div", _document.CurrentFRPD.NMFRPD);
Replace("date", ((DateTime)_document.Date).ToLongDateString());
Replace("count", _document.AllEKZMK.Count.ToString());
Replace("next", ((DateTime)_document.Date).AddDays(30).ToLongDateString());
Replace("person", _document.CurrentPRSNPR.PRFIO);
int rowIndex = 2;
int index = 1;
foreach (var group in _document.AllGroupsEKZMK)
{
_table.Rows.Add();
_table.Cell(rowIndex, 1).Range.Text = index.ToString();
_table.Cell(rowIndex, 2).Range.Text =
group.CurrentEKZMK.CurrentEKZ.IDTPRZNavigation
.IDTIPSNavigation.IDSPNMTPNavigation.NMTP;
_table.Cell(rowIndex, 3).Range.Text =
group.CurrentEKZMK.CurrentEKZ.IDTPRZNavigation
.IDTIPSNavigation.TP;
_table.Cell(rowIndex, 4).Range.Text =
group.CurrentEKZMK.CurrentEKZ.IDTPRZNavigation.DPZN;
if (group.GroupEKZMK.Count() > 3)
{
_table.Cell(rowIndex, 5).Range.Text =
group.GroupEKZMK.Count().ToString();
}
else
{
foreach (var item in group.GroupEKZMK)
{
_table.Cell(rowIndex, 5).Range.Text +=
item.CurrentEKZ.NNZV + ", ";
}
}
_table.Cell(rowIndex, 6).Range.Text = group.Count.ToString();
_table.Cell(rowIndex, 9).Range.Text = group.CurrentEKZMK.DSEKZMK;
rowIndex++;
index++;
}
_wordDocument.PrintOut(Copies: _copies);
_wordDocument.Close(false);
_wordApp.Quit();
}
#endregion
}
}