我有一个 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 方法。
非常感谢这里的任何帮助,
麦克风