OpenXmlElement GenerateContent(Body Body, DataType DataType, object Obj, TokenParameters TokenParams)
        {
            switch (DataType)
            {
            case DataType.None:
                return(null);

            case DataType.EmbeddedData: {
                EmbeddedData ObjData = (EmbeddedData)Obj;

                switch (ObjData.Type.MediaType)
                {
                case "image/jpeg":
                case "image/jpg":
                case "image/png": {
                    Image Img = ObjData.ParseImageData();
                    Utils.GetSizeInEMU(Img, out long W, out long H);

                    const string WidthName  = "width";
                    const string HeightName = "height";

                    if (TokenParams.Defined(WidthName) && TokenParams.Defined(HeightName))
                    {
                        W = Utils.MilimeterToEmu(TokenParams.Get <int>(WidthName));
                        H = Utils.MilimeterToEmu(TokenParams.Get <int>(HeightName));
                    }
                    else if (TokenParams.Defined(WidthName))
                    {
                        long NewW = Utils.MilimeterToEmu(TokenParams.Get <int>(WidthName));
                        Utils.Scale((float)NewW / W, ref W, ref H);
                    }
                    else if (TokenParams.Defined(HeightName))
                    {
                        long NewH = Utils.MilimeterToEmu(TokenParams.Get <int>(HeightName));
                        Utils.Scale((float)NewH / H, ref W, ref H);
                    }

                    GenerateImagePart(Img, out string ImageID);
                    return(new Run(new RunProperties(), GenerateDrawing(ImageID, W, H)));
                }

                case "text/csv": {
                    string   CSVData  = ObjData.ParseStringData();
                    string[] CSVLines = CSVData.Replace("\r", "").Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

                    // https://www.codeproject.com/Articles/1043875/Create-Word-table-using-OpenXML-and-Csharp-Without


                    Table Tab = new Table();
                    //TableProperties TblPr = new TableProperties();
                    //Tab.AppendChild(TblPr);

                    uint         TableBorder = 1;
                    BorderValues BorderType  = BorderValues.BasicThinLines;

                    TableProperties Props = new TableProperties();
                    Tab.AppendChild(Props);

                    PageDimensions Dim;
                    GetPageDimensions(Body, out Dim);

                    Props.AppendChild(new TableStyle()
                            {
                                Val = "0"
                            });
                    Props.AppendChild(new TableWidth()
                            {
                                Width = Dim.FillWidth.ToString(), Type = TableWidthUnitValues.Dxa
                            });
                    Props.AppendChild(new TableIndentation()
                            {
                                Width = 0, Type = TableWidthUnitValues.Dxa
                            });

                    TableBorders Borders = new TableBorders();
                    Borders.AppendChild(new TopBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Borders.AppendChild(new BottomBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Borders.AppendChild(new LeftBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Borders.AppendChild(new RightBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Borders.AppendChild(new InsideHorizontalBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Borders.AppendChild(new InsideVerticalBorder()
                            {
                                Val = new EnumValue <BorderValues>(BorderType), Size = TableBorder
                            });
                    Props.AppendChild(Borders);

                    Props.AppendChild(new TableLayout()
                            {
                                Type = TableLayoutValues.Fixed
                            });

                    foreach (var Line in CSVLines)
                    {
                        string[]    Columns = Line.Split(new[] { ';' });
                        TableCell[] Cells   = new TableCell[Columns.Length - 1];

                        for (int i = 0; i < Columns.Length - 1; i++)
                        {
                            string Column = Columns[i];

                            if (Column.StartsWith("\"") && Column.EndsWith("\""))
                            {
                                Column = Column.Substring(1, Column.Length - 2);
                            }

                            Cells[i] = GenerateCell(Column);
                        }

                        Tab.AppendChild(GenerateRow(Cells));
                    }

                    //Body.ReplaceChild(Tab, Root);
                    return(Tab);
                }

                case "text/plain":
                    return(GenerateTextRun(ObjData.ParseStringData()));

                default:
                    throw new NotImplementedException();
                }
            }

            case DataType.String: {
                WordTable.ColumnStyle TokenParamStyle = WordTable.ColumnStyle.NONE;

                if (TokenParams.Defined("bold"))
                {
                    TokenParamStyle |= WordTable.ColumnStyle.BOLD;
                }

                if (TokenParams.Defined("italic"))
                {
                    TokenParamStyle |= WordTable.ColumnStyle.ITALIC;
                }

                if (TokenParams.Defined("underline"))
                {
                    TokenParamStyle |= WordTable.ColumnStyle.UNDERLINE;
                }

                WordTable.ColumnStyle Style = WordTableContext.GetCurrent()?.GetCurrentColumn()?.ParseStyle() ?? TokenParamStyle;
                return(GenerateTextRun(Obj.ToString(), Style));
            }

            case DataType.PageBreak:
                return(new Run(new RunProperties(), new Break()
                {
                    Type = BreakValues.Page
                }));

            default:
                throw new NotImplementedException();
            }
        }
Beispiel #2
0
        public DataType GetObject(string Token, TokenParameters TokenParams, out object Obj)
        {
            string[] FullName = Token.Split('.');
            Obj = Data;

            if (FullName.Length == 1 & FullName[0].StartsWith("$"))
            {
                return(GetSpecialObject(FullName[0], out Obj));
            }

            for (int i = 0; i < FullName.Length; i++)
            {
                if (FullName[i].StartsWith("$"))
                {
                    WordTable CurTable   = WordTableContext.GetCurrent();
                    string    TableToken = string.Join(".", FullName.Take(i).ToArray());

                    WordTable.Column Col = CurTable.GetCurrentColumn();
                    Col.Identifier = FullName[i].Substring(1);
                    //Col.RefArrayToken = TableToken;


                    DataType TableTokenDataType = GetObject(TableToken, TokenParams, out object _Obj);
                    if (_Obj is JArray TableObj)
                    {
                        JToken ColumnDefinition = TableObj[0][Col.Identifier];

                        Col.RefArray = TableObj;
                        Col.Text     = ColumnDefinition["text"].Value <string>();
                        Col.Style    = ColumnDefinition["style"].Value <string>();
                    }
                    else
                    {
                        throw new Exception(string.Format("Expected array, got '{0}' for token '{1}'", TableTokenDataType, TableToken));
                    }

                    Obj = Col.Text;
                    return(DataType.String);
                }

                if (Obj is JObject JRoot)
                {
                    JToken JToken = JRoot.GetValue(FullName[i]);

                    if (JToken == null)
                    {
                        Obj = null;
                    }
                    else if (JToken is JValue JValue)
                    {
                        Obj = JValue.Value;
                    }
                    else if (JToken is JObject)
                    {
                        Obj = JToken.Value <JObject>();
                    }
                    else if (JToken is JArray)
                    {
                        Obj = JToken.Value <JArray>();
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
                else
                {
                    string Cur = string.Join(".", FullName.Take(i).ToArray());
                    throw new Exception(string.Format("Could not find value for token '{0}', got '{1}' of value '{2}'", Token, Cur, Obj));
                }
            }

            if (Obj == null)
            {
                if (TokenParams != null && TokenParams.Defined("null"))
                {
                    Obj = TokenParams.Get <string>("null");
                    return(DataType.String);
                }

                return(DataType.None);
            }
            else if (Obj is JObject JObject)
            {
                if (JObject.TryGetValue("__type", out JToken TypeToken) && JObject.TryGetValue("__data", out JToken DataToken))
                {
                    Obj = new EmbeddedData(TypeToken, DataToken);
                    return(DataType.EmbeddedData);
                }

                return(DataType.Object);
            }
            else if (Obj is JArray)
            {
                return(DataType.Array);
            }
            else if (Obj is string RootStr)
            {
                // TODO: Fix eventually
                Obj = RootStr.Trim().Replace("\r", "").Replace("\n", " ").Replace("\t", " ");

                /*if (RootStr.Contains("\n"))
                 *      Debugger.Break();*/

                return(DataType.String);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
        void ProcessTable(Body Body, Table Table)
        {
            TableRow[]      TableRows  = Table.Elements <TableRow>().ToArray();
            TableProperties TableProps = Table.Elements <TableProperties>().First();
            TableGrid       TableGrid  = Table.Elements <TableGrid>().First();

            // TODO: Change exception types
            if (TableRows.Length != 1)
            {
                for (int j = 0; j < TableRows.Length; j++)
                {
                    TableCell[] Cells = TableRows[j].Elements <TableCell>().ToArray();

                    for (int i = 0; i < Cells.Length; i++)
                    {
                        Process(Body, Cells[i]);
                    }
                }
            }
            else
            {
                TableRow    TemplateRow = TableRows[0];
                TableCell[] Cells       = TemplateRow.Elements <TableCell>().ToArray();

                WordTable WTable = WordTableContext.Begin();
                for (int i = 0; i < Cells.Length; i++)
                {
                    WTable.BeginColumn();
                    Process(Body, Cells[i]);
                    WTable.EndColumn();
                }

                WordTable.Column[] Columns = WTable.GetColumns();
                WordTableContext.End();

                int RowCount = 0;

                if (Columns.Length > 0)
                {
                    RowCount = Columns.Select(C => (C.RefArray?.Count - 1) ?? 0).Max();
                }

                List <TableCell> TableCells = new List <TableCell>();

                for (int i = 0; i < RowCount; i++)
                {
                    TableCells.Clear();

                    for (int j = 0; j < Columns.Length; j++)
                    {
                        JArray RefArray = Columns[j].RefArray;
                        if (RefArray == null)
                        {
                            continue;
                        }

                        if (i < RefArray.Count - 1)
                        {
                            object Val = RefArray[i + 1][Columns[j].Identifier].Value <JValue>().Value;

                            // TODO: Handle stuff other than strings?
                            TableCells.Add(GenerateCell(Val.ToString()));
                        }
                        else
                        {
                            TableCells.Add(GenerateCell(""));
                        }
                    }

                    Table.AppendChild(GenerateRow(TableCells.ToArray()));
                }
            }
        }