公司整理文档工作中,出现了一个需要使用全局字符替换多个word文档、excel文档中的内容的需求。虽然office、WPS都有全局替换的功能(ctrl+h),但是文件过多,且需要替换多次,工作量还是比较令人头大。因此需要自制一个小工具实现多个文件全局替换。
首先查找网上的案例,发现FreeSpire.Doc、FreeSpire.Xls可以通过操作word文档、excel文件来实现这一功能。而且资源易于下载,直接打开程序包控制台,输入指令安装即可。
安装后的项目中的引用列表会多出以下几个新项:
实现替换方法代码如下,以替换excel为例:
Spire.Xls.Workbook workbook = new Spire.Xls.Workbook(); workbook.LoadFromFile(filepath); workbook.Replace(oldstr,newstr);
这样就实现了对单个文件的字符串替换。对文件列表循环调用此方法即可实现多文件多字符的替换。
但是在实际使用中,发现Spire的组件加载很多文件时会报错,不知道是组件内部冲突还是组件本身不支持一些文件。
因此找到了另一款操作office文件的插件:Aspose.Words、Aspose.Cells
Aspose的组件需要在网上下载,下载Aspose.Words.dll、Aspose.Cells.dll两个文件:
下载后在项目中手动添加引用:
完成后的引用列表:
使用Aspose对文件进行替换操作,和Spire的方式很类似,替换word文档中的字符串:
var document = new Aspose.Words.Document(filepath); document.Range.Replace(oldstr, newstr, true, false);
替换excel:
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(filepath); foreach(Aspose.Cells.Worksheet ws in workbook.Worksheets) { ws.Replace(oldstr, newstr); ws.Name.Replace(oldstr, newstr); }
为实现对多个文件进行同时替换,需要有获取选中文件夹中所有文件的方法:
public List<FileInfo> GetAllFiles(DirectoryInfo dir) { List<FileInfo> filelist = new List<FileInfo>(); filelist.AddRange(dir.GetFiles()); if (dir.GetDirectories().Count() > 0) { DirectoryInfo[] fod = dir.GetDirectories(); foreach(DirectoryInfo dire in fod) { filelist.AddRange(GetAllFiles(dire)); } } return filelist; }