Система отчетности на Aspose.Word / C#

В настоящее время мне нужна идея, я разрабатываю программное решение, и мне нужно создать документы Word из информации BDD.

С использованием информации все в порядке, но есть один момент, и он самый важный:

В моем документе Word я использую печатки, чтобы повторить таблицу, в которой записана информация. Один из столбцов относится к стоимости, и, поскольку я использую систему печатей, я не знаю, где заканчивается моя таблица, она может занять 1 страницу, так как может занять 2500, но мне нужно вычислить в конце КАЖДОЙ страницы. сумму каждой строки, которая была записана на текущей странице, а затем переписать эту сумму в начале следующей страницы. Так что это было бы так:

  • Страница 1
nameOfTheItem1 Cost1
nameOfTheItem2 Cost2 
nameOfTheItem3 Cost3
nameOfTheItem4 Cost4
TOTAL PAGE 1 : TotalPage1
  • Страница 2

Итогостраница1

nameOfTheItem5 Cost5
nameOfTheItem6 Cost6
nameOfTheItem7 Cost7
nameOfTheItem8 Cost8
ИТОГО СТРАНИЦА 2 : TotalPage2(+TotalPage1)

и это для каждой страницы, существующей для этого документа.

Я все еще ищу решение самостоятельно, и любая помощь будет здоровой.


person Kiskoul    schedule 25.11.2014    source источник


Ответы (2)


Это можно сделать с помощью функции слияния в Aspose.Words. Решение особенно связано с вложенными слияние почты.

  1. Вы должны упорядочить данные в наборе данных, чтобы отчет отображался в соответствии с вашими требованиями. Для этого сценария организуйте 2 стола. Один из них — «Страница», а другой — «Элемент».
  2. В вашем шаблоне документа (DOCX) должны быть определены поля слияния в соответствии с изображением ниже. Обратите внимание, что после таблицы есть разрыв страницы.

введите здесь описание изображения

Следующий код поможет вам начать работу. Конечно, он использует фиктивные данные. Вы можете заполнить свои собственные данные, чтобы они работали на вас.

Документ шаблона MS Word, который работает с этим кодом: Загрузить шаблон

private void yourMethod()
{
    string srcDoc = dataDir + "ItemsTemplate.docx";
    string dstDoc = dataDir + "ItemsTemplate_Result.docx";

    int totalRecords = 10;
    int recordsPerPage = 4;

    // Prepare some data
    DataSet ds = getData(totalRecords, recordsPerPage);

    // Prepare the document in Aspose
    Aspose.Words.Document doc = new Aspose.Words.Document(srcDoc);
    doc.MailMerge.ExecuteWithRegions(ds);
    doc.MailMerge.CleanupOptions = Aspose.Words.Reporting.MailMergeCleanupOptions.RemoveEmptyParagraphs;
    doc.Save(dstDoc);

    Process.Start(dstDoc);
}

private DataSet getData(int totalRecords, int recordsPerPage)
{
    DataSet ds = new DataSet("Dataset");

    // Add the page table
    System.Data.DataTable pageTable = new System.Data.DataTable("Page");
    pageTable.Columns.Add("PageNumber");
    pageTable.Columns.Add("PageTotal");
    pageTable.Columns.Add("PreviousPageTotal");

    // Add the item table
    System.Data.DataTable itemTable = new System.Data.DataTable("Item");
    itemTable.Columns.Add("ID");
    itemTable.Columns.Add("Name");
    itemTable.Columns.Add("Cost");
    itemTable.Columns.Add("PageNumber");

    // Add pages
    int iRow = 1, iPage = 1;
    while (iRow <= totalRecords )
    {
        DataRow pageRow = pageTable.NewRow();
        pageRow["PageNumber"] = iPage;
        pageRow["PageTotal"] = 0;

        // Add the items in this page
        int iRecordsPerPage = 1;
        while (iRow <= totalRecords && iRecordsPerPage <= recordsPerPage)
        {
            DataRow itemRow = itemTable.NewRow();
            itemRow["ID"] = iRow;
            itemRow["Name"] = "Item " + iRow;
            itemRow["Cost"] = iRow;
            itemRow["PageNumber"] = iPage;

            pageRow["PageTotal"] = int.Parse(pageRow["PageTotal"].ToString()) + int.Parse(itemRow["Cost"].ToString());

            itemTable.Rows.Add(itemRow);
            iRow++;
            iRecordsPerPage++;
        }

        pageTable.Rows.Add(pageRow);

        // Previous page total
        if (iPage == 1)
            pageRow["PreviousPageTotal"] = 0; // Always 0 for first page
        else
            pageRow["PreviousPageTotal"] = pageTable.Rows[iPage - 2]["PageTotal"]; // Get total of previous page

        iPage++;
    }

    ds.Tables.Add(pageTable);
    ds.Tables.Add(itemTable);

    // We must have relationship for Aspose mail merge to work correctly
    ds.Relations.Add(pageTable.Columns["PageNumber"], itemTable.Columns["PageNumber"]);

    return ds;
}

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

Я евангелист разработчиков в Aspose.

person Saqib Razzaq    schedule 26.11.2014
comment
Спасибо, попробую с этим! - person Kiskoul; 26.11.2014

Я экспортирую данные в существующий шаблон слова, который имеет формат .dotx. Но в окончательном отчете не отображается оглавление, хотя я добавил его в код. Мой код выглядит следующим образом

    public void ExportToWordUsingTemplate()
    {

        Aspose.Words.Document doc1 = new Aspose.Words.Document(@"E:/excel/HOVEDMAL Prognoserapporter 2.dotx");
        DocumentBuilder docBuilder1 = new DocumentBuilder(doc1);

        SkinAPI.ReportAPISoapClient svc = new SkinAPI.ReportAPISoapClient();
        SkinAPI.GetReportContextResult myReportContext = svc.GetReportContext(1);

        docBuilder1.InsertHtml("<h1 align='left'>" + myReportContext[0].MainReportName + "</h1>");
        docBuilder1.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");


        //for (int i = 0; i < myReportContext.Count - 2; i++)
        for (int i = 0; i < 5; i++)
        {
            SkinAPI.GetReportElementGraphDataResult myElementGraphData = svc.GetReportElementGraphData(myReportContext[i].ReportId, myReportContext[i].ElementId);
            SkinAPI.GetReportElementDataResult myElementData = svc.GetReportElementData(myReportContext[i].ReportId, myReportContext[i].ElementId, 0, 0, 0);    // Three last parameters set to 0, used when fetching drilldown data for tables that support it

            docBuilder1.ParagraphFormat.StyleIdentifier = StyleIdentifier.Heading1;
            docBuilder1.Writeln(myReportContext[i].ElementHeader);
            docBuilder1.ParagraphFormat.StyleIdentifier = StyleIdentifier.BodyText;

            // Is there a graph for this element, and has it a datasource other than the main data source as fetched above?
            if (myReportContext[i].HasGraph && myReportContext[i].SeparateGraphDataSource)
            {
                // Is there a text part for this element
                if (myReportContext[i].HasText)
                {
                    // The returned string will contain a HTML text.
                    // Note that the text is connected to a TileId, not an ElementId, meening the text might have been fetched before.
                    string myElementHTMLDescription = svc.GetReportText(myReportContext[i].TileId);
                    docBuilder1.InsertHtml(myElementHTMLDescription);                        
                }
            }
            docBuilder1.InsertBreak(BreakType.PageBreak);
        }

        doc1.Save(@"E:/excel/HOVEDMAL Prognoserapporter 2_Report.doc");
    }
person Suvidha    schedule 24.05.2016