Foxtable(狐表)用户栏目专家坐堂 → word模板生成word文件,偶尔提示文件为只读,需要另存,怎么解决呢?


  共有5015人关注过本帖树形打印复制链接

主题:word模板生成word文件,偶尔提示文件为只读,需要另存,怎么解决呢?

帅哥哟,离线,有人找我吗?
cnsjroom
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
word模板生成word文件,偶尔提示文件为只读,需要另存,怎么解决呢?  发帖心情 Post By:2022/8/25 16:52:00 [只看该作者]

word模板生成word文件,偶尔提示文件为只读,需要另存,怎么解决呢?


当前代码为:
Dim e As RequestEventArgs = rq.e
Dim cmd As SQLCommand = rq.cmd
Dim time As String =Format(Date.now,"yyyyMMddHHmmss")
Dim tm As String  = ProjectPath & "Attachments\" & e.Values("文书名") &".doc" '指定模板文件
Dim f1 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc" '指定目标文件
Dim f2 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf" '指定目标PDF文件

If FileSys.FileExists(tm) Then
    Dim wrt As New WordReport(tm,f1)   疑似这个地方是不是没有完整运行 还是运行过快   导致f1会生成,有对应的文件名及文件,但是文件里面的内容跟tm里面的一样,没有被替换过来,然后会再次生成fl,所以出现了文件只读的情况
wrt.AddDataTable(e.Values("文书名"),"主数据源","Se lect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
Dim dt As DataTable = cmd.ExecuteReader()

If dt.DataRows.Count>0 Then
    wrt.Build()
    wrt.SaveToPDF(f2) '保存为PDF文件
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf")
Else
    wrt.Build()
    'wrt.Show()
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc")
End If
Else
    msg(e.Values("文书名") &"[文件不存在或已经被删除!]")
End If


偶尔运行会出现下述错误,提示文件为只读
错误的事件名称项目,HttpRequest
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.Runtime.InteropServices.COMException: 此文件为只读。
 (D:\...\数据查询通知书a78093b8-c7c3-49fb-b...)
   在 Microsoft.Office.Interop.Word.DocumentClass.Save()
   在 Foxtable.WordReport.Quit()
   在 eWebSer.form385_word_Ajax(Request rq)
   --- 内部异常堆栈跟踪的结尾 ---
   在 Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags)
   在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.CallMethod(Container BaseReference, String MethodName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, BindingFlags InvocationFlags, Boolean ReportErrors, ResolutionFailure& Failure)
   在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
   在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
   在 UserCode.HttpRequest(RequestEventArgs e)
2022-08-25 16:49:52
[此贴子已经被作者于2022/8/25 17:01:02编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/25 17:03:00 [只看该作者]

可能是并发导致的,试试加上毫秒值

Dim time As String =Format(Date.now,"yyyyMMddHHmmssfffff")

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)可能是并发导致的,试试加上毫秒值Di...  发帖心情 Post By:2022/8/25 17:12:00 [只看该作者]

老师  加上毫秒值也是会出现类似情况
还有没有其他办法解决呢?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/25 17:29:00 [只看该作者]

使用try处理一下,如果出错就重新生成一次报表

Try
   生成报表
Catch ex As Exception
   再次生成报表
End Try
其它处理

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)使用try处理一下,如果出错就重新生成...  发帖心情 Post By:2022/8/25 20:31:00 [只看该作者]

经过测试  还是会出现文件只读的情况

继续求教老师!

[此贴子已经被作者于2022/8/25 20:44:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/25 20:40:00 [只看该作者]

如果只是偶尔,那就返回页面提示出错。然后提示用户重新操作一次。

或者考虑做个计划管理,定时把可用的报表都生成文件。网页先查询是否有已经生成的文件,没有再生成

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)如果只是偶尔,那就返回页面提示出错...  发帖心情 Post By:2022/8/25 20:45:00 [只看该作者]

老师   那这个错误怎么返回给用户呢?

 


图片点击可在新窗口打开查看此主题相关图片如下:11.png
图片点击可在新窗口打开查看
当前代码如下:

Dim e As RequestEventArgs = rq.e
Dim cmd As SQLCommand = rq.cmd
Dim time As String =Format(Date.now,"yyyyMMddHHmmssfffff")
Dim tm As String  = ProjectPath & "Attachments\" & e.Values("文书名") &".doc" '指定模板文件
Dim f1 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc" '指定目标文件
Dim f2 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf" '指定目标PDF文件

If FileSys.FileExists(tm) Then
  
Try
  Dim wrt As New WordReport(tm,f1)
wrt.AddDataTable(e.Values("文书名"),"主数据源","Se lect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
Dim dt As DataTable = cmd.ExecuteReader()
    If dt.DataRows.Count>0 Then
    wrt.Build()
    wrt.SaveToPDF(f2) '保存为PDF文件
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf")
Else
    wrt.Build()
    'wrt.Show()
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc")
End If
Catch ex As Exception
  Dim wrt As New WordReport(tm,f1)
wrt.AddDataTable(e.Values("文书名"),"主数据源","S elect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
Dim dt As DataTable = cmd.ExecuteReader()
    If dt.DataRows.Count>0 Then
    wrt.Build()
    wrt.SaveToPDF(f2) '保存为PDF文件
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf")
Else
    wrt.Build()
    'wrt.Show()
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc")
End If
End Try
 Dim wrt As New WordReport(tm,f1)
wrt.AddDataTable(e.Values("文书名"),"主数据源","Se lect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
Dim dt As DataTable = cmd.ExecuteReader()
    If dt.DataRows.Count>0 Then
    wrt.Build()
    wrt.SaveToPDF(f2) '保存为PDF文件
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".pdf")
Else
    wrt.Build()
    'wrt.Show()
    wrt.Quit() '退出
    e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time &".doc")
End If
Else
    msg(e.Values("文书名") &"[文件不存在或已经被删除!]")
End If


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/25 20:53:00 [只看该作者]

每次都用新的时间生成文件名,不然肯定是重复的啊

Dim e As RequestEventArgs = rq.e
Dim cmd As SQLCommand = rq.cmd
Dim tm As String = ProjectPath & "Attachments\" & e.Values("文书名") & ".doc" '指定模板文件

If FileSys.FileExists(tm) Then
    
    Try
        Dim time As String = Format(Date.now, "yyyyMMddHHmmssfffff")
        Dim f1 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".doc" '指定目标文件
        Dim f2 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".pdf" '指定目标PDF文件
        Dim wrt As New WordReport(tm, f1)
        wrt.AddDataTable(e.Values("文书名"), "主数据源", "Se lect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
        cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
        Dim dt As DataTable = cmd.ExecuteReader()
        If dt.DataRows.Count > 0 Then
            wrt.Build()
            wrt.SaveToPDF(f2) '保存为PDF文件
            wrt.Quit() '退出
            e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".pdf")
        Else
            wrt.Build()
            'wrt.Show()
            wrt.Quit() '退出
            e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".doc")
        End If
    Catch ex As Exception
        Dim time As String = Format(Date.now, "yyyyMMddHHmmssfffff")
        Dim f1 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".doc" '指定目标文件
        Dim f2 As String = ProjectPath & "mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".pdf" '指定目标PDF文件
        Dim wrt As New WordReport(tm, f1)
        
        wrt.AddDataTable(e.Values("文书名"), "主数据源", "S elect * from {" & e.Values("文书名") & "} where guid = '" & e.Values("guid") & "' ")
        cmd.CommandText = "sel ect * from SYS_Dictionary where 字典值='是' and 分类='PDF预览'"
        Dim dt As DataTable = cmd.ExecuteReader()
        If dt.DataRows.Count > 0 Then
            wrt.Build()
            wrt.SaveToPDF(f2) '保存为PDF文件
            wrt.Quit() '退出
            e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".pdf")
        Else
            wrt.Build()
            'wrt.Show()
            wrt.Quit() '退出
            e.WriteString("\mybaobiao\" & e.Values("文书名") & e.Values("创建人") & e.Values("guid") & time & ".doc")
        End If
    End Try
Else
    e.WriteString(e.Values("文书名") & "[文件不存在或已经被删除!]")
End If

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)每次都用新的时间生成文件名,不然肯...  发帖心情 Post By:2022/8/25 21:23:00 [只看该作者]

思路一开始也是以最新时间来生成的文件,但是当前最新时间生成的文件也会出现重名?

 
图片点击可在新窗口打开查看此主题相关图片如下:11.png
图片点击可在新窗口打开查看

经测试 还是会出现另存为这个窗体

有没有办法简单粗暴  当出现另存为窗体的时候,直接代码后台关闭另存为窗体呢

[此贴子已经被作者于2022/8/25 21:24:13编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106168 积分:539957 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/25 21:37:00 [只看该作者]

请上传实例测试

 回到顶部
总数 11 1 2 下一页