精华内容
下载资源
问答
  • Word中读取内容&将word转换txt

    千次阅读 2016-12-01 21:41:22
    1、将Word转化txt# -*- coding=utf-8 -*- import sys import os from win32com import client word=client.Dispatch('Word.Application') word.Visible=0 ## #目前来看,window 默认编码都是GBK 要如果要读取中文的...

    1、将Word转化成txt

    # -*- coding=utf-8 -*-
    import sys
    import os
    from win32com import client
    word=client.Dispatch('Word.Application')
    word.Visible=0
    ##
    #目前来看,window 默认编码都是GBK 要如果要读取中文的文件信息,要decode
    '''
    代码功能:将word转换成txt
    也可以直接读取word
    Docs.py
    http://new.galalaly.me/2011/09/use-python-to-parse-microsoft-word-documents-using-pywin32-library/
    https://msdn.microsoft.com/EN-US/library/office/ff837519.aspx
    '''
    
    ###
    baseDir = "F:\\work\\".decode("utf-8")
    # print baseDir,type(baseDir)
    dirList = []
    baseDir2 = []
    if os.path.exists(baseDir):
        dirList = os.listdir(baseDir)
    else:
        print "not exist"
    fileCount=1
    for name in dirList:
        baseDir2=baseDir+name
        dirList2=os.listdir(baseDir2)
        print name
        os.chdir(baseDir2.encode("GBK"))
        for dir2 in dirList2:
            print os.path.abspath(dir2)
            filepath=os.path.abspath(dir2)
            doc = word.documents.Open(filepath)
            doc.SaveAs('E:\\pythonP\\docs\\'+str(fileCount)+'.txt', 2)
            doc.Close()
            fileCount+=1
    word.Quit()
    print 'over'

    2、直接从Word中读取数据(.doc),从docx中读取数据可参考Python-docx

    # -*- coding=utf-8 -*-
    import win32com.client as win32
    word = win32.gencache.EnsureDispatch('Word.Application')
    word.Visible = False
    '''
        Opens the specified document and adds it to the Documents collection. Returns a Document object.
    '''
    cont = word.Documents.Open('E:\pythonP\\test.doc')
    '''
    一种方式:
    '''
    # for aword in cont.Content.Words:
    #     print type(aword.Text)
    #
    '''
    另一种方式
    '''
    for paragraph in cont.Paragraphs:
        print paragraph.Range.Text
    
    word.Quit(-1)
    展开全文
  • 一款替代word2tex的把word文档转换LaTeX文本的转换工具,与office 2010, 2013等完美兼容, 该资源是32位安装版,系统是64的可下载64
  • 利用POI将word转换html实现在线阅读

    万次阅读 热门讨论 2013-12-26 16:05:18
    利用POI将word转换html实现在线阅读

    利用POI将word转换成html实现在线阅读

    一、分析

    通过网上找资料,发现用java实现word在线阅读有以下的实现方式:

    1

    Word=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览

    2

    Word=>PDF(MSOffice+JACOB)=>SWF(pdf2swf)=>FlexPaper浏览

    3

    Word =>SWF (FlashPaper)=> FlexPaper浏览

    4

    Word=>SWF(print2flash)=> FlexPaper浏览

    5

    用第三方收费组件:PageOffice

    6

    1) 利用 POI Word2003转换成 html

    2) 利用OpenOffice+JodConverterword2003转换成html

      前4种方式,目标都是一致的,就是都将word文档转换成flash文件,只是中间的实现不大一样。前两种方式比较麻烦,都是先转成PDF,再转成SWF,最后用FlexPaper浏览。两种比较快捷,可直接将源文件转为SWF,用FlexPaper浏览。第二种方式用到的jacob是微软的组件,在linux平台下基本是无望的了,第一个淘汰。由于FlashPaper不是开源工具,加之Win8系统不兼容(我现在用的系统),所以就没采用第三种实现方式。Print2flash是开源工具,即使公司产品中用到也不会出现版权纠纷,遗憾的是没找到如何用程序控制该工具转换文件的命令。所以第3,4种方式也淘汰了。通过下载,预使用,发现第5种方式用PageOffice是最省时省力的,也能将word文档完美的展现,但是,要钱!!好吧,一提到钱,此种实现只能暂作废。

    后面一开始是想用OpenOffice+JodConverter实现转swf的,后面在逛百度文库的时候,发现一个让我很好奇的东西。就是,百度文库里的文档基本上都用html进行展示了,也就是说,我们上传的word文档,百度对其做了html转换的处理,与页面的嵌合也相当的好。这让我想到,我们的项目中是否也可以用此方式实现word的在线预览呢。

            基于这个想法,我到谷歌找相关的资料,发现将word转html的开源工具没几个。其中,介绍得比较多的就是用POI进行转换,但是,由于POI对word的处理功能相当的弱,因此,开启了使用POI将wordàhtml的艰苦历程(后面发现网上有介绍用OpenOffice+JodConverter将word2003转换成html的方式,但是,我没有深究,有兴趣的同学可以去观望一下http://www.cnblogs.com/codeplus/archive/2011/10/22/2220952.html):

    二、实现

    1.      POI介绍:

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。

    Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。

    基本结构:

    HSSF -提供读写Microsoft Excel XLS格式档案的功能。

    XSSF -提供读写Microsoft Excel OOXML XLSX格式档案的功能。

    HWPF -提供读写Microsoft Word DOC格式档案的功能。

    HSLF -提供读写Microsoft PowerPoint格式档案的功能。

    HDGF -提供读Microsoft Visio格式档案的功能。

    HPBF -提供读Microsoft Publisher格式档案的功能。

    HSMF -提供读Microsoft Outlook格式档案的功能。

    其实,POI比较拿手的是处理Excel表格,即上面的HSSF及XSSF,我们的很多项目,只要涉及报表的,基本上都有用到它吧。用对于HWPF即处理DOC的包,功能就没有那么健全了,且API也不完善。

    2.      poi相关包及依赖包配置。

    3.      处理流程图:

    1)   主体流程:

     

    2)   进行word文档解释转换子流程


    3)   处理表格子流程(略)

    4)   处理图片子流程(略)

    4.      代码实现

    package com;
    
    import java.awt.image.BufferedImage;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    
    import javax.imageio.ImageIO;
    
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.model.PicturesTable;
    import org.apache.poi.hwpf.usermodel.CharacterRun;
    import org.apache.poi.hwpf.usermodel.Paragraph;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.Range;
    import org.apache.poi.hwpf.usermodel.Table;
    import org.apache.poi.hwpf.usermodel.TableCell;
    import org.apache.poi.hwpf.usermodel.TableIterator;
    import org.apache.poi.hwpf.usermodel.TableRow;
    import org.apache.xmlbeans.impl.piccolo.io.FileFormatException;
    
    
    /**
     * @Description: 利用poi将word简单的转换成html文件
     * @author 柯颖波
     * @date 2013-12-20 上午09:32:44
     * @version v1.0
     */
    public class Word2Html {
    	/**
    	 * 回车符ASCII码
    	 */
    	private static final short ENTER_ASCII = 13;
    
    	/**
    	 * 空格符ASCII码
    	 */
    	private static final short SPACE_ASCII = 32;
    
    	/**
    	 * 水平制表符ASCII码
    	 */
    	private static final short TABULATION_ASCII = 9;
    
    	private static String htmlText = "";
    	private static String htmlTextTbl = "";
    	private static int counter = 0;
    	private static int beginPosi = 0;
    	private static int endPosi = 0;
    	private static int beginArray[];
    	private static int endArray[];
    	private static String htmlTextArray[];
    	private static boolean tblExist = false;
    
    	/**
    	 * 项目路径
    	 */
    	private static String projectRealPath = "";
    	/**
    	 * 临时文件路径
    	 */
    	private static String tempPath = "/upfile/" + File.separator + "transferFile" + File.separator;
    	/**
    	 * word文档名称
    	 */
    	private static String wordName = "";
    
    	public static void main(String argv[]) {
    		try {
    			wordToHtml("F:\\SVN\\BobUtil\\web\\", "2012年高考广东数学(文)试卷解析(精析word版)(学生版).doc");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 读取每个文字样式
    	 * 
    	 * @param fileName
    	 * @throws Exception
    	 */
    
    	private static void getWordAndStyle(String fileName) throws Exception {
    		FileInputStream in = new FileInputStream(new File(fileName));
    		HWPFDocument doc = new HWPFDocument(in);
    
    		Range rangetbl = doc.getRange();// 得到文档的读取范围
    		TableIterator it = new TableIterator(rangetbl);
    
    		int num = 100;
    
    		beginArray = new int[num];
    		endArray = new int[num];
    		htmlTextArray = new String[num];
    		tblExist = false;
    
    		// 取得文档中字符的总数
    		int length = doc.characterLength();
    		// 创建图片容器
    		PicturesTable pTable = doc.getPicturesTable();
    		// 创建段落容器
    
    		htmlText = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>"
    				+ doc.getSummaryInformation().getTitle()
    				+ "</title></head><body><div style='margin:60px;text-align:center;'><div style='width:620px;text-align:left;line-height:24px;'>";
    		// 创建临时字符串,好加以判断一串字符是否存在相同格式
    
    		if (it.hasNext()) {
    			readTable(it, rangetbl);
    		}
    
    		int cur = 0;
    		String tempString = "";
    		for (int i = 0; i < length - 1; i++) {
    			// 整篇文章的字符通过一个个字符的来判断,range为得到文档的范围
    			Range range = new Range(i, i + 1, doc);
    			CharacterRun cr = range.getCharacterRun(0);
    			// beginArray=new int[num];
    			// endArray=new int[num];
    			// htmlTextArray=new String[num];
    			if (tblExist) {
    				if (i == beginArray[cur]) {
    					htmlText += tempString + htmlTextArray[cur];
    					tempString = "";
    					i = endArray[cur] - 1;
    					cur++;
    					continue;
    				}
    			}
    			if (pTable.hasPicture(cr)) {
    				htmlText += tempString;
    				// 读写图片
    				try {
    					readPicture(pTable, cr);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				tempString = "";
    			} else {
    
    				Range range2 = new Range(i + 1, i + 2, doc);
    				// 第二个字符
    				CharacterRun cr2 = range2.getCharacterRun(0);
    				char c = cr.text().charAt(0);
    				// System.out.println(c);
    				// /System.out.println(i+"::"+range.getEndOffset()+"::"+range.getStartOffset()+"::"+c);
    
    				// 判断是否为回车符
    				if (c == ENTER_ASCII) {
    					tempString += "<br/>";
    				}
    				// 判断是否为空格符
    				else if (c == SPACE_ASCII)
    					tempString += " ";
    				// 判断是否为水平制表符
    				else if (c == TABULATION_ASCII)
    					tempString += "    ";
    				// 比较前后2个字符是否具有相同的格式
    				boolean flag = compareCharStyle(cr, cr2);
    				if (flag)
    					tempString += cr.text();
    				else {
    					String fontStyle = "<span style=\"font-family:" + cr.getFontName() + ";font-size:"
    							+ cr.getFontSize() / 2 + "pt;";
    
    					if (cr.isBold())
    						fontStyle += "font-weight:bold;";
    					if (cr.isItalic())
    						fontStyle += "font-style:italic;";
    					if (cr.isStrikeThrough())
    						fontStyle += "text-decoration:line-through;";
    
    					int fontcolor = cr.getIco24();
    					int[] rgb = new int[3];
    					if (fontcolor != -1) {
    						rgb[0] = (fontcolor >> 0) & 0xff; // red;
    						rgb[1] = (fontcolor >> 8) & 0xff; // green
    						rgb[2] = (fontcolor >> 16) & 0xff; // blue
    					}
    					fontStyle += "color: rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ");";
    					htmlText += fontStyle + "\">" + tempString + cr.text() + "</span>";
    					tempString = "";
    				}
    			}
    		}
    
    		htmlText += tempString + "</div></div></body></html>";
    		// System.out.println(htmlText);
    	}
    
    	/**
    	 * 读写文档中的表格
    	 * 
    	 * @param pTable
    	 * @param cr
    	 * @throws Exception
    	 */
    	private static void readTable(TableIterator it, Range rangetbl) throws Exception {
    
    		htmlTextTbl = "";
    		// 迭代文档中的表格
    
    		counter = -1;
    		while (it.hasNext()) {
    			tblExist = true;
    			htmlTextTbl = "";
    			Table tb = (Table) it.next();
    			beginPosi = tb.getStartOffset();
    			endPosi = tb.getEndOffset();
    
    			// System.out.println("............"+beginPosi+"...."+endPosi);
    			counter = counter + 1;
    			// 迭代行,默认从0开始
    			beginArray[counter] = beginPosi;
    			endArray[counter] = endPosi;
    
    			htmlTextTbl += "<table border='1' cellpadding='0' cellspacing='0' >";
    			for (int i = 0; i < tb.numRows(); i++) {
    				TableRow tr = tb.getRow(i);
    
    				htmlTextTbl += "<tr align='center'>";
    				// 迭代列,默认从0开始
    				for (int j = 0; j < tr.numCells(); j++) {
    					TableCell td = tr.getCell(j);// 取得单元格
    					int cellWidth = td.getWidth();
    
    					// 取得单元格的内容
    					for (int k = 0; k < td.numParagraphs(); k++) {
    						Paragraph para = td.getParagraph(k);
    						CharacterRun crTemp = para.getCharacterRun(0);
    						String fontStyle = "<span style=\"font-family:" + crTemp.getFontName() + ";font-size:"
    								+ crTemp.getFontSize() / 2 + "pt;color:" + crTemp.getColor() + ";";
    
    						if (crTemp.isBold())
    							fontStyle += "font-weight:bold;";
    						if (crTemp.isItalic())
    							fontStyle += "font-style:italic;";
    
    						String s = fontStyle + "\">" + para.text().toString().trim() + "</span>";
    						if (s == "") {
    							s = " ";
    						}
    						// System.out.println(s);
    						htmlTextTbl += "<td width=" + cellWidth + ">" + s + "</td>";
    						// System.out.println(i + ":" + j + ":" + cellWidth + ":" + s);
    					} // end for
    				} // end for
    			} // end for
    			htmlTextTbl += "</table>";
    			htmlTextArray[counter] = htmlTextTbl;
    
    		} // end while
    	}
    
    	/**
    	 * 读写文档中的图片
    	 * 
    	 * @param pTable
    	 * @param cr
    	 * @throws Exception
    	 */
    	private static void readPicture(PicturesTable pTable, CharacterRun cr) throws Exception {
    		// 提取图片
    		Picture pic = pTable.extractPicture(cr, false);
    		BufferedImage image = null;// 图片对象
    		// 获取图片样式
    		int picHeight = pic.getHeight() * pic.getAspectRatioY() / 100;
    		int picWidth = pic.getAspectRatioX() * pic.getWidth() / 100;
    		if (picWidth > 500) {
    			picHeight = 500 * picHeight / picWidth;
    			picWidth = 500;
    		}
    		String style = " style='height:" + picHeight + "px;width:" + picWidth + "px'";
    
    		// 返回POI建议的图片文件名
    		String afileName = pic.suggestFullFileName();
    		//单元测试路径
    		String directory = "images/" + wordName + "/";
    		//项目路径
    		//String directory = tempPath + "images/" + wordName + "/";
    		makeDir(projectRealPath, directory);// 创建文件夹
    
    		int picSize = cr.getFontSize();
    		int myHeight = 0;
    
    		if (afileName.indexOf(".wmf") > 0) {
    			OutputStream out = new FileOutputStream(new File(projectRealPath + directory + afileName));
    			out.write(pic.getContent());
    			out.close();
    			afileName = Wmf2Png.convert(projectRealPath + directory + afileName);
    
    			File file = new File(projectRealPath + directory + afileName);
    
    			try {
    				image = ImageIO.read(file);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    
    			int pheight = image.getHeight();
    			int pwidth = image.getWidth();
    			if (pwidth > 500) {
    				htmlText += "<img style='width:" + pwidth + "px;height:" + myHeight + "px'" + " src=\"" + directory
    						+ afileName + "\"/>";
    			} else {
    				myHeight = (int) (pheight / (pwidth / (picSize * 1.0)) * 1.5);
    				htmlText += "<img style='vertical-align:middle;width:" + picSize * 1.5 + "px;height:" + myHeight
    						+ "px'" + " src=\"" + directory + afileName + "\"/>";
    			}
    
    		} else {
    			OutputStream out = new FileOutputStream(new File(projectRealPath + directory + afileName));
    			// pic.writeImageContent(out);
    			out.write(pic.getContent());
    			out.close();
    			// 处理jpg或其他(即除png外)
    			if (afileName.indexOf(".png") == -1) {
    				try {
    					File file = new File(projectRealPath + directory + afileName);
    					image = ImageIO.read(file);
    					picHeight = image.getHeight();
    					picWidth = image.getWidth();
    					if (picWidth > 500) {
    						picHeight = 500 * picHeight / picWidth;
    						picWidth = 500;
    					}
    					style = " style='height:" + picHeight + "px;width:" + picWidth + "px'";
    				} catch (Exception e) {
    					// e.printStackTrace();
    				}
    			}
    			htmlText += "<img " + style + " src=\"" + directory + afileName + "\"/>";
    		}
    		if (pic.getWidth() > 450) {
    			htmlText += "<br/>";
    		}
    	}
    
    	private static boolean compareCharStyle(CharacterRun cr1, CharacterRun cr2) {
    		boolean flag = false;
    		if (cr1.isBold() == cr2.isBold() && cr1.isItalic() == cr2.isItalic()
    				&& cr1.getFontName().equals(cr2.getFontName()) && cr1.getFontSize() == cr2.getFontSize()) {
    			flag = true;
    		}
    		return flag;
    	}
    
    	/**
    	 * 写文件(成功返回true,失败则返回false)
    	 * 
    	 * @param s
    	 *            要写入的内容
    	 * @param filePath
    	 *            文件
    	 */
    	private static boolean writeFile(String s, String filePath) {
    		FileOutputStream fos = null;
    		BufferedWriter bw = null;
    		s = s.replaceAll("EMBED", "").replaceAll("Equation.DSMT4", "");
    		try {
    			makeDir(projectRealPath, tempPath);// 创建文件夹
    			File file = new File(filePath);
    			if (file.exists()) {
    				return false;
    			}
    			fos = new FileOutputStream(file);
    			bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
    			bw.write(s);
    			// System.out.println(filePath + "文件写入成功!");
    		} catch (FileNotFoundException fnfe) {
    			fnfe.printStackTrace();
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		} finally {
    			try {
    				if (bw != null)
    					bw.close();
    				if (fos != null)
    					fos.close();
    			} catch (IOException ie) {
    				ie.printStackTrace();
    			}
    		}
    		return true;
    	}
    
    	/**
    	 * 根据路径名生成多级路径
    	 * 
    	 * @param url
    	 *            参数要以"\classes\cn\qtone\"或者"/classes/cn/qtone/"
    	 */
    	private static String makeDir(String root, String url) {
    		String[] sub;
    		url = url.replaceAll("\\/", "\\\\");
    		if (url.indexOf("\\") > -1) {
    			sub = url.split("\\\\");
    		} else {
    			return "-1";
    		}
    
    		File dir = null;
    		try {
    			dir = new File(root);
    			for (int i = 0; i < sub.length; i++) {
    				if (!dir.exists() && !sub[i].equals("")) {
    					dir.mkdir();
    				}
    				File dir2 = new File(dir + File.separator + sub[i]);
    				if (!dir2.exists()) {
    					dir2.mkdir();
    				}
    				dir = dir2;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			return "-1";
    		}
    		return dir.toString();
    	}
    
    	/**
    	 * 将word文档转化,返回转化后的文件路径
    	 * 
    	 * @param projectPath
    	 *            项目路径
    	 * @param relativeFilePath
    	 *            文件相对路径
    	 * @return 返回生成的htm路径(如果出错,则返回null)
    	 */
    	public static String wordToHtml(String projectPath, String relativeFilePath) {
    		String resultPath = null;
    		projectRealPath = projectPath;// 项目路径
    		String filePath = "";
    		// System.out.println(projectRealPath + tempPath);
    		// System.out.println(makeDir(projectRealPath, tempPath));
    		try {
    			File file = new File(projectPath + relativeFilePath);
    			if (file.exists()) {
    				if (file.getName().indexOf(".doc") == -1 || file.getName().indexOf(".docx") > 0) {
    					throw new FileFormatException("请确认文件格式为doc!");
    				} else {
    					wordName = file.getName();
    					wordName = wordName.substring(0, wordName.indexOf("."));
    
    					filePath = projectRealPath + tempPath + wordName + ".htm";
    					synchronized (relativeFilePath) {// 处理线程同步问题
    						File ff = new File(filePath);
    						if (!ff.exists()) {// 如果不存在则进行转换
    							getWordAndStyle(projectPath + relativeFilePath);
    							writeFile(htmlText, filePath);
    						}
    					}
    					resultPath = tempPath + wordName + ".htm";
    				}
    			} else {
    				throw new FileNotFoundException("没找到相关文件!");
    			}
    		} catch (NullPointerException e) {
    			e.printStackTrace();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return resultPath;
    	}
    }
    

    package com;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Scanner;
    import java.util.zip.GZIPOutputStream;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import net.arnx.wmf2svg.gdi.svg.SvgGdi;
    import net.arnx.wmf2svg.gdi.wmf.WmfParser;
    
    import org.apache.batik.transcoder.TranscoderInput;
    import org.apache.batik.transcoder.TranscoderOutput;
    import org.apache.batik.transcoder.TranscodingHints;
    import org.apache.batik.transcoder.image.PNGTranscoder;
    import org.apache.batik.transcoder.wmf.tosvg.WMFTranscoder;
    import org.apache.commons.lang.StringUtils;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    public class Wmf2Png {
    	public static void main(String[] args) throws Exception {
    		// convert("F:\\SVN\\BobUtil\\web\\25177.wmf");
    		// System.out.println((20 / (21 * 1.0)));
    		// svgToPng("F:\\SVN\\BobUtil\\web\\25177.svg", "F:\\SVN\\BobUtil\\web\\25177.png");
    	}
    
    	/**
    	 * @Description: 进行转换
    	 * @param filePath
    	 *            文件路径
    	 * @return 设定文件
    	 */
    	public static String convert(String filePath) {
    		String pngFile = "";
    		File wmfFile = new File(filePath);
    		try {
    			if (!wmfFile.getName().contains(".wmf")) {
    				throw new Exception("请确认输入的文件类型是wmf");
    			}
    			// wmf -> svg
    			String svgFile = filePath.replace("wmf", "svg");
    			wmfToSvg(filePath, svgFile);
    			// 对svg做预出理
    			PreprocessSvgFile(svgFile);
    			// svg -> png
    			pngFile = filePath.replace("wmf", "png");
    			svgToPng(svgFile, pngFile);
    			// 删除 svg
    			File file = new File(svgFile);
    			if (file.exists()) {
    				file.delete();
    			}
    			// 删除 wmf
    			if (wmfFile.exists()) {
    				wmfFile.delete();
    			}
    
    		} catch (Exception e) {
    			try {
    				e.printStackTrace();
    				wmfToJpg(filePath);
    			} catch (Exception e1) {
    				e1.printStackTrace();
    			}
    		}
    		return wmfFile.getName().replace("wmf", "png");
    	}
    
    	/**
    	 * 将wmf转换为svg
    	 * 
    	 * @param src
    	 * @param dest
    	 */
    	public static void wmfToSvg(String src, String dest) throws Exception {
    		boolean compatible = false;
    		try {
    			InputStream in = new FileInputStream(src);
    			WmfParser parser = new WmfParser();
    			final SvgGdi gdi = new SvgGdi(compatible);
    			parser.parse(in, gdi);
    
    			Document doc = gdi.getDocument();
    			OutputStream out = new FileOutputStream(dest);
    			if (dest.endsWith(".svgz")) {
    				out = new GZIPOutputStream(out);
    			}
    
    			output(doc, out);
    		} catch (Exception e) {
    			throw e;
    		}
    	}
    
    	/**
    	 * @Description: 输出svg文件
    	 * @param doc
    	 * @param out
    	 * @throws Exception
    	 *             设定文件
    	 */
    	private static void output(Document doc, OutputStream out) throws Exception {
    		TransformerFactory factory = TransformerFactory.newInstance();
    		Transformer transformer = factory.newTransformer();
    		transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    		transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//W3C//DTD SVG 1.0//EN");
    		transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
    				"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd");
    		transformer.transform(new DOMSource(doc), new StreamResult(out));
    		out.flush();
    		out.close();
    		out = null;
    	}
    
    	/**
    	 * @Description:对svg文件做预处理(这里主要是调整大小,先缩小10倍,如果还大于默认值,则按比例缩小)
    	 * @param svgFile
    	 * @throws Exception
    	 *             设定文件
    	 */
    	private static void PreprocessSvgFile(String svgFile) throws Exception {
    		int defaultWeight = 500;// 默认宽度
    		FileInputStream inputs = new FileInputStream(svgFile);
    		Scanner sc = new Scanner(inputs, "UTF-8");
    		ByteArrayOutputStream os = new ByteArrayOutputStream();
    		while (sc.hasNextLine()) {
    			String ln = sc.nextLine();
    			if (!ln.startsWith("<!DOCTYPE")) {
    				os.write((ln + "\r\n").getBytes());
    			}
    		}
    		os.flush();
    		
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder;
    		builder = factory.newDocumentBuilder();
    		Document doc = null;
    		try {
    			doc = builder.parse(new ByteArrayInputStream(os.toByteArray()));
    		} catch (Exception e) {
    			inputs = new FileInputStream(svgFile);
    			os = new ByteArrayOutputStream();
    			int noOfByteRead = 0;
    			while ((noOfByteRead = inputs.read()) != -1) {
    				os.write(noOfByteRead);
    			}
    			os.flush();
    			doc = builder.parse(new ByteArrayInputStream(os.toByteArray()));
    		} finally {
    			os.close();
    			inputs.close();
    		}
    		
    		int height = Integer.parseInt(((Element) doc.getElementsByTagName("svg").item(0)).getAttribute("height"));
    		int width = Integer.parseInt(((Element) doc.getElementsByTagName("svg").item(0)).getAttribute("width"));
    		int newHeight = 0;// 新高
    		int newWidth = 0;// 新宽
    		newHeight = height / 10;// 高缩小10倍
    		newWidth = width / 10; // 宽缩小10倍
    		// 如果缩小10倍后宽度还比defaultHeight大,则进行调整
    		if (newWidth > defaultWeight) {
    			newWidth = defaultWeight;
    			newHeight = defaultWeight * height / width;
    		}
    
    		((Element) doc.getElementsByTagName("svg").item(0)).setAttribute("width", String.valueOf(newWidth));
    		((Element) doc.getElementsByTagName("svg").item(0)).setAttribute("height", String.valueOf(newHeight));
    		OutputStream out = new FileOutputStream(svgFile);
    		output(doc, out);
    	}
    
    	/**
    	 * 将svg图片转成png图片
    	 * 
    	 * @param filePath
    	 * @throws Exception
    	 */
    	public static void svgToPng(String svgPath, String pngFile) throws Exception {
    		File svg = new File(svgPath);
    		FileInputStream wmfStream = new FileInputStream(svg);
    		ByteArrayOutputStream imageOut = new ByteArrayOutputStream();
    		int noOfByteRead = 0;
    		while ((noOfByteRead = wmfStream.read()) != -1) {
    			imageOut.write(noOfByteRead);
    		}
    		imageOut.flush();
    		imageOut.close();
    		wmfStream.close();
    
    		ByteArrayOutputStream jpg = new ByteArrayOutputStream();
    		FileOutputStream jpgOut = new FileOutputStream(pngFile);
    
    		byte[] bytes = imageOut.toByteArray();
    		PNGTranscoder t = new PNGTranscoder();
    		TranscoderInput in = new TranscoderInput(new ByteArrayInputStream(bytes));
    		TranscoderOutput out = new TranscoderOutput(jpg);
    		t.transcode(in, out);
    		jpgOut.write(jpg.toByteArray());
    		jpgOut.flush();
    		jpgOut.close();
    		imageOut = null;
    		jpgOut = null;
    	}
    
    	/**
    	 * 将wmf图片转成png图片(备用方法,即当上面的转换失败时用这个)
    	 * 
    	 * @param filePath
    	 * @throws Exception
    	 */
    	public static String wmfToJpg(String wmfPath) throws Exception {
    		//先wmf-->svg
    		File wmf = new File(wmfPath);
    		FileInputStream wmfStream = new FileInputStream(wmf);
    		ByteArrayOutputStream imageOut = new ByteArrayOutputStream();
    		int noOfByteRead = 0;
    		while ((noOfByteRead = wmfStream.read()) != -1) {
    			imageOut.write(noOfByteRead);
    		}
    		imageOut.flush();
    		imageOut.close();
    		wmfStream.close();
    
    		// WMFHeaderProperties prop = new WMFHeaderProperties(wmf);
    		WMFTranscoder transcoder = new WMFTranscoder();
    		TranscodingHints hints = new TranscodingHints();
    		transcoder.setTranscodingHints(hints);
    		TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(imageOut.toByteArray()));
    		ByteArrayOutputStream svg = new ByteArrayOutputStream();
    		TranscoderOutput output = new TranscoderOutput(svg);
    		transcoder.transcode(input, output);
    		
    		//再svg-->png
    		ByteArrayOutputStream jpg = new ByteArrayOutputStream();
    		String jpgFile = StringUtils.replace(wmfPath, "wmf", "png");
    		FileOutputStream jpgOut = new FileOutputStream(jpgFile);
    
    		byte[] bytes = svg.toByteArray();
    		PNGTranscoder t = new PNGTranscoder();
    		TranscoderInput in = new TranscoderInput(new ByteArrayInputStream(bytes));
    		TranscoderOutput out = new TranscoderOutput(jpg);
    		t.transcode(in, out);
    		jpgOut.write(jpg.toByteArray());
    		jpgOut.flush();
    		jpgOut.close();
    		return jpgFile;
    	}
    }
    

    重点难点解释探讨:

    1)  读取表格部分:

    a)        找出表格的开始与结束标记;

    b)        遍历整个表格内容,逐个单元格的内容取出并追加到变量中。

    2)  读取图片部分

    a)        图片文件的格式问题。

    如果图片格式为png或者jpg,则可以直接进行处理并加入标签中,前台的html展示没有问题,但是,如果图片格式为wmf(详细看附录1),则html无法对基解释,那么我们只能对其进行转换格式:

    百度后,网上很多说法都建议用batik工具包进行格式转换,其实思路就是:wmfàsvgàpng。查阅相关资料(如附录2),发现其处理svg文件的能力相当的强,即从svg—>png这一步是比较完美的。但是,在处理wmf—>svg这一步却导致部分图像丢失,即失真的情况,且很严重。查看相关的api看是否参数设置问题,但是无论怎么设置,结果还是不尽人意。一度想放弃,找别的包。

    后来,无意中,在csdn中有网友建议先用wmf2svg工具类将wmf转换为svg,再用batiksvg转换为png。Very good!!有了这个思路,感觉已经看到署光了。

    类写出来后,进行类型转换测试,确实效果很好,完全没有失真。于是将其嵌入word—>html这个工具类中。再用各种包含了wmf图片的文档进行测试。生成的html文件,基本没有问题,当时那个开心啊!!(我去,程序员也就这德行)

    好景不长,放到正式项目进行测试过程中,发现有个别文档一进行转换,服务器就跨了,直接报内存溢出。通过排查检测,原来就是进行图片转换过程中,将内存给挤爆了。奇怪了,虽然知道图片处理是比较耗内存,但也没想到1G的内存,一下子就被挤爆(刚跑起来占去300M左右,一跑word转换功能,不过一会就报OutOfMemorry)。

    一度怀疑,是不是batik这个工具包是不是有bug,处理不了大的svg。还将问题放上了bakit的官网。后来,查看相关资料后,发现是wmf2svg工具生成的svg的高与宽都太大了,举个例子:15040* 13088,宽高都达到上万级别,结果得到的象素是上亿的,不爆内存才怪。

    用dom工具,将每一个生成的svg文件再进行预处理,即将其高与宽都先缩小一倍,如果宽度依然比500要大,则将其设成500,并将高也按比例缩小。经过此步骤生成的svg再用batik进行转换就没有任何问题了。

    到这里,差不多已经解决图片转换的问题了,但是,在使用过程中,发现wmf2svg这个工具也不是很稳定,偶尔会报异常,并且,我测试发现,报异常的这个wmf用之前batik直接进行wmf—>svgàpng的方案可以成功生成没有失真的png,于是,在wmf2svg的产生异常进行捕捉,并调用了wmfToJpg(String wmfPath)的备用方法。到此,大部分的wmf转换问题已经解决。

    b)        生成html文本的<img />标签的width与height问题。

    如果图片格式原本为png的话,直接用

    // 获取图片样式
     intpicHeight = pic.getHeight() * pic.getAspectRatioY() / 100;
      intpicWidth = pic.getAspectRatioX() * pic.getWidth() / 100;

    即可以将图片的宽与高设置与word文档一致;但是,发果wmf格式,要分两种情况分析:

    Ø  如果转换生成的png宽度不小于500,则将期作为一般图片处理:

    BufferedImage  image = ImageIO.read(file);
    int pheight = image.getHeight();
    int pwidth = image.getWidth();

    Ø  如果转换生成的png宽度小于500,则认为是一般的公式,则应该与它旁边的字体宽度相近,这里设成字体的1.5倍宽度,高度为:

    myHeight= (int) (pheight / (pwidth / (picSize * 1.0)) * 1.5);

    如果图片即非wmf与非png(如jpg)的情况下,上面获取高与宽的方法不起作用,不知道是不是POI的bug。只能按以下方式处理:

    BufferedImage  image = ImageIO.read(file);
    int pheight = image.getHeight();
    int pwidth = image.getWidth();

    即跟上面处理wmf的第一种方式一致。

    三、结束语

    讲到这,将word转换成html的处理也大体上讲完了。这几天的边学边用,特别是真正能解决问题的时候,非常有成就感。其实,上面的处理还存在以下的问题待解决的:

    1)读取表格部分:

    a)        表格中如果再含有表格,POI无法进行很好的区分,比如,有一个两行两列的表格中,第一行第一列中又包含了一个两行两列的表格,那POI会将此表格解释成:第一行为2+2*2 = 6个单元格;第二行为2个单元格,这样解释出来的表格就很怪异了。

    b)        表格中有果有合并单格的情况,程序暂未做此处理(后续看不能优化),表格也很怪异。

    c)        表格中如果有图像,程序没有做相应的处理。

    2)读取图片部分:

    a) 有部分wmf->png的方式有个别图片还是没有转换成功,会报异常,但没有影响整体的功能;

    b) word有部分公式生成的图片无法识别模式,不知道是不是POI无法将其解释,还是其他原因,就是有文档,生成没有后缀的图片文件,且这部分文件无法读取,用图片工具也打不开,暂时未找到很好的解决方案。

    3)读取word的目录:

    在读取目录会出现将格式化符号也解释出来。

    4)其他未知的一些问题,反正,就觉得用POI来解释word是件很坚苦的事情,如果全是文本还好,如果里面包含图片,表格,公式等这些对象的时候,POI就显得太弱了。


     

     

    附:

    1.       wmf文件:

    MicrosoftOffice 的剪贴画使用的就是这个格式。

    Wmf是WindowsMetafile 的缩写,简称图元文件,它是微软公司定义的一种Windows平台下的图形文件格式。

    wmf格式文件的特点如下:

    1)                 wmf格式文件是MicrosoftWindows操作平台所支持的一种图形格式文件,目前,其它操作系统尚不支持这种格式,如Unix、Linux等。

    2)                 与bmp格式不同,wmf格式文件是和设备无关的,即它的输出特性不依赖于具体的输出设备。

    3)                 其图象完全由Win32 API所拥有的GDI函数来完成。

    4)                 wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。

    5)                 在建立图元文件时,不能实现即画即得,而是将GDI调用记录在图元文件中,之后,在GDI环境中重新执行,才可显示图象。

    6)                 显示图元文件的速度要比显示其它格式的图象文件慢,但是它形成图元文件的速度要远大于其它格式。

    2.      Batik介绍

    Batik是使用svg格式图片来实现各种功能的应用程序以及Applet提供的一个基于java的工具包。

    通过Batik,你可以在JAVA可以使用的地方操作SVG文档,您还可以在你的应用程序使用Batik模块来生成, 处理和转码SVG图像。Batik很容易让基于Java的应用程序或小程序来处理SVG内容。 例如,使用Batik的SVG的发生器模块 ,Java应用程序或小程序可以很轻松地导出SVG格式的图形到。用Batik的SVG的查看组件,应用程序或小程序可以很容易地集成SVG的浏览和交互功能。另一种可能性是使用Batik的模块转换成各种格式SVG的通过,如光栅图像(JPEG,PNG或TIFF格式)或其它矢量格式(EPS或PDF格式,后两者由于转码器由Apache FOP提供)。 Batik工程创建的目的是为开发者提供一系列可以结合或单独使用来支持特殊的svg解决方案的核心模块。模块主要有SVGParser,SVGGernerator,SVGDOM。Batik工程的其他目的是使它具有高度的扩展性。

    (SVG的规范:可缩放矢量图形(SVG),是一个W3C的推荐标准。 它定义了丰富的2D图形的XML语法,其中包括诸如透明度功能,几何形状,滤镜效果(阴影,灯光效果等),脚本和动画)

    3.本实例相关的项目文件:点击打开链接

    展开全文
  • 主要为大家详细介绍了python实现pdf转换成word和txt纯文本文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Word查找栏代码·通配符一览表 Word替换栏代码·通配符一览表 Word通配符用法详解 1、任意单个字符: 2、任意多个字符: 3、指定字符之一: 4、指定范围内的任意单个字符: 5、排除指定范、排除指定范围内的...

    目录

    Word查找栏代码·通配符一览表

    Word替换栏代码·通配符一览表

    Word通配符用法详解

    1、任意单个字符:

    2、任意多个字符:

    3、指定字符之一:

    4、指定范围内的任意单个字符:

    5、排除指定范、排除指定范围内的任意单个字符:

    6、指定前一字符的个数:

    7、指定前一字符、指定前一字符数范围:

      8、一个以上的前一字符:

    9、指定起始字符串:

    10、指定结尾字符串:

    11、表达式查找:

    使用通配符搜索

    使用代码搜索

    可以在“查找内容”或“替换为”框中使用的代码

    只能在“查找内容”框中使用的代码(选中“使用通配符”复选框时)

    只能在“查找内容”框中使用的代码(清除“使用通配符”复选框时)

    只能在“替换为”框中使用的代码


     Word查找栏代码·通配符一览表

    序号

    清除使用通配符复选框

    勾选使用通配符复选框

    特殊字符

    代码

    特殊字符

    代码or通配符

    1

    任意单个字符

    ^?

    任意单个字符

    ?

    2

    任意数字

    ^#

    任意数字(单个)

    [0-9]

    3

    任意英文字母

    ^$

    任意英文字母

    [a-zA-Z]

    4

    段落标记

    ^p

    段落标记

    ^13

    5

    手动换行符

    ^l

    手动换行符

    ^l or ^11

    6

    图形

    ^g or ^1

    图形

    ^g

    7

    1/4长划线

    ^+

    1/4长划线

    ^q

    8

    长划线

    ^j

    长划线

    ^+

    9

    短划线

    ^q

    短划线

    ^=

    10

    制表符

    ^t

    制表符

    ^t

    11

    脱字号

    ^

    脱字号

    ^^

    12

    分栏符

    ^v

    分栏符

    ^n or ^14

    13

    分节符

    ^b

    分节符/分页符

    ^m

    14

    省略号

    ^n

    省略号

    ^i

    15

    全角省略号

    ^i

    全角省略号

    ^j

    16

    无宽非分隔符

    ^z

    无宽非分隔符

    ^z

    17

    无宽可选分隔符

    ^x

    无宽可选分隔符

    ^x

    18

    不间断空格

    ^s

    不间断空格

    ^s

    19

    不间断连字符

    ^~

    不间断连字符

    ^~

    20

    ¶段落符号

    ^%

    表达式

    ( )

    21

    §分节符

    ^

    单词结尾

    <

    22

    脚注标记

    ^f or ^2

    单词开头

    >

    23

    可选连字符

    ^-

    任意字符串

    *

    24

    空白区域

    ^w

    指定范围任意单个字符

    [!x-z]

    25

    手动分页符

    ^m

    指定范围任意单个字符

    [ - ]

    26

    尾注标记

    ^e

    1个以上前一字符或表达式

    @

    27

    ^d

    n 个前一字符或表达式

    { n }

    28

    Unicode 字符

    ^Unnnn

    n个以上前一字符或表达式

    { n, }

    29

    全角空格

    ^u8195

    n 到 m 个前一字符或表达式

    { n,m }

    30

    半角空格

    ^32 or ^u8194

    所有小写英文字母

    [a-z]

    31

    批注

    ^a or ^5

    所有大写英文字母

    [A-Z]

    32

    百分数

    [0-9.]{1,}% 

    所有西文字符

    [^1-^127]

    33

     

     

    所有中文汉字和中文标点

    [!^1-^127]

    34

     

     

    所有中文汉字(CJK统一字符)

    [-] or [-]

    35

     

     

    所有中文标点

    [!-^1-^127]

    36

     

     

    所有非数字字符

    [!0-9]

    注:要查找已被定义为通配符的字符,该字符前键入反斜杠 \ 。查找?、*、(、)、[ ] 等的代码分别是\\*\(\)\[\]

     

    Word替换栏代码·通配符一览表

    序号

    清除使用通配符复选框

    勾选使用通配符复选框

    特殊字符

    代码

    特殊字符

    代码or通配符

    0

     

     

    要查找的表达式 \n

    \

    1

    段落标记↵

    ^p

    段落标记↵

    ^p

    2

    手动换行符↓

    ^l

    手动换行符↓

    ^l

    3

    查找的内容

    ^&

    查找的内容

    ^&

    4

    剪贴板内容

    ^c

    剪贴板内容

    ^c

    5

    省略号

    ^i

    省略号

    ^i

    6

    全角省略号

    ^j

    全角省略号

    ^j

    7

    制表符

    ^t

    制表符

    ^t

    8

    长划线

    ^+

    长划线

    ^+

    9

    1/4长划线( — )

    ^q

    1/4长划线( — )

    ^q

    10

    短划线( – )

    ^=

    短划线( – )

    ^=

    11

    脱字号

    ^^

    脱字号

    ^^

    12

    手动分页符

    ^m or ^12

    手动分页符/分节符

    ^m

    13

    可选连字符_

    ^-

    可选连字符_

    ^-

    14

    不间断连字符-

    ^~

    不间断连字符-

    ^~

    15

    不间断空格

    ^s

    不间断空格

    ^s

    16

    无宽非分隔符

    ^z

    无宽非分隔符

    ^z

    17

    无宽可选分隔符

    ^x

    无宽可选分隔符

    ^x

    18

    分栏符

    ^n

    分栏符

    ^n

    19

    §分节符

    ^%

    §分节符

    ^%

    20

    ¶段落符号

    ^v

    ¶段落符号

    ^v

     

    Word通配符用法详解

    1、任意单个字符:

    “?”可以代表任意单个字符,输入几个“?”就代表几个未知字符。如:
    输入“? 国”就可以找到诸如“中国”、“美国”、“英国”等字符;
    输入“???国”可以找到“孟加拉国”等字符。


    2、任意多个字符:

     “*”可以代表任意多个字符。如:
    输入“*国”就可以找到“中国”、“美国”、 “孟加拉国”等字符。


    3、指定字符之一:

     “[]”框内的字符可以是指定要查找的字符之一,如:
    输入“[中美]国”就可以找到“中国”、“美国”。 又如:
    输入“th[iu]g”,就可查找到“thigh”和“thug”。
    输入“[学硕博]士”,查找到的将会是学士、士、硕士、博士。
    输入“[大中小]学”可以查找到“大学”、“中学”或“小学”,但不查找“求学”、“开学”等。
    输入“[高矮]个”的话,Word查找工具就可以找到“高个”、“矮个”等内容。


    4、指定范围内的任意单个字符:

     “[x-x]”可以指定某一范围内的任意单个字符,如:
    输入“[a-e]ay”就可以找到“bay”、“day”等字符,要注意的是指定范围内的字符必须用升序。 用升序。如:
    输入“[a-c]mend”的话,Word查找工具就可以找到“amend”、“bmend”、“cmend”等字符内容。


    5、排除指定范、排除指定范围内的任意单个字符:

    “[!x-x]”可以用来排除指定范围内的任意单个字符,如:
    输入“[!c-f]”就可以找到“bay”、“gay”、“lay”等字符,但是不等字符,但是不会找到“cay”、“day”等字符。要注意范围必须用升序。
    又如:
    输入“[!a-c]”的话,word程序就可以找到“good”、“see”、“these”等目标字符,而所有包含字符a、b、c之类的内容都不会在查找结果中出现。
    又如:
    输入“m[!a]st”,用,用来查找“mist”和“most”不会查找“mast”。
    输入“[!a]n”,查到的将会是除an以外的所有可能组合如:合如:in、on 等。

     

    6、指定前一字符的个数:

    “{n}”可以用来指定要查找的字符中包含前一字符的个数,如:
    输入“cho{1} se”就是说包含1个前一字符“o”,可以找到“chose”,输入“cho{2}se”就是说包含2个前一字符“o”,可以找到, “choose”。
    又如:
    输入“lit{1}le”就是说包含1个前一字符“t”,可以找到“litle”。
    输入“lit{2}le”就是说包含2个前一字符“t”,可以找到“little”。
    输入“te{2}n”,表示查找“teen”而不会查找“ten”。
    输入“of{2}ice”,查找到的将会是office。


    7、指定前一字符、指定前一字符数范围:

    “{x,x}”可以用指定要查找字符中前一字符数范围,如:
    输入“cho{1,2}”,则说明包含前一字符“o”数目范围是1-2个,则可以找到“chose”、“choose”。

      
    8、一个以上的前一字符:

     “@”可以用来指定要查找字符中包含一个以上的前一字符,如:
    输入“cho@se”,就可以找到, “chose”、“choose”等字符。


    9、指定起始字符串:

    “<”可以用来指定要查找字符中的起始字符串,如:
    输入“<ag”,就说明要查找的字符的起始字符为“ag”,可以找到 “ago”、“agree”、“again”等字符。
    输入“<te”的话,可能查到“ten”、“tea”等。


    10、指定结尾字符串:

     

     “>”可以用来指定要查找字符中的结尾字符串,如:
    输入“er>”,就说明要查找的字符的结尾字符为“er”,可以找到 “ver”、“her”、“lover”等等。
    输入“en>”, 就说明要查找到以“en”结尾的所有目标对象,可能找到“ten”、“pen”、“men”
    输入“up>”,就说明要查找到以“up”结尾的所有目标对象,例如会找到“setup”、“cup”等等。


    11、表达式查找:

    ()”,尤其用于多个关键词的组合查找。
    键入“(America)(China)”,在“替换为”中键入“\2 \1”,Word找到“America China”并替换为“China America”。
    输入“<(江山)*(多娇)>”,就表示查找的是所有以“江山”开头并且 以“多娇”结尾的字符串。


    另外为了更精确的查找,你还可以把以上的通配符联合起来使用,如:
    输入“<(ag)*(er)>”则表示查找所有以“ag”开头并且以“er”结尾的单词,注意这时需要用括号将来区分开不同的查找规则。最后还要注意如果要查找已经被定义为通配符的字符,如“*”、“?”等字符,必须在该字符前面加上反斜杠“\”,如:输入“\*”则表示查找字符“*”。

     

    使用通配符搜索

    选中“使用通配符”复选框后,Word 只查找与指定文本精确匹配的文本(请注意,“区分大小写”和“全字匹配”复选框会变灰而不可用,表明这些选项已自动选中,您不能关闭这些选项)。

    要查找已被定义为通配符的字符,请在该字符前键入反斜扛 (\),例如,要查找问号,可键入“\?”。

    序号

    查找内容

    通配符

    示例

    1.

    任意单个字符

    ?

    例如,s?t可查找“sat”和“set”。

    2.

    任意字符串

    *

    例如,s*d可查找“sad”和“started”。

    3.

    单词的开头

    <

    例如,<(inter)查找“interesting”和“intercept”,但不查找“splintered”。

    4.

    单词的结尾

    >

    例如,(in)>查找“in”和“within”,但不查找“interesting”。

    5.

    指定字符之一

    []

    例如,w[io]n查找“win”和“won”。

    6.

    指定范围内任意单个字符

    [-]

    例如,[r-t]ight查找“right”和“sight”。必须用升序来表示该范围。

    7.

    中括号内指定字符范围以外的任意单个字符

    [!x-z]

    例如,t[!a-m]ck查找“tock”和“tuck”,但不查找“tack”和“tick”。

    8.

    n个重复的前一字符或表达式

    {n}

    例如,fe{2}d查找“feed”,但不查找“fed”。

    9.

    至少n个前一字符或表达式

    {n,}

    例如,fe{1,}d查找“fed”和“feed”。

    10.

    n到m个前一字符或表达式

    {n,m}

    例如,10{1,3}查找“10”、“100”和“1000”。

    11.

    一个以上的前一字符或表达式

    @

    例如,lo@t查找“lot”和“loot”。

     

    一些代码只有在选中或清除“使用通配符”选项时才能使用。

    使用代码搜索

    可以在“查找内容”或“替换为”框中使用的代码

    段落标记()

    键入^p(选中“使用通配符”复选框时在“查找内容”框中无效)或键入^13

    制表符()

    键入^t或键入^9

    ASCII字符

    键入^nnn,其中nnn是字符代码

    ANSIcharacter

    键入^0nnn,其中nnn是字符代码

    长划线(—)

    键入^+

    短划线(–)

    键入^=

    脱字号

    键入^^

    手动换行符()

    键入^l或键入^11

    分栏符

    键入^n或键入^14

    分页符或分节符

    键入^12(替换时,插入分页符)

    手动分页符

    键入^m(当选中“使用通配符”复选框时,还将查找或替换分节符)

    不间断空格()

    键入^s

    不间断连字符()

    键入^~

    可选连字符()

    键入^-

    只能在“查找内容”框中使用的代码(选中“使用通配符”复选框时)

    图片或图形(仅嵌入)

    键入^g

    只能在“查找内容”框中使用的代码(清除“使用通配符”复选框时)

    任意字符

    键入^?

    任意数字

    键入^#

    任意字

    键入^$

    Unicode字符

    键入^Unnnn,其中“nnnn”是字符代码

    图片或图形(仅嵌入)

    键入^1

    脚注标记

    键入^f或键入^2

    尾注标记

    键入^e

    键入^d

    正在打开域大括号(当域代码可见时)

    键入^19

    正在关闭域大括号(当域代码可见时)

    键入^21

    批注

    键入^a或键入^5

    分节符

    键入^b

    全角空格(Unicode)

    键入^u8195

    半角空格(Unicode)

    键入^u8194

    白色空格

    键入^w(可以是常规空格、不间断空格以及制表符的任意组合)

    只能在“替换为”框中使用的代码

    “Windows剪贴板”的内容

    键入^c

    “查找内容”框的内容

    键入^&

    选中“使用通配符”复选框后,Microsoft Word 不识别在“查找内容”框中输入的用于下列项目的代码:尾注和脚注标记、域、段落标记、分节符或空白区域。若要搜索这些项目,可以在“查找内容”框中键入下列替换代码。(注意,没有可用于域的替换代码)

    若要查找脚注或尾注标记

    键入“^2”

    注意,Word 无法区分脚注和尾注标记。

    若要查找段落标记

    键入“^13”

     

    若要查找分节符

    键入“^12”

    Word 将搜索手动分页符和分节符。

    查找空白区域

    键入“空格{1,}”

     

     

    展开全文
  • 回答: 使用Word编辑文档的时候,不仅可以保存成Word格式,也可以保存为其它格式。但有的时候需要将大批的已经编辑完成的Word文档转换文本格式或其他格式文档,怎么办?如果通过“另存为”将是一件十分费时费力的...

    回答: 使用Word编辑文档的时候,不仅可以保存成Word格式,也可以保存为其它格式。但有的时候需要将大批的已经编辑完成的Word文档转换成文本格式或其他格式文档,怎么办?如果通过“另存为”将是一件十分费时费力的事情。

    可能有人说了利用第三方工具软件吧,那是另一话题。在这里笔者要告诉大家的是:批量转换文档格式不求“人”,完全可以借助Word本身自带的功能就可以完成批量转换文档格式的工作。为了叙述方便,专家以将Word文档格式批量转换成TXT文本格式为例来介绍其转换过程,具体操作方法如下:

    一、准备工作

    首先,我们建立两个临时文件夹,一个命名为“待转换的Word文档”,即用来存放准备转换的Word文档;另一个可命名为“文本文档”,即用来存放转换完成的TXT格式文档。

    二、执行“转换向导”

    在“开始”菜单中选择“新建Office文档”,或选择“文件/新建”,这时会在屏幕右侧弹出“新建文档窗口”,此时需要单击编辑窗口右侧“新建文档”窗口中的“通用模板”。使用不同的Office版本所执行“转换向导”出现的界面可能稍有不同,但其中都有“转换向导”功能是一致的。

    三、在弹出的“新建”对话框中单击“其他文档”选项卡,选择“转换向导”。

    四、接下来在弹出的“转换向导”对话框中,单击“下一步”按钮。

    五、在接下来的对话框里给出了两种转换模式;

    1.将其他文件格式转换成Word文档格式;

    2.将Word文档格式转换成其它文件格式。

    六、在本文中由于我们是要将Word文档转换为TXT文本文档,故需选择第二种(从Word文档格式转换成其它文件格式)转换模式,再单击下拉箭头从下拉列表里选择“纯文本”,单击“下一步”按钮。

    七、在继续出现的对话框里,分别选择“源文件夹”(待转换的Word文档)和“目标文件夹”(文本文档),再单击“下一步”按钮。

    八、在新弹出的对话框中“可用文件”里列出了“待转换的Word文档”文件夹里所有的Word文档,单击旁边的“全选”(这里只能是全选或选择一个文档)按钮就可以将它们移到“转换文件”框里,最后单击“下一步”按钮。

    九、在弹出提示“向导已做好转换文件的准备”时,单击“完成”按钮后可以出现一个“文件转换过程”状态进度条,在其中可以看到转换的进程,分别显示总的文件数和已经转换的文件数。

    十、当全部文档转换完毕后,会弹出对话框询问是否需要进行其他转换。如果需要就点击“是”,如果不需要就点击“否”

    展开全文
  • 用Python批处理将WORD文件转换PDF格式一、问题分析key words:批处理、WORD转换PDF、办公自动化、材料准备、代码实现☆其他问题:日常遇到问题,整理笔记不易,欢迎交流~~~ 一、问题分析 key words:批处理、...
  • 简述 判断linux系统是32位还是64有很多方法,有人推荐使用getconf WORD_BIT和getconf LONG_BIT。...但是,32位的系统中int类型和long类型一般都是4字节,64的系统中int类型还是4字节的,但是long已变成了8字节
  • word快速将数字字体换成新罗马详细简单方法 前几天写材料,材料写好后发现对材料格式中有要求,要把材料中的所有的数字全部变成新罗马字体(Times New Roman),我当时很懵,因为材料中涉及数字的地方实在太多了,...
  • 使用python win32 库 调用word底层vba,将wordpdf 安装pywin32 pip install pypiwin32 Python完整代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/12/28 10:48 # @Author : King...
  • 在写脚本(如:lnmp)时,经常需要判断linux操作系统是64bit还是32bit,如果是64bit执行这个命令(ln -s/usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.la),如果是32bit则执行另一个命令(ln-s /usr/local/lib/...
  • 将excel文件中的内容转换成word文本(去表格) 导语:因为最近的工作需要将excel表格中的一部分内容去掉表格框转换成word文本放到另一个word文档,所以操作就是需要去表格转换成word文本。因此我本人在上网搜了相关...
  • 现在工作生活中经常会遇到将pdf转换成Word的问题,对于用户来说,这是一件非常头痛的问题,目前我们将pdf转换成Word主要是借助网上的一些pdf转换成Word转换器,但是网上免费的pdf转换成Word转换器并不多,而且转换...
  • WORD文档转换PDF格式

    千次阅读 2008-11-11 14:11:00
    由于一个客户的项目中需要将WORD文档转换PDF格式,实战教程如下: 需求分析:客户的项目以B/S结构为主,提供一个WORD文件在后台自动转换PDF,经过实际测试,如果该篇WORD文档有100多页的话,转换需要20分钟左右的时间...
  • 在编辑word文档时我们不仅能够将word文档保存当前word格式还可以另存为其他格式,这都是非常简单的操作,但是如果需要将大批量的word文档转换文本格式或其他格式要如何操作呢?其实操作方法也非常简单,今天就来给...
  • 怎样快速在线把pdf转换成word 当下很多大学生毕业前要进行论文答辩,需要借助网站查阅专业的文献,以作参考使用。而大部分平台文章采用的是PDF文件格式。PDF作为一种通用性和阅读性的电子文书,虽然便于我们浏览,...
  • caj,word,jpg等想转pdf怎么办?...国外小巧的转换软件,本站有同类的,但可惜是32位。在此提供64版,供网友使用!~ 亲测有用,安装完,直接打印时选虚拟pdf打印机—选择保存位置—保存,搞定!
  • 当下很多大学生毕业前要进行论文答辩,需要...有没有一款好用的在线PDF转换成Word转换器能够帮助我们快速实现PDF转Word转换呢?  网上的转换器数量数不胜数,在功能方面也是有着很大的差异,不同的差异化也是给我们
  • 首先应用中引入Microsoft.Office....WORD转换PDF代码如下: #region 将word文档转换PDF格式 /// <summary> /// 将word文档转换PDF格式 /// </summary> /// <param name="sourcePath...
  • jacob操作word excel(来自http://sinye.iteye.com/blog/588050) 项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下: 一、了解Jacob 先了解一下概念,JACOB 就是 JAVA...
  • 免费pdf文件转换成word转换器 通常因为工作的原因,我们需要在网上查阅资料,碰到有用的资料,就想把它复制下来,但很多文章是以PDF格式出现,即便是下载了PDF转换成Word转换器,转换出来的效果很不令人满意,原文...
  • 但是今天发现,如果是doc后缀的word文件,会报错,这样就无法提取数据了,然后开始搜索如果使用python将doc抓换成docx文件。发现好多文章都是使用win32com模块处理的。 、直接转换代码: 不多说了了,直接上我整理...
  • 把excle,word转换html页面显示

    千次阅读 2013-01-30 17:12:57
    一、使用Jacob转换Word,Excel为HTML “JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。” 首先下载Jacob包,JDK1.5以上需要使用Jacob1.9版本(JDK1.6尚未测试)...
  • # python如何转换word格式、读取word内容、转html? import docx from win32com import client as wc # 首先将doc转换docx word = wc.Dispatch("Word.Application") doc = word.Documents.Open(r"D:\...
  • word转换html代码,包含doc和docx格式,以及所需jar包

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,842
精华内容 47,536
关键字:

word变成32位了