c# - C# windows 窗体应用程序 Word 互操作适用于 Windows 7 但不适用于 Windows 10
问题描述
我编写了一个应用程序来帮助用户使用 C# 生成字母。我创建了以富文本格式保存在 SQL Server 数据库中的模板。我的开发机器是 Windows 7,我使用 Visual Studio 2019 来编写应用程序。我使用 NuGet 为 Word 添加互操作引用。该应用程序配置为发布,平台活动(任何 CPU),针对 x86。它是一个 ClickOnce 应用程序,它从单独目录中的共享驱动器安装,但与保存字母的驱动器相同。
该应用程序可以在我的机器上正常运行,但不能从 Windows 10 用户机器上正常运行。当它试图保存文件时,她收到一条错误消息,上面写着“对不起,我们找不到文件”。我们都有 Word 2016。两台机器都是 64 位的。我将这封信保存为 Word 中的备份,然后导出为 PDF。在导出为 PDF 之前,代码无法保存 Word 文档。请看下面的代码片段:
public static void SaveToWord2(string CoverLetter, string LetterText, string FileSave,
string BackUpSave, ref string ErrorString)
{
try
{
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
string HeaderFooterFile = Properties.FileResources.HeaderFooterTemplate;
Document oDoc = new Document();
oDoc = oWord.Documents.Add(@HeaderFooterFile);
oDoc.Activate();
try
{
Clipboard.Clear();
Clipboard.SetText(CoverLetter, TextDataFormat.Rtf);
oDoc.ActiveWindow.Selection.Paste();
Clipboard.Clear();
Clipboard.SetText(LetterText, TextDataFormat.Rtf);
oDoc.ActiveWindow.Selection.Paste();
//01/26/2021 JS having trouble with the save on Pam's machine so going to try to capture the correct error.
try
{
oDoc.SaveAs(@BackUpSave);
}
catch (Exception exBU)
{
ErrorString = "Error trying to save " + @BackUpSave + ": " + exBU.Message;
}
try
{
oDoc.ExportAsFixedFormat(@FileSave, WdExportFormat.wdExportFormatPDF);
}
catch (Exception exPDF)
{
if (string.IsNullOrEmpty(ErrorString))
{
ErrorString = "Error trying to save " + @FileSave + " PDF: " + exPDF.Message;
}
else
{
ErrorString += " and Error trying to save " + @FileSave + " PDF: " + exPDF.Message;
}
}
}
catch (Exception exInner)
{
ErrorString = exInner.Message;
MessageBox.Show(exInner.Message, Properties.LetterResources.SaveToWord, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Clipboard.Clear();
oWord.Quit(SaveChanges: 0);
Marshal.FinalReleaseComObject(oWord);
//oWord.Visible = true;
}
catch (Exception ex)
{
ErrorString = ex.Message;
MessageBox.Show(ex.Message, Properties.LetterResources.SaveToWord, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
该错误发生在 oDoc.SaveAs 行上,但仅在从 Windows 10 计算机运行时发生。最初,我使用了我机器上的互操作,但后来将其更改为 NuGet 互操作,但这并没有解决问题。我尝试将 Embed Interop Types 更改为 False 但这并没有解决任何问题,因此我将其更改回来。互操作引用的 Aliases 属性是全局的,Specific Version 属性是 True。由于富文本,我担心更改文档编写器的类型。该应用程序的其余部分对 Windows 10 用户运行良好。有任何想法吗?
解决方案
OpenXML 没有成功,因为它不允许我正确添加标题或导出为 PDF。尽管我非常希望使用 OpenXML,但我最终还是回到了 Word Interop。我可以通过如下设置参考属性来解决问题:
嵌入互操作类型 = False 复制本地 = True
现在,无论哪个操作系统运行该程序,保存都有效。我有上面的部分答案,但忽略了 Copy Local = true 部分。
推荐阅读
- arrays - 使用 SQL Server 函数将 JSON 数组分解为子表
- azure-devops - 当前环境不支持从 TTY 进行交互式阅读??Azure 管道,Anypoint
- c++11 - 调用“make_shared”没有匹配的函数
- angular - 有没有更好的方法来顺序调用不同的可观察调用?
- java - 如何从 Java 中用户提供的输入中定位文件
- android - 我无法生成签名的 apk。我收到这些消息的错误
- python - Python多维数组索引解释
- wordpress - 将 WordPress Rest API 请求限制到我的域
- c# - C# WPF 代码在创建堆栈面板时停止
- python - 计算密度图 D