Aspose.Word / C#报告系统

时间:2014-11-25 11:11:28

标签: c# .net aspose aspose.words

我目前需要一个想法,我正在开发一个软件解决方案,我必须从BDD的信息中创建Word文档。

关于信息的使用,一切都很好,但有一点,这是最重要的:

在我的Word文档中,我使用signets重复写入信息的表。其中一列是指成本,因为我使用signets的系统,我不知道我的表在哪里结束,它可能需要1页因为它可能需要2500's但我需要在每个页面结束时计算总共写在当前页面上的每一行,然后在下一页的开头重写该总计。所以它会像:

  • Page 1
nameOfTheItem1 Cost1
nameOfTheItem2 Cost2 
nameOfTheItem3 Cost3
nameOfTheItem4 Cost4
TOTAL PAGE 1 : TotalPage1
  • Page 2
  

TotalPage1

     

nameOfTheItem5 Cost5
nameOfTheItem6 Cost6
nameOfTheItem7   Cost7
nameOfTheItem8 Cost8
总页数2:   TotalPage2(+ TotalPage1)

以及此文档现有的每个页面。

我仍然在寻找自己的解决方案,每一个帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

可以使用Aspose.Words的mail merge功能完成。解决方案尤其与nested mail merge

相关
  1. 您必须在DataSet中排列数据,以便根据您的要求显示报告。对于此方案,请安排在2个表中。一个是" Page"和其他是"项目"
  2. 您的模板文档(DOCX)应根据下图定义合并字段。请注意,表格后面有一个分页符。
  3. enter image description here

    以下代码将帮助您入门。它当然使用虚拟数据。您可以使用自己的数据进行填充,以使其适合您。

    使用此代码的MS Word模板文档: Download Template

    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的开发人员传播者。

答案 1 :(得分:0)

我将数据导出到现有的word模板,即.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");
    }