2017-08-22 22 views
-1

我有这段代码。我能够完美地生成带有文本数据的pptx报告。本报告中有4个表格,其中包含动态数据。我能够在PPT中生成一个表格,但无法执行多个表格。无法使用openxml在PPT报告中生成第二个表格

要求:在右边我有4张桌子。 enter image description here

期望值:我能够得到第一张表。 enter image description here

在以下代码我已经在假设将创建表,我可以与PPT数据和地点填充另一帧AddNewSlide方法添加 P.GraphicFrame graphicFrame2。但它不起作用。请帮忙。

using (PresentationDocument presentationDocument = PresentationDocument.Open(slideName, true)) 
      { 
       //Get the first slide from presentation 
       SlidePart intitalSlide = presentationDocument.PresentationPart.SlideParts.First(); 
       AddNewSlide(presentationDocument, intitalSlide, projectID, reportType); 
      } 

#region Powerpoint Reports 


    private System.Data.DataTable GetValueForPPTReport(int projectID) 
    { 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "select convert(varchar(10),proj_id) + ' : ' + proj_name as projName,proj_type, proj_problem_state, proj_goal_obj, proj_in_scope, proj_out_scope , proj_who_customer, proj_what_defect,proj_critical_to_qlty from tbl_proj_details where proj_id = @proj_id"; 
     cmd.Parameters.Add("@proj_id", SqlDbType.Int).Value = projectID; 
     dt = (new Bussiness()).Execute(cmd); 
     return dt; 
    } 
    private System.Data.DataTable GetValueForPPTReportBenefit(int projectID) 
    { 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "select [proj_ben_type] as [Benefit Type], [proj_ben_year] as Year ,[proj_ben_fcst] as Forecast,[proj_ben_act] as Actual from [tbl_proj_benefits_detail] where proj_id = @proj_id"; 
     cmd.Parameters.Add("@proj_id", SqlDbType.Int).Value = projectID; 
     dt = (new Bussiness()).Execute(cmd); 
     return dt; 
    } 
    private void AddNewSlide(PresentationDocument presentationDocument, SlidePart _slideTemplate, int projectID, string reportType) 
    { 
     PresentationPart parent = presentationDocument.PresentationPart; 
     var newSlidePart = parent.AddNewPart<SlidePart>("newSlide1"); 

     if (reportType == "Charter") 
     { 
      System.Data.DataTable dt = GetValueForPPTReport(projectID); 

      //copy the contents of the template slide to the new slide and attach the appropriate layout 
      newSlidePart.FeedData(_slideTemplate.GetStream(FileMode.Open)); 
      newSlidePart.AddPart(_slideTemplate.SlideLayoutPart, _slideTemplate.GetIdOfPart(_slideTemplate.SlideLayoutPart)); 

      //Alter the placeholder text in new slide 
      SetPlaceholder(newSlidePart, "txtProjectIDName", dt.Rows[0]["projName"].ToString()); 
      SetPlaceholder(newSlidePart, "txtProjType", dt.Rows[0]["proj_type"].ToString()); 
      SetPlaceholder(newSlidePart, "txtProbSt", dt.Rows[0]["proj_problem_state"].ToString()); 
      SetPlaceholder(newSlidePart, "txtGoal", dt.Rows[0]["proj_goal_obj"].ToString()); 
      SetPlaceholder(newSlidePart, "txtDate", System.DateTime.Now.ToString("MM/dd/yyyy HH:mm")); 
     } 


     //Add dynamic Tables here 

     ////List<OpenXmlElement> elements = new List<OpenXmlElement>(); 
     ////elements.Add(new P.NonVisualGraphicFrameProperties 
     //// (new P.NonVisualDrawingProperties() { Id = 1, Name = "xyz" }, new P.NonVisualGraphicFrameDrawingProperties(), new ApplicationNonVisualDrawingProperties())); 

     // Declare and instantiate the graphic Frame of the new slide 
     P.GraphicFrame graphicFrame = newSlidePart.Slide.CommonSlideData.ShapeTree.AppendChild(new P.GraphicFrame()); 
     P.GraphicFrame graphicFrame2 = newSlidePart.Slide.CommonSlideData.ShapeTree.AppendChild(new P.GraphicFrame()); 

     // Specify the required Frame properties of the graphicFrame 
     ApplicationNonVisualDrawingPropertiesExtension applicationNonVisualDrawingPropertiesExtension = new ApplicationNonVisualDrawingPropertiesExtension() { Uri = "{D42A27DB-BD31-4B8C-83A1-F6EECF244321}" }; 
     P14.ModificationId modificationId1 = new P14.ModificationId() { Val = 3229994563U }; 
     modificationId1.AddNamespaceDeclaration("p14", "http://schemas.microsoft.com/office/powerpoint/2010/main"); 
     applicationNonVisualDrawingPropertiesExtension.Append(modificationId1); 

     ApplicationNonVisualDrawingPropertiesExtension applicationNonVisualDrawingPropertiesExtension2 = new ApplicationNonVisualDrawingPropertiesExtension() { Uri = "{D42A27DB-BD31-4B8C-83A1-F6EECF244321}" }; 
     P14.ModificationId modificationId2 = new P14.ModificationId() { Val = 3229994564U }; 
     modificationId2.AddNamespaceDeclaration("p14", "http://schemas.microsoft.com/office/powerpoint/2010/main"); 
     applicationNonVisualDrawingPropertiesExtension.Append(modificationId2); 

     graphicFrame.NonVisualGraphicFrameProperties = new P.NonVisualGraphicFrameProperties 
     (new D.NonVisualDrawingProperties() { Id = 1, Name = "table1" }, 
     new D.NonVisualGraphicFrameDrawingProperties(new D.GraphicFrameLocks() { NoGrouping = true }), 
     new ApplicationNonVisualDrawingProperties(new ApplicationNonVisualDrawingPropertiesExtensionList(applicationNonVisualDrawingPropertiesExtension))); 

     graphicFrame2.NonVisualGraphicFrameProperties = new P.NonVisualGraphicFrameProperties 
     (new D.NonVisualDrawingProperties() { Id = 2, Name = "table2" }, 
     new D.NonVisualGraphicFrameDrawingProperties(new D.GraphicFrameLocks() { NoGrouping = true }), 
     new ApplicationNonVisualDrawingProperties(new ApplicationNonVisualDrawingPropertiesExtensionList(applicationNonVisualDrawingPropertiesExtension2))); 

     if (true) 
     { 
      graphicFrame.Transform = new Transform(new D.Offset() { X = 5050609L, Y = 883400L }, new D.Extents() { Cx = 0, Cy = 0 }); 
      // Specify the Griaphic of the graphic Frame 
      graphicFrame.Graphic = new D.Graphic(new D.GraphicData(GenerateTable(projectID, reportType)) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/table" }); 

      graphicFrame2.Transform = new Transform(new D.Offset() { X = 5050609L, Y = 983400L }, new D.Extents() { Cx = 0, Cy = 0 }); 
      // Specify the Griaphic of the graphic Frame 
      graphicFrame2.Graphic = new D.Graphic(new D.GraphicData(GenerateTable(projectID, reportType)) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/table" }); 
     } 
     //save the changes to the slide 
     newSlidePart.Slide.Save(); 

     //need to assign an id to the new slide and add it to the slideIdList 
     //first figure out the largest existing id 
     DocumentFormat.OpenXml.Presentation.SlideIdList slideIdList = parent.Presentation.SlideIdList; 
     uint maxSlideId = 1; 

     foreach (DocumentFormat.OpenXml.Presentation.SlideId slideId in slideIdList.ChildElements) 
     { 
      if (slideId.Id > maxSlideId) maxSlideId = slideId.Id; 
     } 

     //assign an id and add the new slide at the end of the list 
     DocumentFormat.OpenXml.Presentation.SlideId newSlideId = new DocumentFormat.OpenXml.Presentation.SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) }; 
     slideIdList.Append(newSlideId); 

     //Delete first template slide 
     SlideId tempSlideId = slideIdList.ChildElements[0] as SlideId; 
     slideIdList.RemoveChild(tempSlideId); 
    } 
    private void SetPlaceholder(SlidePart slidePart, string placeholder, string value) 
    { 
     List<D.Text> textListExif1 = slidePart.Slide.Descendants<D.Text>().Where(t => t.Text.Equals(placeholder)).ToList(); 
     foreach (D.Text text in textListExif1) 
     { 
      text.Text = value; 
     } 
    } 

    #region tables 

    /// <summary> 
    /// Generate Table as below order: 
    /// a:tbl(Table) ->a:tr(TableRow)->a:tc(TableCell) 
    /// We can return TableCell object with CreateTextCell method 
    /// and Append the TableCell object to TableRow 
    /// </summary> 
    /// <returns>Table Object</returns> 
    private D.Table GenerateTable(int projectID, string reportType) 
    { 
     // Declare and instantiate table 
     D.Table table = new D.Table(); 

     // Specify the required table properties for the table 
     D.TableProperties tableProperties = new D.TableProperties() { FirstRow = true, BandRow = false }; 
     D.TableStyleId tableStyleId = new D.TableStyleId(); 
     tableStyleId.Text = "{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}"; 

     tableProperties.Append(tableStyleId); 
     D.TableGrid tableGrid1 = new D.TableGrid(); 
     System.Data.DataTable dtData = new System.Data.DataTable(); 
     if (reportType == "Charter") 
     { 
      //tblXBenefit 
      dtData = GetValueForPPTReportBenefit(projectID); 

      // Declare and instantiate tablegrid and colums 
      //D.TableGrid tableGrid1 = new D.TableGrid(); 
      D.GridColumn gridColumn1 = new D.GridColumn() { Width = 1848000L }; 
      D.GridColumn gridColumn2 = new D.GridColumn() { Width = 648000L }; 
      D.GridColumn gridColumn3 = new D.GridColumn() { Width = 648000L }; 
      D.GridColumn gridColumn4 = new D.GridColumn() { Width = 648000L }; 

      tableGrid1.Append(gridColumn1); 
      tableGrid1.Append(gridColumn2); 
      tableGrid1.Append(gridColumn3); 
      tableGrid1.Append(gridColumn4); 
     } 
     table.Append(tableProperties); 
     table.Append(tableGrid1); 

     // Instantiate the table header row 
     D.TableRow tableHRow = new D.TableRow() { Height = 0L }; 
     for (int column = 0; column < dtData.Columns.Count; column++) 
     { 
      tableHRow.Append(CreateTextCell(dtData.Columns[column].ToString())); 
     } 
     table.Append(tableHRow); 

     // Instantiate the table data row 
     for (int row = 0; row < dtData.Rows.Count; row++) 
     { 
      // Instantiate the table row 
      D.TableRow tableRow = new D.TableRow() { Height = 0L }; 
      for (int column = 0; column < dtData.Columns.Count; column++) 
      { 
       tableRow.Append(CreateTextCell(dtData.Rows[row][column].ToString())); 
      } 
      table.Append(tableRow); 
     } 
     return table; 
    } 

    /// <summary> 
    /// Create table cell with the below order: 
    /// a:tc(TableCell)->a:txbody(TextBody)->a:p(Paragraph)->a:r(Run)->a:t(Text) 
    /// </summary> 
    /// <param name="text">Inserted Text in Cell</param> 
    /// <returns>Return TableCell object</returns> 
    private D.TableCell CreateTextCell(string text) 
    { 
     if (string.IsNullOrEmpty(text)) 
     { 
      text = string.Empty; 
     } 

     // Declare and instantiate the table cell 
     // Create table cell with the below order: 
     // a:tc(TableCell)->a:txbody(TextBody)->a:p(Paragraph)->a:r(Run)->a:t(Text) 
     D.TableCell tableCell = new D.TableCell(); 

     // Declare and instantiate the text body 
     D.TextBody textBody = new D.TextBody(); 
     D.BodyProperties bodyProperties = new D.BodyProperties(); 
     D.ListStyle listStyle = new D.ListStyle(); 

     D.Paragraph paragraph = new D.Paragraph(); 
     D.Run run = new D.Run(); 
     D.RunProperties runProperties = new D.RunProperties() { Language = "en-US", Dirty = false, FontSize = 800 }; 
     D.Text text2 = new D.Text(); 
     text2.Text = text; 

     run.Append(runProperties); 
     run.Append(text2); 
     D.EndParagraphRunProperties endParagraphRunProperties = new D.EndParagraphRunProperties() { Language = "en-US", Dirty = false, FontSize = 700 }; 

     paragraph.Append(run); 
     paragraph.Append(endParagraphRunProperties); 
     textBody.Append(bodyProperties); 
     textBody.Append(listStyle); 
     textBody.Append(paragraph); 

     D.TableCellProperties tableCellProperties = new D.TableCellProperties(); 
     tableCell.Append(textBody); 
     tableCell.Append(tableCellProperties); 

     return tableCell; 
    } 

    #endregion 

    #endregion 
+0

与价值占位符为什么downvote,并试图关闭? – Sak

+0

你说过你有问题,但是你没有解释你为解决问题所做的努力? –

+0

在上面的代码中,我尝试在AddNewSlide方法中添加(P.GraphicFrame graphicFrame2,ApplicationNonVisualDrawingPropertiesExtension applicationNonVisualDrawingPropertiesExtension2),假设它会为表格创建另一个框架,我可以使用这些框架填充数据并放置在PPT上。但它不起作用,这一切我尝试过,并试图找到很多关于这些框架类,但没有找到一个互联网上的帮助,但我怎么可以用它来生成多个表。 – Sak

回答

0

好吧,所以我找不到一种方法来生成多个表。我所做的就是发生在tempaltes表中的占位符替换

SlidePart.Slide.InnerXml