回复 8# ppll2030 [/b
如果是这样,就不必用批处理,而是单独的其它程序操作呢?目前,这个操作用Jupiter可以很好实现,想探索批处理实现的可能。我目前采用:
1)将Word存为xml文件;
2)然后采用strrpc.exe命令进行替换文本
存在的问题是,替换过程比较慢,耗时较长;同时,不知为何,稳定性较差,不同版本的word,有些会出错,问题还在查找。
作者: idwma 时间: 2024-10-2 02:19
例如变量表存在export.txt
AAAA=1
BBBB=2
CCCC=3- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
-
- $a=new-object -com word.application
- $a.visible=1
- $b=$a.documents.open("$(dir export.docx)")
-
- type export.txt|%{
- $c=$_ -split '='
- $a.selection.find.execute($c[0],1,0,0,0,0,1,1,0,$c[1],2)
- }
-
- #$a.quit(-1,1,0)
复制代码
先测试一下看结果没问题再删除最后一行前面的注释#号就能自动保存了
作者: delab-1 时间: 2024-10-2 11:27
回复 10# idwma
运行不能成功,而且所建立的word文档也打不开了。操作过程如下:
1)建立export.docx文档,内容如下:
2024年8月,中国粮食进出口AAAA百万美元,同比上升BBBB%。其中,出口CCCC百万美元,同比下降DDDD%;进口EEEE百万美元,同比上升FFFF%;当月净进口GGGG百万美元。
2)建立export.txt文档,内容如下:
AAAA=1
BBBB=2
CCCC=3
3)然后将提供的程序代码放在run.bat中,上述文件都在一个文件夹中。
双击运行,但是出现上述问题,运行不能成功,而且export.docx也打不开了
作者: idwma 时间: 2024-10-2 12:18
回复 11# delab-1
运行有错误提示吗
测试是可以的
作者: delab-1 时间: 2024-10-2 16:14
本帖最后由 delab-1 于 2024-10-2 16:15 编辑
回复 12# idwma
运行成功啦,太棒了!能否简要介绍一下上述语言(如果有专门的学习材料就更好了),这样便于理解。例如,下面的语言对我就是全新的,有点类似python的语言用法,但是还是第一次遇到,如果有相关资料,学习一下就太好了
$a=new-object -com word.application
$a.visible=1
$b=$a.documents.open("$(dir export.docx)")
特别是,这些运行后面的参数是什么意思 execute($c[0],1,0,0,0,0,1,1,0,$c[1],2)
作者: delab-1 时间: 2024-10-2 16:52
回复 10# idwma
另外,做了一点扩展应用,数字替代效果都不错,有两个问题还请看看如何改建:
1)将替代的变量改为中文后,替代是成功的,但是打开的word文件显示的中文是很奇快的字符,如下:
例如,将下面左边的Name1,Name2,Name3替换成对应中文
Name1:张三
Name2:李四
Name3:王五
替换是成功的,但是打开word后,对应的中文是这样的,不知如何改进处理一下。
寮犱笁
鏉庡洓
鐜嬩簲
2) 按照您说的,把最后一行命令前的注释(#)去掉,但是运行结果显示有错误。
显示如下:
Argument:"1" should be a system.Managment.Automation. PSReference. USe [ref]
at line: 19 char:1
+$a.quit(-1,1,0)
+
+category info : Notspecified [], MethodException
+FullyQualifiedEorrorID:NonRefArgumentToRefParameterMsg
Press any key to continue....
因为对这个语言不熟悉,请帮助看看哪里出的问题。
感谢感谢
作者: ppll2030 时间: 2024-10-3 11:28
回复 9# delab-1
哈。看来是我理解错误了。再来用VBS脚本来试试吧。
1、把你要替换的文本保存为export.txt,要用编码ANSI,否则遇到中文会乱码。
格式如下:
AAAA=1111
BBBB=2222
CCCC=3333
2、把下面代码保存为VBS文件,也是用ANSI编码。
3、以上两个文件跟你的word文件放一块,最后执行vbs文件即可。- Set fso = CreateObject("Scripting.FileSystemObject")
- Set path = fso.GetFolder(".")
- Set file = fso.OpenTextFile(path & "\export.txt", 1)
-
- Set wordApp = CreateObject("Word.Application")
- Set doc = wordApp.Documents.Open(path & "\export.docx")
-
- Do Until file.AtEndOfStream
- line = file.ReadLine()
- If InStr(line, "=") > 0 Then
- oldstr = Split(line, "=")(0)
- newstr = Split(line, "=")(1)
- With doc.Content.Find
- .Text = oldStr
- .Replacement.Text = newStr
- .Execute ,,,,,,,,,,2
- End With
- End If
- Loop
-
- file.Close
- doc.Save
- doc.Close
-
- wordApp.Quit
- Set fso = Nothing
-
- MsgBox "替换完成!"
复制代码
作者: idwma 时间: 2024-10-3 11:38
powershell区的置顶的教程就很好啊
https://learn.microsoft.com/zh-cn/office/vba/api/word.find.execute
https://learn.microsoft.com/zh-cn/office/vba/api/word(enumerations)
扩展后的可以看一下吗
作者: delab-1 时间: 2024-10-3 23:38
回复 15# ppll2030
非常感谢,我对上述程序做了多次,但是中文替代后依然是乱码,数字是没有问题的。不知可否再改进一下?感觉再添加一个类似UTF-8显示的命令就可以了。
再次感谢帮助!
作者: delab-1 时间: 2024-10-4 09:36
回复 15# ppll2030
我对上述程序做了多次,但是中文替代后依然是乱码,数字是没有问题的。不知可否再改进一下? 感觉再添加一个类似UTF-8显示的命令就可以了。
再次感谢帮助!
作者: flashercs 时间: 2024-10-4 13:18
回复 18# delab-1
未测试.
注意:vbs代码编码是ANSI,export.txt编码是Unicode.- Set fso = CreateObject("Scripting.FileSystemObject")
- Set path = fso.GetFolder(".")
- Set file = fso.OpenTextFile(path & "\export.txt", 1,-1)
-
- Set wordApp = CreateObject("Word.Application")
- Set doc = wordApp.Documents.Open(path & "\export.docx")
-
- Do Until file.AtEndOfStream
- line = file.ReadLine()
- If InStr(line, "=") > 0 Then
- oldstr = Split(line, "=")(0)
- newstr = Split(line, "=")(1)
- With doc.Content.Find
- .Text = oldStr
- .Replacement.Text = newStr
- .Execute ,,,,,,,,,,2
- End With
- End If
- Loop
-
- file.Close
- doc.Save
- doc.Close
-
- wordApp.Quit
- Set fso = Nothing
-
- MsgBox "替换完成!"
复制代码
作者: ppll2030 时间: 2024-10-4 13:21
回复 18# delab-1
为什么txt非要用utf-8呢。默认不是ANSI编码的吗
下面是按你要求修改的。- Set fso = CreateObject("Scripting.FileSystemObject")
- Set path = fso.GetFolder(".")
-
- Set objStream = CreateObject("ADODB.Stream")
- objStream.Charset = "utf-8"
- objStream.Open
- objStream.LoadFromFile(path & "\export.txt")
- content = objStream.ReadText
-
- Set wordApp = CreateObject("Word.Application")
- Set doc = wordApp.Documents.Open(path & "\export.docx")
-
- line = Split(content, vbCrLf)
- For i = 0 To UBound(Line)
- If InStr(line(i), "=") > 0 Then
- oldstr = Split(line(i), "=")(0)
- newstr = Split(line(i), "=")(1)
- With doc.Content.Find
- .Text = oldStr
- .Replacement.Text = newStr
- .Execute ,,,,,,,,,,2
- End With
- End If
- next
- doc.Save
- doc.Close
-
- objStream.Close
- wordApp.Quit
- Set fso = Nothing
-
- MsgBox "替换完成"
复制代码
作者: delab-1 时间: 2024-10-4 14:26
回复 20# ppll2030
太好了,这改进程序非常好地解决了中文显示乱码问题 。还有最后一个问题请教。因为需要替代代码较多,这个时候会出现下面这个问题:
例如有两个变量:
var_prov=100
var_prov_v1=123
在运行替换中,如果var_pro出现在前面,就会把文本中的“var_prov_10”替换为“100_v1”(即:把前面的“var_prov”直接替换了),针对这个问题,在程序上有什么好办法吗?
目前,我比较笨的解决办法是,让替代变量列表排序(向下排序),这样保障长变量在前面,即保障“var_prov_v1”在“var_prov”之前,这样也可以解决问题,但是很笨的方法。
再次感谢感谢!!!:loveliness: :loveliness:
作者: ppll2030 时间: 2024-10-4 15:55
回复 21# delab-1
就用你的"笨方法",让脚本帮你从文本末尾行开始向上读取好啦。
把代码第 14 行,改为:- For i = UBound(line) to 0 step -1
复制代码
作者: delab-1 时间: 2024-10-4 20:13
回复 22# ppll2030
太赞了,将批处理与上述程序组合在一起,效果还是蛮不错的 太感谢了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |