2016-05-23 1 views
0

Я борюсь за то, как я мог обработать преобразование этого массива System.Byte [] в моей таблице, исходящей из моего Datagridview, см. Столбец, содержащий изображения, которые только отображения Sytem.Byte []Как преобразовать System.Byte [] в изображение, которое будет отображаться в Word C#

enter image description here

это код, который им с помощью, но все это только отображение текста.

private void ToCsV(DataGridView DGV, string filename) 
    { 
     try 
     { 
      if (DGV.Rows.Count != 0) 
      { 


       int RowCount = DGV.Rows.Count; 
       int ColumnCount = DGV.Columns.Count; 
       Object[,] DataArray = new object[RowCount + 1, ColumnCount + 1]; 

       //add rows 
       int r = 0; 
       for (int c = 0; c <= ColumnCount - 1; c++) 
       { 
        for (r = 0; r <= RowCount - 1; r++) 
        { 
         DataArray[r, c] = DGV.Rows[r].Cells[c].Value; 
        } //end row loop 
       } //end column loop 



       Document oDoc = new Document(); 
       oDoc.Application.Visible = true; 



       //page orintation 
       oDoc.PageSetup.Orientation = WdOrientation.wdOrientLandscape; 


       dynamic oRange = oDoc.Content.Application.Selection.Range; 
       string oTemp = ""; 
       for (r = 0; r <= RowCount - 1; r++) 
       { 
        for (int c = 0; c <= ColumnCount - 1; c++) 
        { 
         oTemp = oTemp + DataArray[r, c] + "\t"; 

        } 
       } 

       //table format 
       oRange.Text = oTemp; 

       object Separator = WdTableFieldSeparator.wdSeparateByTabs; 
       object ApplyBorders = true; 
       object AutoFit = true; 
       object AutoFitBehavior = WdAutoFitBehavior.wdAutoFitContent; 

       oRange.ConvertToTable(ref Separator, ref RowCount, ref ColumnCount, 
             Type.Missing, Type.Missing, ref ApplyBorders, 
             Type.Missing, Type.Missing, Type.Missing, 
             Type.Missing, Type.Missing, Type.Missing, 
             Type.Missing, ref AutoFit, ref AutoFitBehavior, Type.Missing); 

       oRange.Select(); 

       oDoc.Application.Selection.Tables[1].Select(); 
       oDoc.Application.Selection.Tables[1].Rows.AllowBreakAcrossPages = 0; 
       oDoc.Application.Selection.Tables[1].Rows.Alignment = 0; 
       oDoc.Application.Selection.Tables[1].Rows[1].Select(); 
       oDoc.Application.Selection.InsertRowsAbove(1); 
       oDoc.Application.Selection.Tables[1].Rows[1].Select(); 

       //header row style 
       oDoc.Application.Selection.Tables[1].Rows[1].Range.Bold = 1; 
       oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Name = "Tahoma"; 
       oDoc.Application.Selection.Tables[1].Rows[1].Range.Font.Size = 14; 

       //add header row manually 
       for (int c = 0; c <= ColumnCount - 1; c++) 
       { 
        oDoc.Application.Selection.Tables[1].Cell(1, c + 1).Range.Text = DGV.Columns[c].HeaderText; 
       } 

       //table style 
       oDoc.Application.Selection.Tables[1].set_Style("Grid Table 4 - Accent 5"); 
       oDoc.Application.Selection.Tables[1].Rows[1].Select(); 
       oDoc.Application.Selection.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter; 

       //header text 
       foreach (Section section in oDoc.Application.ActiveDocument.Sections) 
       { 
        Range headerRange = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; 
        headerRange.Fields.Add(headerRange, WdFieldType.wdFieldPage); 
        headerRange.Text = "your header text"; 
        headerRange.Font.Size = 16; 
        headerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; 
       } 

       /* string fileName = @"C:\Users\JethroPaulo\Desktop\a314bf90a43cb49873d014b00bb3672b.jpg"; //the picture file to be inserted 
       Object oMissed = oDoc.Paragraphs[2].Range; //the position you want to insert 
       Object oLinkToFile = false; //default 
       Object oSaveWithDocument = true;//default 
       oDoc.InlineShapes.AddPicture(fileName, ref oLinkToFile, ref oSaveWithDocument, ref oMissed); 

       //Insert text 
       Object oMissing = System.Reflection.Missing.Value; 
       var oPara1 = oDoc.Content.Paragraphs.Add(ref oMissing); 
       oPara1.Range.Text = "First Text"; 
       oPara1.Range.InsertParagraphAfter(); 


       Image sparePicture = fetch; 
       Clipboard.SetDataObject(sparePicture); 
       var oPara2 = oDoc.Content.Paragraphs.Add(ref oMissing); 
       oPara2.Range.Paste(); 
       oPara2.Range.InsertParagraphAfter();*/ 
       //save the file 
       oDoc.SaveAs(filename); 

       //NASSIM LOUCHANI 
      } 
     } 
     catch (Exception ex) 
     { 
      DialogResult result = MessageBox.Show(ex.Message.ToString(), "Critical Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); 

     } 
    } 
+0

Пожалуйста, встраивать изображение здесь вместо предоставления URL – Alex

+1

@Alex вам нужно определенное количество репутации, прежде чем вы можете включить изображения. –

ответ

0

Идея г-на Джереми - отличная помощь. отсутствующий элемент, который я нашел, выглядит следующим образом:

  1. Объект отсутствует. Этот объект относится к таблице, в которой указаны ячейки, в которые будут помещены изображения. [Document.Table [1] .Cells (строка, col) .Range]
  2. Изображение sparePicture - вместо использования Object [,] DataArray (см. Предыдущий код выше) я использовал скорее объект Image для хранения массива изображения, а затем настроить его в буфере обмена и вставить его.
  3. InsertParagrahAfter() - используя этот метод, я вставил изображения один за другим в их назначенные ячейки, как в dataGridview.

     for (int c = 0; c <= ColumnCount - 1; c++) 
          { 
           for (r = 0; r <= RowCount - 1; r++) 
           { 
            if (c == 5) 
            { 
    
             Object oMissing = oDoc.Tables[1].Cell(r + 2, 6).Range; //the position where you want to put the images 
    
             Image sparePicture = ByteArrayToImage((byte[])DGV.Rows[r].Cells[c].Value); 
             Clipboard.SetImage(sparePicture); 
             Word.Paragraph oPara2 = oDoc.Content.Paragraphs.Add(ref oMissing); 
             oPara2.Range.Paste(); 
             oPara2.Range.InsertParagraphAfter(); 
            } 
           } 
          } 
    
1

Вы не копировали my answer exactly, вы пропустили ByteArrayToImage

Image sparePicture = ByteArrayToImage(fetch); //<-- This is what you're missing 
Clipboard.SetDataObject(sparePicture); 
var oPara2 = oDoc.Content.Paragraphs.Add(ref oMissing); 
oPara2.Range.Paste(); 
oPara2.Range.InsertParagraphAfter(); 

...

public Image ByteArrayToImage(byte[] byteArrayIn) 
{ 
    using (MemoryStream ms = new MemoryStream(byteArrayIn)) 
    { 
     Image returnImage = Image.FromStream(ms); 
     return returnImage; 
    } 
} 

Вы не показывают, что fetch есть, но я предполагаю, что сво byte[], поэтому для реализации этого:

int r = 0; 
for (int c = 0; c <= ColumnCount - 1; c++) 
{ 
    for (r = 0; r <= RowCount - 1; r++) 
    { 
     if (c == 5) { //Change the constant 5 to use the Student_Image column index 
      DataArray[r, c] = ByteArrayToImage(DGV.Rows[r].Cells[c].Value); 
     } 
     else { 
      DataArray[r, c] = DGV.Rows[r].Cells[c].Value; 
     } 
    } 
} 
+0

fetch is byte [] ... на самом деле я использовал его уже, но он только читал последнее изображение внутри datagridview ... – rillakkuma

+0

Вы фактически не показываете, где вы вставляете изображение в таблицу, есть только прокомментированный код для вставьте изображение в конец. Если этот код был раскоментирован, он, вероятно, отобразит только последний образ datagridview. Вам нужно добавить этот код внутри цикла for, где вы заполняете строки. ps лучше всего изменить имя функции 'ToWord' как ее не CSV. –

+0

im, вставляя изображения внутри PhpMyAdmin MySql (как изображения Blob), а затем извлекаем их в datagridview ... это код, в котором я заполняю строки. // добавить строки int r = 0; для (Int С = 0, С <= ColumnCount - 1; C++) { для (г = 0, R <= RowCount - 1; г ++) { DataArray [г, с] = DGV.Rows [г ] .Cells [с] .value; } // конец строки цикла } // конец цикла столбца, но DataArray отображает значение не точно. ИЗОБРАЖЕНИЕ, которое мне нужно – rillakkuma

Смежные вопросы