none
Изображение из БД не выгружается в файл Word с помощью Open XML SDK. RRS feed

  • Общие обсуждения

  • Здравствуйте! Не могу решить проблему выгрузки картинок в файл docx. Данные и изображения находятся в базе данных SQL Server 2008. Картинки находятся в столбце с типом image. С помощью библиотеки OpenXml создаю таблицы с данными и картинками в файле Word. Программа работает без ошибок, файл создаётся и открывается, но на месте изображений - сообщение "Сейчас не удаётся отобразить рисунок". Меняю расширение на zip. В подкаталоге с img вижу список jpg-файлов с нулевыми размерами. Подменяю первый файл на нормальный jpg. Меняю расширение на docx. Файл открывается, картинка есть!
    Прилагаю кусок кода. В закомментированном куске видно, что из MemoryStream данные записываются в jpg-файл. Файл получается нормальным. И способ загрузки из файла и передача его в docx проходит нормально.
    Всё делаю по аналогии с советами MS: " Как вставить таблицу в текстовый документ (Open XML SDK)" и   "Как вставить изображение в текстовый документ (Open XML SDK)".

    В чём дело? Кто знает - помогите, пожалуйста! "ГОРЮ"!!!

    И ещё, если можно, подскажите, как правильно организовать цикл вставки нескольких картинок в одну таблицу (в примере  видно, что выборка принудительно берёт 1 строку).

    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Wordprocessing;
    
    using A = DocumentFormat.OpenXml.Drawing;
    using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
    using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
    
    using System;
    using System.IO;
    using System.Data.SqlClient;
    using System.Data;
    
    .
    .
    .
    
           public void CreateTable(string fileName, String[] zap, int i, out string text1 )        // Вставить таблицу в текстовый документ.
            {
                using ( WordprocessingDocument doc = WordprocessingDocument.Open(fileName, true))      // Имя файла и путь, переданный в качестве аргумента, чтобы открыть существующий документ Word 2007.
                {
    .
    .
    .
     
    // Создать 5ю  таблицу - для ИЗОБРАЖЕНИЙ.
                    Table table5 = new Table();      // Создать 5ю пустую таблицу.
                                    TableProperties tblProp5 = new TableProperties(new TableBorders(
                                        new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 }, new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 },
                                        new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 }, new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 },
                                        new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 }, new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Thick), Size = 7 }
                                        ), new TableWidth() { Width = "111100", Type = TableWidthUnitValues.Dxa }
                                    );
                    table5.AppendChild<TableProperties>(tblProp5);        // Добавить объект TableProperties (свойства) к пустой таблице.
     
                    TableRow tr9 = new TableRow(new TableRowProperties());        // Создать 9ю строку.
     
                    TableCell tc91 = new TableCell();        // Создать 1 ячейку таблицы 5.
                                    tc91.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "700" }));       // Указать свойство ширина ячейки таблицы.
                                    Paragraph Par91 = new Paragraph(new Justification() { Val = JustificationValues.Center });      // Новый параграф.
                                    RunProperties RunProp91 = new RunProperties(new Bold(), new FontSize() { Val = "24" }, new RunFonts() { Ascii = "TimesNewRoman", HighAnsi = "TimesNewRoman", EastAsia = "TimesNewRoman", ComplexScript = "TimesNewRoman" });      //  Свойство ячейки таблицы.
                                    Run run91 = new Run(RunProp91, new Text("Рис-унки"));      // Укажите содержимое ячейки таблицы.
                                    Par91.Append(run91);
                                    tc91.Append(Par91);      // Указать содержимое ячейки таблицы.
                                    tr9.Append(tc91);     // Добавляем ячейку таблицы к строке 9 таблицы 5.
     
                    TableCell tc92 = new TableCell();        // Создать 2ю ячейку таблицы.
                                    tc92.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "10400" }));       // Укажите свойство ширина ячейки таблицы.
                                    Paragraph Par92 = new Paragraph(new Justification() { Val = JustificationValues.Center });      // Новый параграф.
                                    RunProperties RunProp92 = new RunProperties(new FontSize() { Val = "24" }, new RunFonts() { Ascii = "TimesNewRoman", HighAnsi = "TimesNewRoman", EastAsia = "TimesNewRoman", ComplexScript = "TimesNewRoman" });      //  Свойство ячейки таблицы.
     
     
                MainDocumentPart mainPart = doc.MainDocumentPart;
                ImagePart imgPart = mainPart.AddImagePart(ImagePartType.Jpeg);
                string ConnectionString = @"Data Source=PAT-PAPO-SVR; User ID=sa;  Password=(M#naLim; Initial Catalog=Prom_obr;  Persist Security Info=True";
                string queryString = "SELECT top(1)  img   FROM Prom_obr.dbo.img  where H110=@H0110 ";
     
                using (SqlConnection connection2 = new SqlConnection(ConnectionString))
                {
                       SqlCommand command2 = new SqlCommand(queryString, connection2);
                       command2.Parameters.Add("@H0110", SqlDbType.NVarChar, 50);    //ДОБАВИТЬ ПАРАМЕТРЫ в команду SQL
                       command2.Parameters["@H0110"].Value = zap[0];    // передаем переменную в команду SQL через параметр
                    connection2.Open();
                    SqlDataReader sqlDtRd = command2.ExecuteReader();
     
                        MemoryStream memStr = new MemoryStream();
                        foreach (DbDataRecord rcrd in sqlDtRd)
                            {   memStr.Write((byte[])rcrd["img"], 0, ((byte[])rcrd["img"]).Length);     text1 = " Из БД: " + rcrd["img"].GetType().Name;   }
                        imgPart.FeedData(memStr);
                        /* Запись в файл:
                        Image imge = Image.FromStream(memStr);
                        imge.Save(@"D:\1.jpg");*/
                        /* загрузка из файла:
                        string fileImg = @"D:\PromObraz\Output\s001_001.jpg";
                        using (FileStream streamf = new FileStream(fileImg, FileMode.Open))
                        {
                            imgPart.FeedData(streamf);
                        }*/
     
                        string relShipId = mainPart.GetIdOfPart(imgPart);
                        Drawing img = new Drawing(
                                 new DW.Inline(
                                     new DW.Extent() { Cx = 1990000L, Cy = 1792000L },
                                     new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
                                     new DW.DocProperties() { Id = (UInt32Value)1U, Name = "Picture 1" },
                                     new DW.NonVisualGraphicFrameDrawingProperties(new A.GraphicFrameLocks() { NoChangeAspect = true }),
                                     new A.Graphic(new A.GraphicData(new PIC.Picture(
                                                 new PIC.NonVisualPictureProperties(
                                                     new PIC.NonVisualDrawingProperties() { Id = (UInt32Value)0U, Name = "New Bitmap Image.jpg" },
                                                     new PIC.NonVisualPictureDrawingProperties()),
                                                 new PIC.BlipFill(new A.Blip(new A.BlipExtensionList(new A.BlipExtension() { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }))
                                                 { Embed = relShipId, CompressionState = A.BlipCompressionValues.Print },
                                                     new A.Stretch(new A.FillRectangle())),
                                                 new PIC.ShapeProperties(
                                                     new A.Transform2D(new A.Offset() { X = 0L, Y = 0L }, new A.Extents() { Cx = 1990000L, Cy = 1792000L }),
                                                     new A.PresetGeometry(new A.AdjustValueList())
                                                     { Preset = A.ShapeTypeValues.Rectangle }) ))
                                     { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }
                                     )
                                 )
                                 { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U, EditId = "50D07946" });
     
                        tc92.AppendChild(new Paragraph(new Run(img)));
     
                        memStr.Dispose();
                        connection2.Close();
                }
     
                    tr9.Append(tc92);     // Добавляем ячейку таблицы к строке 9 таблицы 5.
                    table5.Append(tr9);       // Добавляем 8ю строку таблицы в таблицу 5.
                    doc.MainDocumentPart.Document.Body.Append(table5);       // Добавить таблицу 5 к документу.
     
                }   //конец using
            }
     
        }

    29 октября 2019 г. 9:18