具体思路和上一篇的思路一样,只不过对于不同类型的文件,读取的方法和生成相应文件类型的方法不一样而已,至于生成word文档还有点小问题,每次生成打开之后都需要选择编码格式?如果哪位大神指导,还请告知一下,谢谢!
<span style="font-size:18px;">package com;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.xmlbeans.XmlException;
/**
*
* @author FishRoad
* @date 2015年8月17日 下午3:04:08
*
*/
public class Test01 {
public static String tpReplaceWord(String str) {
// 生成Pattern对象并且编译一个简单的正则表达式"Java"
Pattern p = Pattern.compile("Java");
// 用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher(str);
StringBuffer sb = new StringBuffer();
int i = 0;
// 使用find()方法查找第一个匹配的对象
boolean result = m.find();
// 使用循环将句子里所有的Java找出并替换再将内容加到sb里
while (result) {
i++;
m.appendReplacement(sb, " 呵呵 ");
// System.out.println("第" + i + "次匹配后sb的内容是:" + sb);
// 继续查找下一个匹配对象
result = m.find();
}
// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("调用m.appendTail(sb)后sb的最终内容是:\r" + sb.toString());
return sb.toString();
}
public static void main(String argv[]) {
try {
importWordFile();
} catch (FileNotFoundException e) {
System.out.println("文件没有找到!");
}
}
public static void importWordFile() throws FileNotFoundException {
// String path = "F:\\FishRoad.doc";
// 获取文件的位置
String path = UtilTools.getDirPath();
// 文件输入流
InputStream is = new FileInputStream(new File(path));
// .doc文件格式输出文本内容
WordExtractor ex = null;
// .docx文件格式输出文本内容
POIXMLTextExtractor extractor = null;
OPCPackage opcPackage = null;
// 用来存放最后读取到的文本内容
String str = "";
try {
// 截取文件的类型
String type = path.substring(path.indexOf(".") + 1, path.length());
System.out.println(type);
// 如果该文件是2003即:.doc类型的则直接使用WordExtractor
if (type.equals("doc")) {
ex = new WordExtractor(is);
// 获取文本信息
str = ex.getText();
}
// 如果该文件是2007即:.docx类型的则直接使用XWPFWordExtractor
else if (type.equals("docx")) {
// word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后
opcPackage = POIXMLDocument.openPackage(path);
try {
extractor = new XWPFWordExtractor(opcPackage);
str = extractor.getText();
} catch (XmlException e) {
System.out.println("获取docx文件信息异常");
} catch (OpenXML4JException e) {
System.out.println("获取docx文件信息异常");
}
} else {
System.out.println("输入的格式不正确");
// 如果格式不对,则直接结束程序
return;
}
System.out.println(str);
// 调用替换单词城西
String outStr = tpReplaceWord(str);
String destFile = "F:/NNN.doc";
/**
* 方法一:直接利用输出流来输出替换后的文本信息,并命名为FishRoadChange.doc,但是这个方法有点问题,
* 每次打开生成的文件会提示选择编码格式,其实这个是输出的是文本格式,但文件命名为doc格式而已
*/
/*FileOutputStream out = new FileOutputStream("F:/FishRoadChange.doc");
OutputStreamWriter write = new OutputStreamWriter(out, "GBK");//输出流采用GBK编码
write.write(outStr);
write.flush();
write.close();*/
/**
* 方法二:调用poi生成word文档,但是这个生成的文档还是一样,打开的时候还是要选择编码格式
*/
exportWord(destFile, outStr);
System.out.println("输出完毕!");
} catch (IOException e) {
}
}
/**
* 调用poi,直接生成word文档
* @param destFile
* @param fileContent
* @return
*/
public static int exportWord(String destFile, String fileContent) {
try {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
fileContent.getBytes("GBK"));
POIFSFileSystem fileSystem = new POIFSFileSystem();
DirectoryEntry directory = fileSystem.getRoot();
directory.createDocument("WordDocument", byteArrayInputStream);
FileOutputStream fileOutputStream = new FileOutputStream(destFile);
fileSystem.writeFilesystem(fileOutputStream);
byteArrayInputStream.close();
fileOutputStream.close();
return 1;
} catch (IOException e) {
System.out.println("生成文档失败!");
return 0;
}
}
}</span>