替换文件中的相关单词(二)之文件类型为doc或者docx

具体思路和上一篇的思路一样,只不过对于不同类型的文件,读取的方法和生成相应文件类型的方法不一样而已,至于生成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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值