制作一个将数据导出到word的MVC (. net 5.0)。做了同样的使用webforms工作得很好,但当做它在MVC,一个'System.IO.FileNotFoundException。系统找不到指定的文件,弹出错误提示。我找不到什么问题,因为我在控制台应用程序和web表单中以相同的方式定位我的文件,或者是否有其他方法在MVC中定位本地文件??无论我使用什么库,代码在webforms/控制台应用程序上工作良好,但在MVC上有同样的问题。谁能告诉我如何在MVC中找到本地文件/目录。谢谢你的宝贵时间。
FileName= "office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" string
StackTrace="
at findandreplacemvc.Controllers.DocxController.CreateWordDocument(Object filename, Object SaveAs)
in D:\Files\C#\findandreplacemvc\findandreplacemvc\Controllers\DocxController.cs:line 113rn
at findandreplacemvc.Controllers.DocxController.generateDocx() in D:\Files\C#\findandreplacemvc\findandreplacemvc\Controllers\DocxController.cs:line 24rn
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)rn
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()rn
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)rn at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()" string
代码:
public class DocxController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult generateDocx()
{
var f1 = @"D:docstemplateFile.docx";
var f2 = @"D:docsreplacedFile.docx";
CreateWordDocument(f1 , f2);
return Ok("done");
}
private void FindAndReplace(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceWithText)
{
//options
object matchCase = true;
object matchwholeWord = true;
object matchwildCards = false;
object matchSoundLike = false;
object nmatchAllforms = false;
object forward = true;
object format = false;
object matchKashida = false;
object matchDiactitics = false;
object matchAlefHamza = false;
object matchControl = false;
object read_only = false;
object visible = true;
object replace = 2;
object wrap = 1;
wordApp.Selection.Find.Execute(ref findText, ref matchCase,
ref matchwholeWord, ref matchwildCards, ref matchSoundLike,
ref nmatchAllforms, ref forward,
ref wrap, ref format, ref replaceWithText,
ref replace, ref matchKashida,
ref matchDiactitics, ref matchAlefHamza,
ref matchControl);
}
private void CreateWordDocument(object filename, object SaveAs)
{
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
object missing = Missing.Value;
Microsoft.Office.Interop.Word.Document myWordDoc = null;
if (System.IO.File.Exists((string)filename))
{
object readOnly = false;
object isvisible = false;
wordApp.Visible = false;
myWordDoc = wordApp.Documents.Open(ref filename, ref missing, ref readOnly,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
myWordDoc.Activate();
//Find and Replace
this.FindAndReplace(wordApp, "varName", "Anything");
this.FindAndReplace(wordApp, "varAddress", "Anything");
myWordDoc.SaveAs2(ref SaveAs, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
myWordDoc.Close();
wordApp.Quit();
}
}
}
}
FileNotFoundException.
这与MVC无关。MVC已经足够老了,可以上高中了(2009年发布),所以如果有这样的问题,每个。net开发人员几年前就会遇到它。
某个路径是错误的,或者web应用程序没有从该路径读取的权限。在不知道是哪一行的情况下,很难说问题出在哪里。
- 应用程序池帐户只有读取web应用程序文件夹中的文件的权限。这不是MVC问题,IIS本身强制执行该限制。当使用IIS Express进行调试时,这可能不明显。
- 文件夹可能不存在。
- 模板文件可能不存在
生成Word文档
这在WebForms中也不能正常工作,原因如下:
- 您需要为网站的每个用户提供Word许可证,即使他们是匿名的。
- 将孤立的Word版本留在内存中太容易了,这会耗尽服务器的内存,直到它爬到停止
- 代码不会在出现错误时关闭Word,也不会处理COM对象,从而导致孤立的Word实例。
创建Word文档不需要Word。自2007年以来,docx
格式允许应用程序直接创建适当的文档。docx
是一个定义良好的格式的包含XML文件的ZIP。您可以直接创建这些文件,使用微软的Open office XML SDK或像NPOI这样的库生成只需几行的Word文件。如果你在NuGet上搜索docx,你会找到200多个结果。NPOI可能是最受欢迎的,有1300万的下载量。
文本替换示例在不到10行的情况下做了与程序相同的事情:
var template = @"Template1.docx";
using (var rs = File.OpenRead(template))
{
var generateFile = @"output1.docx";
using (var ws = File.Create(generateFile))
{
var doc = new XWPFDocument(rs);
foreach (var para in doc.Paragraphs)
{
foreach (var placeholder in placeHolderDictionary)
{
if (para.ParagraphText.Contains(placeholder))
{
para.ReplaceText(placeholder, "Nissl");
}
}
}
doc.Write(ws);
}
}
文件保存到带有doc.Write(ws)
的流。该流可以很容易地成为WebForms或MVC中的Response流,允许您直接将文件发送到浏览器。