Jeremy James Ответов: 2

Как динамически печатать информацию из строк datagrid в документ word


Я создаю приложение для расчета заработной платы для клиента и столкнулся с проблемой создания отчета в Microsoft Word. Вся информация о зарплате и сотрудниках сохраняется в базе данных Sql Server.

Итак, проблема в том, что я не знаю, как создать отчет динамически, чтобы соответствовать требованиям их отчета.
Отчет должен в основном показывать текущий, предыдущий или следующий платежный период (у меня есть макет того, как он должен выглядеть, так что это не большая проблема).

Когда они переходят на вкладку отчеты в приложении, отображается datagrid со всей информацией о зарплате, которая уже была сохранена.
Поэтому, когда они фильтруют сетку, чтобы показать определенный период оплаты, и выбирают строки, которые отображаются после фильтра, кнопка печати становится включенной и должна напечатать выбранные строки и "объединить" необходимую информацию в отчетном документе.

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

Я попытался сделать простой mailmerge с помощью OpenXml со следующим кодом (который, как ни удивительно, не работает):
using (WordprocessingDocument doc =
        WordprocessingDocument.Open(@"E:\test.docx", true))
            {
                var body = doc.MainDocumentPart.Document.Body;
                var paras = body.Elements();

                foreach (var para in paras)
                {
                    foreach (var run in para.Elements())
                    {
                        foreach (var text in run.Elements())
                        {
                            if (text.InnerText.Contains("Name"))
                            {
                                text.InnerText.Equals(text.InnerText.Replace("Name",
                                "Bruh"));
                            }
                        }
                    }
                }

            }

Теперь я не уверен, что mailmerge-это правильный путь, потому что если я создам шаблон отчета, как я смогу повторно использовать этот шаблон для каждой строки?

Например: если Джон, Мэри и Джек имеют по пять строк в datagrid (я уже знаю, как суммировать денежные столбцы, поэтому вместо того, чтобы иметь 15 строк, идущих в отчет, он станет 3 после суммирования денежных столбцов), как я могу использовать тот же шаблон для Джона, Мэри и Джека?

	                           Payroll Register
                              - - - - - - - - - - -	
Period No.  period_num   period_date		            Run Date    run_date
	- - - - - - - - -Earnings- - - - - -   - - - - - -Deductions - - - - - - 
		        This Per.      Y-T-D    This Per.    This Per.   Y-T-D
	                                        Employee     Employer    Employee

Emp No		
Name		
NIS Ref		
T.R.N.		
Tax Basis		
Department		
Cost Centre		
	           TOTALS	
Rent Cheque	*  Net Pay	


Это всего лишь пример того, как он должен выглядеть для одного (1) сотрудника/строки, для других сотрудников/строк он должен повторно использовать тот же макет/формат.

F-ES Sitecore

Итак, вы пишете функциональность для клиента и фактически хотите, чтобы кто-то сделал эту работу за вас, предположительно для того, чтобы вы могли представить ее и получить за нее деньги? Почему вы думаете, что кто-то будет делать вашу работу бесплатно? Если вы не можете выполнить работу, на которую вы наняты, то заключите субподряд или попробуйте нанять фрилансера (оба из которых, вероятно, сделают то, что вы только что сделали), но никто здесь не будет делать вашу работу за вас.

2 Ответов

Рейтинг:
2

Karl Erlacher

Решение может оказаться вовсе не таким уж трудным. Вам нужен шаблон Word (который у вас уже есть), но он должен уметь работать с компонентом списка, где вы можете повторять строки заполнителей данных, чтобы получить несколько строк с одинаковым форматированием в вашем окончательном документе. Вы можете взять смотреть здесь чтобы получить представление о том, как создать шаблон и как объединить его с данными.

Вы уже читаете данные в своем приложении, поэтому все, что требуется, - это иметь эти данные в виде объекта .NET data (типа класса со свойствами и коллекцией экземпляров этого класса). Затем вы можете объединить шаблон и данные всего с 2 строками кода:

// salaries contain a collection of data we want to merge
DocumentGenerator dg = new DocumentGenerator(salaries);
DocumentGenerationResult result = dg.GenerateDocument("MyTemplate.docx", "MyReport.docx");