如何更快更便捷地把excel单元格中的部分内容正则批量替换[已解决]
本帖最后由 cnergao 于 2013-2-14 11:53 编辑国家 简介
中国 语言:<strong>汉字<br /></strong>
美国 语言:<strong>美式英语<br /></strong>
日本 语言:<strong>日语<br /></strong>
俄罗斯 语言:<strong>俄语<br /></strong>
英国 语言:<strong>英语<br /></strong>
德国 语言:<strong>德语<br /></strong>
以上是两列excel表格的内容。
我现要想要做的是把简介这列表格中“<strong>汉字<br /></strong>"内“汉字”等文字替换成“国家”列中的文字内容
即变成下面的
国家 简介
中国 语言:<strong>中国<br /></strong>
美国 语言:<strong>美国<br /></strong>
日本 语言:<strong>日本<br /></strong>
俄罗斯 语言:<strong>俄罗斯<br /></strong>
英国 语言:<strong>英国<br /></strong>
德国 语言:<strong>德国<br /></strong>
#include <Excel.au3>
Local$aArray2,$aArray1
$sFilePath1 = "D:\AUTOIT_3.3.7.15.1\Test.xls" ;该文件应该已存在
$oExcel = _ExcelBookOpen($sFilePath1)
$I=$oExcel.ActiveSheet.Range("A65535").End(-4162).Row;读取单元格数
$aArray1 = _ExcelReadArray($oExcel, 2, 1, $I-1, 1) ;从活动工作表的行或列创建一个数组垂直方向
$aArray2 = _ExcelReadArray($oExcel, 2, 2, $I-1, 1)
$Y=0
do
_ExcelWriteCell($oExcel,StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b'),$Y+1,2)
$Y=$Y+1
until $Y=$I-1
以上只是简单的几条数据,实际有几千上万条数据。我的思路是要全部读取替换完保存到数组再写回单元格。但是数组操作出错,怎么把DO until 这段改成数组写回单元格?
以上程序改成数组方式写入示例#include <Excel.au3>
#include <Array.au3>
Local $I, $Y, $result, $aArray2,$aArray1
$sFilePath1 = "D:\AUTOIT_3.3.7.15.1\Test.xls" ;该文件应该已存在
$oExcel = _ExcelBookOpen($sFilePath1)
$I=$oExcel.ActiveSheet.Range("A65535").End(-4162).Row;读取列表有效单元格数
$aArray1 = _ExcelReadArray($oExcel, 2, 1, $I-1, 1) ;从活动工作表的行或列创建一个数组垂直方向
$aArray2 = _ExcelReadArray($oExcel, 2, 2, $I-1, 1)
Dim $array[$I-1];定义数组做为保存替换用
$Y=0
do
$array[$Y]=StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b');保存正则替换的数组
$Y=$Y+1
Until $y=$I-1
_ExcelWriteArray($oExcel,2,2,$array,1,0);写入数组
之前因为数组的定义问题。一直写入出错。请大家看看还有什么需要改进,这个数组的定义还有其他方法没? 用多个case 去做罗...先抓出汉字/美语/日语/鸟语再去replace它 我的思路:
1. 另存为csv文件
2. Fileopen打开—>正则替换->保存
3.再次另存为xls文件 回复 2# henry10423
以上只是简单的几条数据,实际有几千上万条数据。
你这CASE条件是什么?
请问怎么写? 回复 3# xms77
读出来的都是数组。
我想直接换好用_excelwritearray写把数组。少个另存为步骤可省不少时间吧。
把_excelwritecell写单元格变成_excelwritearray写数组。 回复 5# cnergao
我觉得用excel对象来操作是很慢的,文本正则替换才是高效的 回复 6# xms77
两种方法都写一下。运行对比一下看那个快! 提供一下附件看下 回复 5# cnergao
明显#3楼xms77提供的方法针对大据而方快太多了。少了太多的写操作。
其实可以在Excel里直接操作替换的,也不会慢的,甚至更快,因Excel里用的是数据引擎,算法都是经过千锤百炼的,还不是单线程。 回复 9# happytc
对。我就是这么想的。表格列读出来的时候就是一个数组。直接对数组进行替换并保存至另一个数组。全部替换好。再写入 回复 8# kevinch
附件跟这个样式一样的。也是这么改一个地方,这个是简例只有2列5行。实际操作附件有十几列几千上万行数据。对这个简例操作就行。想要内容多一些。多复制几个就行! 回复 9# happytc Dim $array[$I-1];定义数组做为保存替换用
$Y=0
do
$array[$Y]=StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b');保存正则替换的数组
$Y=$Y+1
Until $y=$I-1
_ExcelWriteArray($oExcel,2,2,$array,1,0);写入数组
我现在把单个写表格改成数组写了。你看看。还有什么需要修改。运行效果更好的? $file="z:\test.xlsx"
$excel=ObjCreate("excel.application")
$excel.visible=False
$wb=$excel.workbooks.open($file)
With $wb.activesheet
$arr=.range("a2:a"&.cells(.rows.count,1).end(3).row).value
For $n=0 To UBound($arr,2)-1
If $arr[$n]<>"" Then $arr[$n]="语言:<strong>"&$arr[$n]&"<br /></strong>"
Next
.range("a2:a"&.cells(.rows.count,1).end(3).row).offset(0,1).value=$arr
EndWith
$wb.close(True)
$excel.quit
$wb=Null
$excel=Null这样试下,似乎没必要替换,直接生成新的就可以了 回复kevinch
附件跟这个样式一样的。也是这么改一个地方,这个是简例只有2列5行。实际操作附件有十几列几千上万行数据。对这个简例操作就行。想要内容多一些。多复制几个就行!
cnergao 发表于 2013-2-13 18:38 http://www.autoitx.com/images/common/back.gif
仔细一看,才这么点数据量呀,我看到上千万行了
万把行的数据,随便什么方法都可以的。最长也就几秒钟完成了 回复 13# kevinch
关闭屏幕刷新
Application.ScreenUpdating=False
这个语句怎么使用?
页:
[1]
2