Hello Community,
I have a question is there any possibility to export list of products from Creatio to Excel to display exported images in spreadsheet in rows ?
More accurate requirement is to generate proposal to customer with images of products ?
Is it possible in Creatio or add-on's from Marketplace ?
Regards,
Marcin Kott
Like
You can do it with openXml, but it's rather hard :
http://polymathprogrammer.com/2009/11/30/how-to-insert-an-image-in-excel-open-xml/
I got some primitives to do this if you go that way.
Dear Marcin,
Currently, images cannot be exported to Excel. Instead, I recommend you to form printables - just create a report and it will contain product images. Here is a guide on how to create printables: https://academy.creatio.com/documents/administration/7-16/add-new-ms-word-report-creatio
Best regards,
Angela
You can do it with openXml, but it's rather hard :
http://polymathprogrammer.com/2009/11/30/how-to-insert-an-image-in-excel-open-xml/
I got some primitives to do this if you go that way.
I came up with the same idea this morning.
Thank You for confirmation of my assumption.
Here's my primitives :
OpenXmlImageHelper :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DocumentFormat.OpenXml.Packaging; using System.IO; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; using XDR = DocumentFormat.OpenXml.Drawing.Spreadsheet; using System.Drawing; using System.Drawing.Imaging; using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Drawing.Spreadsheet; namespace SML_Export.OpenXml { /// <summary> /// Classe d'aide pour les images dans un classeur excel /// </summary> public static class OpenXmlImageHelper { #region Méthodes publiques /// <summary> /// Converti des données sous forme de chaine en base 64 en instance d'image /// </summary> /// <param name="base64String">flux image encodé en Base64</param> /// <returns>retourne l'objet image correspondant</returns> public static Image GetImageFrom64(string base64String) { MemoryStream stream = new MemoryStream(System.Convert.FromBase64String(base64String)); return Image.FromStream(stream); } /// <summary> /// Insertion d'une image dans une cellule en spécifiant la hauteur / largeur maximum de l'image en cm /// </summary> /// <param name="ws">Feuille excel</param> /// <param name="image">Image à insérer</param> /// <param name="sCellAddress">Référence de la cellule ou insérer l'image</param> /// <param name="fLargeurMaxCentimetres">Largeur maximale de l'image en centimètres</param> /// <param name="fHauteurMaxCentimetres">Hauteur maximale de l'image en centimètres</param> /// <param name="iDeltaRowIndex">OPTIONNEL : Offset de numéro de ligne à appliquer</param> public static void InsertImage(Worksheet ws, Image image, string sCellAddress, double fLargeurMaxCentimetres, double fHauteurMaxCentimetres, uint iDeltaRowIndex = 1) { uint rowNumber = OpenXmlHelper.GetRowIndex(sCellAddress, iDeltaRowIndex); uint colNumber = OpenXmlHelper.GetColumnNumber(OpenXmlHelper.GetColumnName(sCellAddress)); WorksheetPart wsPart = ws.WorksheetPart; string imagerId = "rId" + GetNextImagePartID(wsPart); var drawingsPart = wsPart.DrawingsPart ?? wsPart.AddNewPart<DrawingsPart>(); if (!wsPart.Worksheet.ChildElements.OfType<Drawing>().Any()) { wsPart.Worksheet.Append(new Drawing { Id = wsPart.GetIdOfPart(drawingsPart) }); } if (drawingsPart.WorksheetDrawing == null) { drawingsPart.WorksheetDrawing = new XDR.WorksheetDrawing(); } var worksheetDrawing = drawingsPart.WorksheetDrawing; var imagePart = drawingsPart.AddImagePart("image/png", imagerId); OpenXmlImageHelper.GenerateImagePartContent(imagePart, image); var positioningEMU = new ImagePositioningEMU(image, fLargeurMaxCentimetres, fHauteurMaxCentimetres); var extentsCx = positioningEMU.ImageLargeurEMU; long extentsCy = positioningEMU.ImageHauteurEMU; if (extentsCy > positioningEMU.HauteurMaxEMU || extentsCx > positioningEMU.LargeurMaxEMU) { double scaleX = (double)extentsCx / (double)positioningEMU.LargeurMaxEMU; double scaleY = (double)extentsCy / (double)positioningEMU.HauteurMaxEMU; double scale = Math.Max(scaleX, scaleY); extentsCx = (long)((double)extentsCx / scale); extentsCy = (long)((double)extentsCy / scale); } var nvps = worksheetDrawing.Descendants<XDR.NonVisualDrawingProperties>(); var nvpId = nvps.Count() > 0 ? (UInt32Value)worksheetDrawing.Descendants<XDR.NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1 : 1U; var oneCellAnchor = new XDR.OneCellAnchor( new XDR.FromMarker { ColumnId = new XDR.ColumnId((colNumber - 1).ToString()), RowId = new XDR.RowId((rowNumber - 1).ToString()), ColumnOffset = new XDR.ColumnOffset(0.ToString()), RowOffset = new XDR.RowOffset(0.ToString()) }, new XDR.Extent { Cx = extentsCx, Cy = extentsCy }, new XDR.Picture( new XDR.NonVisualPictureProperties( new XDR.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = "Picture " + nvpId }, new XDR.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) ), new XDR.BlipFill( new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, new Stretch(new FillRectangle()) ), new XDR.ShapeProperties( new Transform2D( new Offset { X = 0, Y = 0 }, new Extents { Cx = extentsCx, Cy = extentsCy } ), new PresetGeometry { Preset = ShapeTypeValues.Rectangle } ) ), new ClientData() ); worksheetDrawing.Append(oneCellAnchor); } #endregion // Méthodes publiques #region Méthodes privées /// <summary> /// Returns the next relationship id for the specified WorksheetPart /// </summary> /// <param name="sheet1">The worksheetPart</param> /// <returns>Returns the next relationship id </returns> internal static int GetNextImagePartID(WorksheetPart sheet1) { int nextId = 0; List<int> ids = new List<int>(); if (sheet1.DrawingsPart.ImageParts.Count() > 0) nextId = sheet1.DrawingsPart.ImageParts.Count() + 1; else nextId = 1; return nextId; } static void GenerateImagePartContent(ImagePart imagePart, Image image) { using (MemoryStream memStream = new MemoryStream()) { image.Save(memStream, System.Drawing.Imaging.ImageFormat.Png); memStream.Position = 0; imagePart.FeedData(memStream); memStream.Close(); } } #endregion // Méthodes privées } }
And ImagePositioningEMU:
namespace SML_Export.OpenXml { /// <summary> /// Classe utilitaire permettant de gérer les conversion cm, pouces, EMU /// </summary> /// <remarks> /// Pour les conversions, voir http://lcorneliussen.de/raw/dashboards/ooxml/ /// Pour la théorie, voir http://archive.oreilly.com/pub/post/what_is_an_emu.html /// </remarks> class ImagePositioningEMU { /// <summary> /// Ratio de conversion Point / EMU /// </summary> internal const long POINT_TO_EMU = 12700L; /// <summary> /// Ratio de conversion Pouce / EMU /// </summary> internal const long INCH_TO_EMU = 914400L; /// <summary> /// Ratio de conversion Centimètre / EMU /// </summary> internal const long CENTIMETER_TO_EMU = 360000L; /// <summary> /// Largeur d'image à ne pas dépasser (en Centimètres) /// </summary> private readonly double largeurMaxCentimetres; /// <summary> /// Hauteur d'image à ne pas dépasser (en Centimètres) /// </summary> private readonly double hauteurMaxCentimetres; /// <summary> /// Résolution horizontale de l'image à charger (en pixel / pouce) /// </summary> private readonly double imageHorizontalResolution; /// <summary> /// Résolution verticale de l'image à charger (en pixel / pouce) /// </summary> private readonly double imageVerticalResolution; /// <summary> /// Largeur de l'image à charger (en pixels) /// </summary> private readonly double imageLargeurPixels; /// <summary> /// Hauteur de l'image à charger (en pixels) /// </summary> private readonly double imageHauteurPixels; /// <summary> /// Résolution Horizontale de l'ordinateur courant (en pixel / pouce) /// </summary> private readonly double currentHorizontalResolution; /// <summary> /// Résolution Verticale de l'ordinateur courant (en pixel / pouce) /// </summary> private readonly double currentVerticalResolution; /// <summary> /// Largeur d'image à ne pas dépasser (en EMU) /// </summary> public long LargeurMaxEMU { get { return Convert.ToInt64(this.largeurMaxCentimetres * CENTIMETER_TO_EMU); } } /// <summary> /// Hauteur d'image à ne pas dépasser (en EMU) /// </summary> public long HauteurMaxEMU { get { return Convert.ToInt64(this.hauteurMaxCentimetres * CENTIMETER_TO_EMU); } } /// <summary> /// Largeur de l'image à positionner (en EMU) /// </summary> public long ImageLargeurEMU { get { return Convert.ToInt64(INCH_TO_EMU * this.imageLargeurPixels / imageHorizontalResolution); } } /// <summary> /// Hauteur de l'image à positionner (en EMU) /// </summary> public long ImageHauteurEMU { get { return Convert.ToInt64(INCH_TO_EMU * this.imageHauteurPixels / imageVerticalResolution); } } /// <summary> /// /// </summary> /// <param name="image">objet Image</param> /// <param name="fLargeurMaxCentimetres">Largeur d'image à ne pas dépasser (en Cm)</param> /// <param name="fHauteurMaxCentimetres">Hauteur d'image à ne pas dépasser (en Cm)</param> public ImagePositioningEMU(Image image, double fLargeurMaxCentimetres, double fHauteurMaxCentimetres) { this.largeurMaxCentimetres = fLargeurMaxCentimetres; this.hauteurMaxCentimetres = fHauteurMaxCentimetres; // > DPI de l'ordinateur courant (pixel / pouce) System.Drawing.Bitmap bmResolution = new System.Drawing.Bitmap(32, 32); this.currentHorizontalResolution = bmResolution.HorizontalResolution; this.currentVerticalResolution = bmResolution.VerticalResolution; // > Résolution Horizontale et verticale de l'image (pixel / pouce) this.imageHorizontalResolution = image.HorizontalResolution; this.imageVerticalResolution = image.VerticalResolution; this.imageLargeurPixels = image.Width; this.imageHauteurPixels = image.Height; image.Dispose(); bmResolution.Dispose(); } } }
Hope it helps ....