簡體   English   中英

如何將動態生成的圖像中的圖像傳遞到特定的 MS WORD 表?

[英]How can I pass images from a dynamically generated image to a specific MS WORD table?

有一個表格,里面有文字行,還有一個flowLayotpanel,用於接受動態創建的圖片框,請告訴我實現將圖像(在這種情況下,從1到3張)轉移到MS WORD模板的代碼對於文本,傳輸已實施,我找不到合適的圖像解決方案

像這樣的示例代碼

using DirectShowLib;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;


        private readonly string TemplateFileName = @"D:\BASE\1.docx";
        
        
         private void btn_scrennshot_Click(object sender, EventArgs e)
        {

            try
            {
                if (!Directory.Exists(@"D:\BASE\Images"))
                {
                    Directory.CreateDirectory(@"D:\BASE\Images");
                    MessageBox.Show("OK");
                }
                else
                {
                    string path = @"D:\BASE\Images";

                    pictureBox1.Image.Save(path + @"\" + textBox_3.Text + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".jpeg", ImageFormat.Jpeg);

                }

                var panel = new TableLayoutPanel();

                panel.AutoSize = true;

                Mat m = new Mat();

                capture.Retrieve(m);
                

                var pb = new PictureBox();

                pb.Image = new Bitmap(m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.None).Bitmap);

                pb.SizeMode = PictureBoxSizeMode.Zoom;

                pb.Name = $"SMV_{textBox_3.Text + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second}";

                pb.Height = pb.Image.Height / 10;

                pb.Width = pb.Image.Width / 10;
                
                
                var name = new Label();

                name.Text = $"SMV_{textBox_3.Text + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second}";
                

                var exportimage_btn = new Button();

                exportimage_btn.Text = "Select";

                exportimage_btn.Click += Exportimage_btn_Click;

               

                var deleteimage_btn = new Button();

                deleteimage_btn.Text = "Delete";

                deleteimage_btn.Click += Deleteimage_btn_Click;
                

                panel.Controls.Add(pb);

                panel.Controls.Add(name);

                panel.Controls.Add(exportimage_btn);

                panel.Controls.Add(deleteimage_btn);

                flowLayoutPanel1.Controls.Add(panel);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Deleteimage_btn_Click(object sender, EventArgs e)
        {
            var deleteButton = (Button)sender;

            var tableLayoutPanel = deleteButton.Parent;

            var flowLayoutPanel1 = tableLayoutPanel.Parent;

            flowLayoutPanel1.Controls.Remove(tableLayoutPanel);

            foreach (Control control in tableLayoutPanel.Controls)

                control.Dispose();

            tableLayoutPanel.Dispose();
        }

        private void Exportimage_btn_Click(object sender, EventArgs e)
        {
            var exportButton = (Button)sender;

            var tableLayoutPanel = exportButton.Parent;

            tableLayoutPanel.Controls.Remove(exportButton);

            flowLayoutPanel_images.Controls.Add(tableLayoutPanel);

            exportButton.Dispose();
        }

        private void btn_close_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
        
        
        private void btn_export_Click(object sender, EventArgs e)
        {
            var text1 = textBox_2.Text;
            var text2 = textBox_2.Text;
            var text3 = textBox_3.Text;
            var text4 = textBox_4.Text;
            var data1 = dateTimePicker_1.Value.ToShortDateString();
            var data2 = dateTimePicker_2.Value.ToShortDateString();
            var text5 = textBox_5.Text;
            var text6 = textBox_6.Text;
            var text7 = comboBox_1.Text;
            var text8 = comboBox_2.Text;
            var text9 = comboBox_3.Text;
            var text10 = comboBox_4.Text;
            var text11 = textBox_7.Text;
            var text12 = textBox_8.Text;
            var text13 = comboBox_5.Text;
            var text14 = textBox_9.Text;            

            //TODO WORD
            var wordApp = new Word.Application();
            wordApp.Visible = false;
            try
            {
                var wordDocument = wordApp.Documents.Open(TemplateFileName);

                ReplaceWordStub("{text1}", text1, wordDocument);
                ReplaceWordStub("{text2}", text2, wordDocument);
                ReplaceWordStub("{text3}", text3, wordDocument);
                ReplaceWordStub("{text4}", text4, wordDocument);
                ReplaceWordStub("{data1}", data1 wordDocument);
                ReplaceWordStub("{text5}", text5, wordDocument);
                ReplaceWordStub("{data2}", data2, wordDocument);
                ReplaceWordStub("{text6}", text6, wordDocument);
                ReplaceWordStub("{text7}", text7, wordDocument);
                ReplaceWordStub("{text8}", text8, wordDocument);
                ReplaceWordStub("{text9}", text9, wordDocument);
                ReplaceWordStub("{text10}", text10, wordDocument);
                ReplaceWordStub("{text11}", text11, wordDocument);
                ReplaceWordStub("{text12}", text12, wordDocument);
                ReplaceWordStub("{text13}", text13, wordDocument);
                ReplaceWordStub("{text14}", text14, wordDocument);

                wordDocument.SaveAs2(@"D:\BASE\2.docx");
                wordApp.Visible = true;
            }
            catch
            {
                MessageBox.Show("Error!");
            }
        }

        private void ReplaceWordStub(string stubToReplace, string text, Word.Document wordDocument)
        {
            var range = wordDocument.Content;
            range.Find.ClearFormatting();
            range.Find.Execute(FindText: stubToReplace, ReplaceWith: text);
        }

因為我沒有相機,所以我用現有的圖片來添加。 然后添加並同時保存到文件夾中,保持圖片名稱一致。

大家可以根據自己的實際情況進行修改,我只是作為示范而已。

如果您對我的代碼有疑問,請在下面添加評論。

首先,在模板中添加書簽:

在此處輸入圖片說明

使用選擇找到書簽位置並開始導入圖片。

 bk.Select();
 Selection sel = wordApp.Selection;
 sel.InlineShapes.AddPicture("//path");

導出代碼:

private void btn_export_Click(object sender, EventArgs e) {
    //TODO WORD
    var wordApp = new Word.Application();
    wordApp.Visible = false;
    try {
        var wordDocument = wordApp.Documents.Open(TemplateFileName);
//Through the Applicatin property of Document, we can get the Applicatin object in turn.
        wordApp = wordDocument.Application;
        wordDocument.ActiveWindow.Visible = true;
        foreach (Bookmark bk in wordDocument.Bookmarks) {
            if (bk.Name == "picture") {
//Use the Selection object to insert a picture
                bk.Select();
                Selection sel = wordApp.Selection;
//Traverse the big panel to find all the small panels
                foreach (Control img in flowLayoutPanel_images.Controls) {
//Traverse the small panel to find the label
                    foreach (Control label in img.Controls) {
                        if (label is Label)
//Determine the picture to be added from the folder according to the text of the label
                            sel.InlineShapes.AddPicture(@"C:/demo/images/" + label.Text + ".png");
                    }
                }
            }
        }
        wordDocument.SaveAs(@"C:/demo/images/2.docx");
        wordApp.Quit();
    } catch {
        MessageBox.Show("Error!");
    }
}

原理圖,示意圖:

單詞:

在此處輸入圖片說明

應用程序:

在此處輸入圖片說明

開始:

在此處輸入圖片說明

輸出:

在此處輸入圖片說明

后:

在此處輸入圖片說明 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM