0

我有一个 C#/WPF 应用程序,它允许用户将信息导出到 Word 文档中。目前它可以工作 - 并按预期创建文档 - 但是 UI 锁定并且当我尝试线程化此方法时,我得到了不同的错误。

文档创建包含自定义项目列表,然后根据每个项目在 Word 文档中构建部分。它为每个图像创建一个表格,并在这些表格中插入一个图像占位符。完成此操作后,我将遍历文档并用相关图像替换占位符。

我相信线程问题是由于图像插入文档的方式 - 使用 Clipboard.Clear() 和 Clipboard.SetDataObject(img)。

有没有一种更简洁的方法可以将磁盘中的 JPG 插入到文档中,或者有没有一种很好的方法来线程化这种方法?这是违规的方法:

private static void InsertImagesTables(string document, List<Record> allRecords)
    {
        Document oDoc = oWord.Documents.Open(document);
        Object oMissing = Missing.Value;
        object NormalStyle = "Normal";
        oWord.Visible = false;
        foreach (Record record in allRecords)
        {
            foreach (RecordImage rImage in record.Images)
            {
                //insert over placeholder
                var range = oDoc.Content;
                if (range.Find.Execute("[[" + record.Title + rImage.ImagePath + "]]"))
                {
                    try
                    {
                        //insert the image
                        var prevRange = range.Previous(WdUnits.wdCharacter);
                        Table imageTable;
                        imageTable = oDoc.Tables.Add(range, 1, 1, ref oMissing, ref oMissing);
                        imageTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleNone;
                        imageTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleNone;

                        Image img = Image.FromFile(rImage.ImagePath + ".jpg");
                        Clipboard.Clear();
                        Clipboard.SetDataObject(img);
                        imageTable.Cell(1, 1).Range.Paste();
                        imageTable.Cell(1, 1).Range.set_Style(ref NormalStyle);
                        imageTable.Cell(1, 1).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

                        InlineShape inlineShape = imageTable.Cell(1, 1).Range.InlineShapes[1];

                        imageTable.Rows.Alignment = WdRowAlignment.wdAlignRowCenter;

                        string caption = rImage.Caption;
                        inlineShape.Range.InsertCaption(Label: "Figure", Title: " - " + caption, Position: WdCaptionPosition.wdCaptionPositionBelow);

                        range.Expand(WdUnits.wdParagraph);
                    }
                    catch // no image for record - do nothing
                    { }
                }
            }
        }

        oDoc.Close(true);
    }

我尝试过 BackgroundWorkers、Dispatchers、异步任务和线程(有和没有 ApartmentState.STA),结果各不相同。大多数只是引发错误,但少数运行并完成,没有将每个图像都放在文档中 - 例如 STA 方法。

非常感谢这里的任何帮助,

麦克风

4

1 回答 1

1

固定的。感谢 vernou 抽出宝贵时间。我通过删除剪贴板交互解决了这个问题,而是通过后台工作人员正确利用 Word 互操作:

Range cellRange = imageTable.Cell(1, 1).Range;
cellRange.InlineShapes.AddPicture(rImage.ImagePath + ".jpg", ref oMissing, ref oMissing, ref oMissing);

代替:

Clipboard.Clear();
Clipboard.SetDataObject(img);
                        
imageTable.Cell(1, 1).Range.Paste();
于 2021-08-18T10:28:17.967 回答