2017-08-22 7 views
-1

Ich habe diesen Code. Ich bin in der Lage, pptx Bericht mit Textdaten tadellos zu erzeugen. Ich habe auch 4 Tabellen in diesem Bericht, der dynamische Daten hat. Ich bin in der Lage, eine Tabelle in PPT zu generieren, aber nicht in der Lage, mehrere zu tun.kann keine zweite Tabelle im PPT-Bericht mit openxml erzeugen

Voraussetzung: Auf der rechten Seite habe ich 4 Tabellen.

Erwartung: Ich bin in der Lage, die erste Tabelle zu bekommen. enter image description here

Im folgenden Code habe ich hinzugefügt P.GraphicFrame graphicFrame2 in AddNewSlide Verfahren in Annahme es einen anderen Rahmen für die Tabelle erstellen wird, die ich mit Daten und auf PPT füllen kann. Aber es funktioniert nicht. Bitte helfen Sie.

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

Warum runter und versuchen zu schließen? – Sak

+0

Sie beschrieben, dass Sie ein Problem haben, aber Sie haben nicht erklärt, was Sie getan haben, um das Problem zu lösen versuchen? –

+0

In dem Code oben habe ich versucht, Hinzufügen (P.GraphicFrame graphicFrame2, ApplicationNonVisualDrawingPropertiesExtension applicationNonVisualDrawingPropertiesExtension2) in AddNewSlide-Methode in der Annahme, dass es einen anderen Rahmen für die Tabelle erstellen wird, die ich mit Daten füllen und auf PPT platzieren kann. Aber es funktioniert nicht, das alles habe ich versucht und versucht, eine Menge über diese Frame-Klassen zu finden, habe aber noch keine einzige Hilfe im Internet gefunden, wie ich sie benutzen kann, um mehr als einen Tisch zu generieren. – Sak

Antwort

0

okay, also konnte ich keinen Weg finden, mehrere Tabellen zu generieren. Was ich tat, war Platzhalter in tempaltes Tabelle ersetzt den Platzhalter mit Werten in

Verwandte Themen