我在通过 Azure DevOps 管道部署使用 Microsoft.Office.Interop.Word 的 .NET Core 应用程序时遇到问题。在本地,我设法通过 COMReference 使用 Interop Word 比较 Word 文档,解决了之前的 NuGet 包问题。但是,在通过 Azure DevOps 进行部署期间,我遇到了错误。
上下文如下:
Word.Application wordApp = new Word.Application();
wordApp.Visible = false;
object wordTrue = (object)true;
object wordFalse = (object)false;
object fileToOpen = @"";
object missing = Type.Missing;
Word.Document doc1 = wordApp.Documents.Open(ref fileToOpen,
ref missing, ref wordFalse, ref wordFalse, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref wordTrue, ref missing,
ref missing, ref missing, ref missing);
object fileToOpen1 = @"";
Word.Document doc2 = wordApp.Documents.Open(ref fileToOpen1,
ref missing, ref wordFalse, ref wordFalse, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
Word.Document doc = wordApp.CompareDocuments(doc1, doc2, Word.WdCompareDestination.wdCompareDestinationNew, Word.WdGranularity.wdGranularityWordLevel,
true, true, true, true, true, true, true, true, true, true, "", true);
doc1.Close(ref missing, ref missing, ref missing);
doc2.Close(ref missing, ref missing, ref missing);
// Hides both original and revised documents
wordApp.ActiveWindow.ShowSourceDocuments = WdShowSourceDocuments.wdShowSourceDocumentsNone;
wordApp.Visible = true;
最初,我在使用 Microsoft.Office.Interop.Word 包时遇到 NuGet 包错误,这导致我使用 COMReference 作为解决方法。虽然此解决方案在本地运行,但 Azure DevOps 管道在构建过程中失败并出现以下错误:
Error MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild.
Error CS0234: The type or namespace name 'Office' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
是否有其他方法或解决方案可以使用 Microsoft.Office.Interop.Word 成功部署 .NET Core 应用程序,或者是否有任何解决方法来解决 Azure DevOps 的此问题?任何有关解决此部署错误的指导将不胜感激。
检查此 Github Issue quicoli 和 xDaevax 的评论。
您还可以使用其他库,例如
OpenXml
,而不是 OfficeIntercop
,它们可以很好地与 Azure DevOps 管道配合使用。这是用于比较两个 Word 文档的 OpenXml
库的示例。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
namespace DocumentComparison
{
class Program
{
static void Main(string[] args)
{
string originalFilePath = "path/to/original.docx";
string revisedFilePath = "path/to/revised.docx";
try
{
using (WordprocessingDocument originalDoc = WordprocessingDocument.Open(originalFilePath, false))
using (WordprocessingDocument revisedDoc = WordprocessingDocument.Open(revisedFilePath, false))
{
MainDocumentPart mainPartOriginal = originalDoc.MainDocumentPart;
MainDocumentPart mainPartRevised = revisedDoc.MainDocumentPart;
var altChunkId = "AltChunkId" + DateTime.Now.Ticks.ToString();
AlternativeFormatImportPart chunkOriginal = mainPartOriginal.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
chunkOriginal.FeedData(System.IO.File.Open(originalFilePath, System.IO.FileMode.Open));
AlternativeFormatImportPart chunkRevised = mainPartRevised.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
chunkRevised.FeedData(System.IO.File.Open(revisedFilePath, System.IO.FileMode.Open));
var docComparer = new DocumentComparer(mainPartOriginal, mainPartRevised);
bool isEqual = docComparer.CompareDocuments();
Console.WriteLine($"Documents are {(isEqual ? "equal" : "not equal")}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
public class DocumentComparer
{
private readonly MainDocumentPart _originalDoc;
private readonly MainDocumentPart _revisedDoc;
public DocumentComparer(MainDocumentPart originalDoc, MainDocumentPart revisedDoc)
{
_originalDoc = originalDoc;
_revisedDoc = revisedDoc;
}
public bool CompareDocuments()
{
// Perform comparison logic here
// You might traverse through paragraphs, runs, etc., comparing content
// Example: Comparing the number of paragraphs
var originalParagraphsCount = _originalDoc.Document.Body.Elements<Paragraph>().Count();
var revisedParagraphsCount = _revisedDoc.Document.Body.Elements<Paragraph>().Count();
return originalParagraphsCount == revisedParagraphsCount;
}
}
}
.NET 6.0 Web App
中将以下代码实现为控制器,并且使用 VsBuild
构建管道成功了:-我的控制器代码:-
using Microsoft.AspNetCore.Mvc;
using Word = Microsoft.Office.Interop.Word;
namespace YourNamespace.Controllers
{
public class WordController : Controller
{
public IActionResult CreateWordDocument()
{
Word.Application wordApp = new Word.Application();
Word.Document doc = wordApp.Documents.Add();
// Add content to the document
Word.Paragraph para1 = doc.Content.Paragraphs.Add();
para1.Range.Text = "Hello, this is a sample document.";
// Save the document
string filePath = @"C:Document.docx";
doc.SaveAs2(filePath);
// Close the document and the Word application
doc.Close();
wordApp.Quit();
// Return a response to indicate successful document creation
return Content("Word document created successfully!");
}
}
}
我的 DevOps 构建管道:-
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: VSTest@2
inputs:
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
输出:-