我尝试了很多不同的选项,但无论我做什么,它都不会做任何事情或总是返回newValue错误。
newValue cannot be null.
我似乎不是唯一一个,但自下面的链接以来,它有更新。
docX ReplaceText works incorrect
以下是我原来的例子: -
if (sur.RequestType)
{
templateDoc.ReplaceText("[#1]", "x");
templateDoc.ReplaceText("[#2]", "");
}
else
{
templateDoc.ReplaceText("[#1]", "");
templateDoc.ReplaceText("[#2]", "x");
}
当调试它时,它将到达第4行,然后跳转到第9行,它将在下一步返回newValue不能为空的错误。
所以我试过了: -
string temp1 = "temp1";
if (sur.RequestType)
{
templateDoc.ReplaceText("[#1]", "x");
templateDoc.ReplaceText("[#2]", temp1, false, RegexOptions.IgnoreCase, paraFormat, paraFormat, MatchFormattingOptions.SubsetMatch);
}
else
{
templateDoc.ReplaceText("[#1]", "x.x");
templateDoc.ReplaceText("[#2]", "x", false, RegexOptions.IgnoreCase, paraFormat, paraFormat, MatchFormattingOptions.SubsetMatch);
}
除了几个其他调整,但都返回相同的错误。
在使用ReplaceText之前,我使用了示例项目中的示例: -
templateDoc.AddCustomProperty( new CustomProperty( "CompanySlogan", "Always with you" ) );
templateDoc.AddCustomProperty( new CustomProperty( "ClientName", "James Doh" ) );
在这里,它会遍历每一行,但生成的文档不会替换任何内容。
最后主题更多,但如果有人有更好的解决方案,我会不停地来回尝试输出文件而不保存它,但是有问题将它从Xceed DocX类型转换为HttpResponseMessage。
以下是我最不喜欢的实现,例如我要么将其保存到数据库中,要么跳过保存文件并直接将其提供给用户以保存到他们想要的位置而不是服务器端副本
[HttpGet]
public HttpResponseMessage DownloadRecord(int id)
{
SURequest sur = _sURequestsService.GetRequestData(id);
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/Content/RequestForm.docx");
var fullPath2 = System.Web.Hosting.HostingEnvironment.MapPath(@"~/Content/RequestFormUpdated.docx");
var templateDoc = DocX.Load(fullPath);
var template = CreateRequestFromTemplate(templateDoc, sur);
template.SaveAs(fullPath2);
//using (FileStream fs2 = new FileStream(@"~/Content/RequestFormUpdated.docx", FileMode.Create))
//{
// template.SaveAs(fs2);
//}
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(fullPath2, FileMode.Open);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(fullPath2);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = stream.Length;
return result;
//return fs2;
}
我不知道如何继续使用Xceed,所以我要分支我现在的代码并尝试使用OpenXML看看我是否有更好的运气或者其他人是否可以发现我的情况做错了或如何在Xceed中解决问题?
非常感谢任何帮助。
答案 0 :(得分:0)
原来是VS17的一个问题,它在使用replacetext时表现得很好,似乎在它的编译器中缓存了一个早期的问题。
这个问题就像问题在某个地方一样,只能通过手动停止编译过程来解决。
仍然无法解决AddCustomProperty或跳过生成本地文件的问题。
我打算尝试不让它生成本地文件,但可能需要打开一个特定于此的新问题或设置其他东西来清理旧文件。