精华内容
下载资源
问答
  • 解决方法是给word模板里的替换变量指定字体,比如我在word模板里定义了一个{{test}},因为在word文档里如果字体设置为Wingdings 2时,按下R键会自动出现符号,所以可以在某个替换变量指定值为R,设置字体为Wingdings...

    解决方法是给word模板里的替换变量指定字体,比如我在word模板里定义了一个{{test}},因为在word文档里如果字体设置为Wingdings 2时,按下R键会自动出现符号,所以可以在某个替换变量的地方指定值为R,设置字体为Wingdings 2。
    word模板内容如下

    关键代码如下

    Map<String,Object> map = new HashMap<String, Object>();
    
    map.put("test",new TextRenderData("R",new Style("Wingdings 2",14)));

    这样生成word后就出现了前面的勾号同理,其它特殊符号也可以这么使用(其它符号就不是R键了,需要自己去查询对应的键位)

     

    PS:生成的word文件在打开的电脑上一定要安装Wingdings 2 字体,否则会显示问号

     

    补充一点:如果是想最终生成pdf文件的话,按照上面的设置,字体就会有问题,可以按照下面这样来解决

    替换成下面

    这样pdf里面看到的效果就是正常的了

     

    展开全文
  • word文档添加目录

    2010-04-22 20:57:00
    当需要给word文档添加目录时,当需要查看word文档结构图(即左边显示目录--点击目录,右边自动跳转至目录所在页)时, 第一步,你需要先把希望显示的文字,设置其样式为“标题”,才能正常显示: 1. 点击“格式”--...

    当需要给word文档添加目录时,当需要查看word文档结构图(即左边显示目录--点击目录,右边自动跳转至目录所在页)时, 第一步,你需要先把希望显示的文字,设置其样式为“标题”,才能正常显示:
    1. 点击“格式”--选择“格式和样式”
    2. 选中需要显示的文字,在右侧弹出的格式和样式里,将其格式设置为标题。并设置其标题级别、字体大小、位置、行距等等 
    下面来看看如何添加目录,和如何查看文档结构图:
    一、添加目录
    目录通常是长文档不可缺少的部分,有了目录,用户就能很容易地知道文档中有什么内容,如何查找内容等。Word 提供了自动生成目录的功能,使目录的制作变得非常简便,而且在文档发生了改变以后,还可以利用更新目录的功能来适应文档的变化。 
     1 创建标题目录
    Word 一般是利用标题或者大纲级别来创建目录的。因此,在创建目录之前,应确保希望出现在目录中的标题应用了内置的标题样式(标题1 到标题9)。也可以应用包含大纲级别的样式或者自定义的样式。如果文档的结构性能比较好,创建出合格的目录就会变得非常快速简便。
    1.1 从标题样式创建目录
    从标题样式创建目录的步骤如下:
    (1)把光标移到要插入目录的位置。
    (2)单击【插入】菜单项的【索引和目录】菜单项,并在弹出的【索引和目录】对话框选择【目录】选项卡。
    (3)在【格式】列表框中选择目录的风格,选择的结果可以通过【打印预览】框来查看。如果选择【来自模板】,标识使用内置的目录样式(目录1 到目录9)来格式化目录。如果要改变目录的样式,可以单击【更改】按钮,按更改样式的方法修改相应的目录样式。
    1.2 从其他样式创建目录
    如果要从文档的不同样式中创建目录,例如,不需要根据【标题 1】到【标题9】的样式来创建目录,而是根据自定义的【样式1】到【样式3】的样式来创建目录,操作步骤如下:
    (1)将光标移到要插入目录的位置。
    (2)打开对话框,然后单击【选项】按钮,弹出【目录选项】对话框。
    (3)在【有效样式】列表框中找到标题使用的样式,然后在【目录级别】文本框中指定标题的级别。如果不想用某一样式,要删除【目录级别】文本框中的数字。例如,用户可以删除标题1、标题2 和标题3 后面的【目录级别】中的数字。
    (4)单击【确定】按钮,返回到【索引和目录】对话框。
    (5)在【索引和目录】对话框中选择合适的选项后单击【确定】按钮。
    2 创建图表目录
    图表目录也是一种常用的目录,可以在其中列出图片、图表、图形、幻灯片或其他插图的说明,以及它们出现的页码。在建立图表目录时,用户可以根据图表的题注或者自定义样式的图表标签,并参考页序按照排序级别排列,最后在文档中显示图表目录。 使用题注组织目录的方法如下:
    (1)确保文档中要建立图表目录的图片、表格、图形加有题注。
    (2)将光标移到要插入图表目录的地方。
    (3)单击【插入】菜单中的【索引和目录】菜单项,并在【索引和目录】对话框中选择【图表目录】选项卡。
    (4)在【题注标签】下拉列表框中选择要建立目录的题注,如图表、公式、表格等。
    (5)在【格式】下拉列表框中选择一种目录格式,其他选项与创建一般目录一样,确定后单击【确定】按钮。
    在检查图表目录后,当将鼠标移到目录项目上时,鼠标指针会变为手形,单击鼠标左键接口跳转到相应的位置。
    利用题注建立图表目录是很方便的,但有时候,文档中的标签是用户键入的,并不是Word 的题注功能加上的。这时,就需要使用自定义样式建立图表目录,方法如下:
    (1)打开的【索引和目录】对话框,并选中【图表目录】选项卡。
    (2)单击【选项】按钮,弹出【图表目录选项】对话框。
    (3)选中【样式】复选框,并在其右边的下拉列表框中选择图表标签使用的样式名后单击【确定】按钮。
    (4)在【索引和目录】对话框中选择各选项,然后单击【确定】按钮。 
     3 创建引文目录
    引文目录与其他目录类似,可以根据不同的引文类型,创建不同的引文目录。在创建引文目录之前,应该确保在文档中有相应的引文。
    创建引文目录的操作步骤如下:
    (1)将光标移到要插入引文目录的位置。
    (2)单击【插入】菜单中的【索引和目录】菜单项,在弹出的【引文和目录】对话框中选择【引文目录】选项卡。
    (3)在【类别】中选择相应的引文类别,注意此种类别应该是引文中已经创建有的引文类型。
    (4)创建的引文目录也有相应的内置引文目录样式来套用,如果要更改,可以单击【更改】按钮。
    (5)如果引文的页码超过五处,可以选中【使用“各处”】复选框,这样可以避免页码过多反而给用户造成不便。
    (6)如果引文过长,可以选择【保留原格式】,以保留原有的引文格式。
    (7)选好目录的制表前导符和格式后,单击【确定】按钮即可,插入的引文目录。
    如果要标记引文,以创建合适的引文目录,可以按如下方法进行:
    (1)选择要标记的引文。
    (2)打开对话框,单击【标记引文】按钮,弹出【标记引文】对话框。
    (3)在【类别】的下拉列表框中选择合适的类型。
    (4)单击【标记】按钮即可对当前所选的文字进行标记,如果单击【标记全部】按钮,将对存在于文档中的所选文字进行标记。
    (5)如果还要标记其他引文,不要关闭【标记引文】对话框,直接在文档中选取要标记的引文。
    (6)返回【标记引文】对话框,选中的引文将出现在【所选引文】下面,然后单击【标记】即可。
    (7)如果要修改一个存在的类别,可以单击【类别】按钮,弹出对 话框。
    (8)选中要修改的类别,在【替换为】下面的文本框中输入要替换的文字,单击【替换】按钮即可。
    (9)完成后单击【确定】按钮,回到【标记引文】对话框。单击【关闭】按钮。
    4 更新目录
    Word 所创建的目录是以文档的内容为依据,如果文档的内容发生了变化,如页码或者标题发生了变化,就要更新目录,使它与文档的内容保持一致。最好不要直接修改目录,因为这样容易引起目录与文档的内容不一致。
    在创建了目录后,如果想改变目录的格式或者显示的标题等,可以再执行一次创建目录的操作,重新选择格式和显示级别等选项。执行完操作后,会弹出一个对话框,询问是否要替换原来的目录,选择【是】替换原来的目录即可。
    如果只是想更新目录中的数据,以适应文档的变化,而不是要更改目录的格式等项目,可以对着目录单击鼠标右键,在弹出的快捷菜单中单击【更新域】菜单项即可。用户也可以选择目录后,按下 F9 键更新域。 
    二、查看word文档结构图 
    打开word“文档1”--点击“视图”--点击“文档结构图”

    展开全文
  •  * word文档图片Web访问路径  * @return  */  public static String wordImgeWebPath(){  return "D:/kaoshi/gongshi"+ DateFormatUtil.formatDate(new Date())+"/";  }  /**  * 读取每个文字样式  *   ...
    package com.wcpdoc.exam.exam.utils;


    import java.io.BufferedWriter;
    import java.io.ByteArrayOutputStream;
    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.OutputStream;  
    import java.io.OutputStreamWriter;  
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.zip.GZIPOutputStream;


    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 org.apache.commons.lang.StringUtils;
    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.Picture;  
    import org.apache.poi.hwpf.usermodel.Range;  
    import org.apache.poi.hwpf.usermodel.Paragraph;     
    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.w3c.dom.Document;


    import com.wcpdoc.exam.exam.entity.Question;


    import net.arnx.wmf2svg.gdi.svg.SvgGdi;
    import net.arnx.wmf2svg.gdi.wmf.WmfParser;  




    /**
     *


     * @Description:Word试卷文档模型化解析


     * @author <a href="mailto:thoslbt@163.com">Thos</a> 42  * @ClassName: WordToHtml 44  * @version V1.0
     *
     */
    public class WordUtils {


        /**
         * 回车符ASCII码
         */
        private static final short ENTER_ASCII = 13;


        /**
         * 空格符ASCII码
         */
        private static final short SPACE_ASCII = 32;


        /**
         * 水平制表符ASCII码
         */
        private static final short TABULATION_ASCII = 9;


        public static String htmlText = "";
        public static String htmlTextTbl = "";
        public static int counter=0;
        public static int beginPosi=0;
        public static int endPosi=0;
        public static int beginArray[];
        public static int endArray[];
        public static String htmlTextArray[];
        public static boolean tblExist=false;


        public static final String inputFile="D:/kaoshi/gongshi/111222.doc";
        public static final String htmlFile="D:/kaoshi/gongshi/abc.html";


        public static void main(String argv[])
        {        
            try {
                getWordAndStyle(inputFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        /**
         * word文档图片存储路径
         * @return
         */
        public static String wordImageFilePath(){


            return  "D:/kaoshi/gongshi"+ DateFormatUtil.formatDate(new Date());
        }


        /**
         *  word文档图片Web访问路径
         * @return
         */
        public static String wordImgeWebPath(){


            return "D:/kaoshi/gongshi"+ DateFormatUtil.formatDate(new Date())+"/";
        }


        /**
         * 读取每个文字样式
         * 
         * @param fileName
         * @throws Exception
         */




        public static List<Question> getWordAndStyle(String fileName) throws Exception {
        System.out.println(fileName);
            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];


            // 取得文档中字符的总数
            int length = doc.characterLength();
            // 创建图片容器
            PicturesTable pTable = doc.getPicturesTable();


            htmlText = doc.getSummaryInformation().getTitle();
            // 创建临时字符串,好加以判断一串字符是否存在相同格式


            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); 
                
                if(tblExist)
                {
                    if(i==beginArray[cur])
                    {         
                        htmlText+=tempString+htmlTextArray[cur];
                        tempString="";
                        i=endArray[cur]-1;
                        cur++;
                        continue;
                    }
                }
                if (pTable.hasPicture(cr)) {
                    htmlText +=  tempString ;                
                    // 读写图片                
                    readPicture(pTable, cr);
                    tempString = "";                
                } 
                else {


                    Range range2 = new Range(i + 1, i + 2, doc);
                    // 第二个字符
                    CharacterRun cr2 = range2.getCharacterRun(0);
                    char c = cr.text().charAt(0);
                    // 判断是否为空格符
                    if (c == SPACE_ASCII)
                        tempString += "&nbsp;";
                    // 判断是否为水平制表符
                    else if (c == TABULATION_ASCII)
                        tempString += "&nbsp;&nbsp;&nbsp;&nbsp;";
                    // 比较前后2个字符是否具有相同的格式
                    boolean flag = compareCharStyle(cr, cr2);
                    if (flag&&c !=ENTER_ASCII)
                        tempString += cr.text();
                    else {
                        htmlText += tempString + cr.text();
                        tempString = "";
                    }
                    // 判断是否为回车符
                    if (c == ENTER_ASCII)
                        htmlText += "<br/>";
                    
                }
            }


            htmlText += tempString;
            //生成html文件
            writeFile(htmlText);
            System.out.println("------------WordToHtml转换成功----------------");
            //word试卷数据模型化
            
            System.out.println("------------WordToHtml模型化成功----------------");
            return analysisHtmlString(htmlText);
        }


        /**
         * 读写文档中的表格
         * 
         * @param pTable
         * @param cr
         * @throws Exception
         */
        public 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>";
                for (int i = 0; i < tb.numRows(); i++) {      
                    TableRow tr = tb.getRow(i);   


                    htmlTextTbl+="<tr>";
                    //迭代列,默认从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);      
                            String s = para.text().toString().trim();   
                            if(s=="")
                            {
                                s=" ";
                            }
                            htmlTextTbl += "<td width="+cellWidth+ ">"+s+"</td>";
                        }       
                    }      
                }   
                htmlTextTbl+="</table>" ;    
                htmlTextArray[counter]=htmlTextTbl;


            } //end while 
        }    


        /**
         * 读写文档中的图片
         * 
         * @param pTable
         * @param cr
         * @throws Exception
         */
        public static void readPicture(PicturesTable pTable, CharacterRun cr) throws Exception {
            // 提取图片
            Picture pic = pTable.extractPicture(cr, false);
            // 返回POI建议的图片文件名
            String afileName = pic.suggestFullFileName();
            String suffix = afileName.substring(afileName.lastIndexOf(".")+1);
            String prefix = afileName.substring(0, afileName.lastIndexOf("."));
            File file = new File(wordImageFilePath());
            System.out.println(file.mkdirs());
            OutputStream out = new FileOutputStream(new File( wordImageFilePath()+ File.separator + afileName));
            pic.writeImageContent(out);
            if(suffix.equals("wmf")){
            convert(wordImgeWebPath()+afileName, wordImgeWebPath()+prefix+".svg");
            SVGUtils svgUtils = new SVGUtils();
            svgUtils.svg2PNG(new File(wordImgeWebPath()+prefix+".svg"), new File(wordImgeWebPath()+prefix+".png"));
            afileName = prefix+".png";
            htmlText += "<img src='question/getPic?path="+wordImgeWebPath()+ afileName
                    + "' mce_src='question/getPic?path="+wordImgeWebPath()+ afileName + "' style='height:30px;width:50px'/>";
            }else{
            htmlText += "<img src='question/getPic?path="+wordImgeWebPath()+ afileName
            + "' mce_src='question/getPic?path="+wordImgeWebPath()+ afileName + "' />";
            }
            
        }
      


        public static void convert(String file,String dest){ 
    try{
    InputStream in = new FileInputStream(new File(file));
            WmfParser parser = new WmfParser();
            final SvgGdi gdi = new SvgGdi(false);
            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){
    System.out.println("edn?????"+e.getMessage());
    }
       }
        public 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));
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            transformer.transform(new DOMSource(doc), new StreamResult(bos));
            out.flush();
            out.close();
    }
        public 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()&& cr1.getColor() == cr2.getColor()) 
            {
                flag = true;
            }
            return flag;
        }


        /*** 字体颜色模块start ********/
        public static int red(int c) {  
            return c & 0XFF;  
        }  


        public static int green(int c) {  
            return (c >> 8) & 0XFF;  
        }  


        public static int blue(int c) {  
            return (c >> 16) & 0XFF;  
        }  


        public static int rgb(int c) {  
            return (red(c) << 16) | (green(c) << 8) | blue(c);  
        }  


        public static String rgbToSix(String rgb) {  
            int length = 6 - rgb.length();  
            String str = "";  
            while (length > 0) {  
                str += "0";  
                length--;  
            }  
            return str + rgb;  
        }  




        public static String getHexColor(int color) {  
            color = color == -1 ? 0 : color;  
            int rgb = rgb(color);  
            return "#" + rgbToSix(Integer.toHexString(rgb));  
        }  
        /** 字体颜色模块end ******/


        /**
         * 写文件
         * 
         * @param s
         */
        public static void writeFile(String s) {
            FileOutputStream fos = null;
            BufferedWriter bw = null;
            PrintWriter writer = null;
            try {
                File file = new File(htmlFile);
                fos = new FileOutputStream(file);
                bw = new BufferedWriter(new OutputStreamWriter(fos));
                bw.write(s);
                bw.close();
                fos.close();
                //编码转换
                writer = new PrintWriter(file, "GB2312");
                writer.write(s);
                writer.flush();
                writer.close();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }


        }


        /**
         * 分析html
         * @param s
         */
        public static List<Question> analysisHtmlString(String s){
        String[] split2 = s.split("&nbsp; EMBED&nbsp; Equation.DSMT4&nbsp; &nbsp; ");
        String a = "";
        for (String string : split2) {
        a+=string;
    }
        /*for (int i = 0; i < a.length(); i++) {
        char ch = a.charAt(i);
       //如果是无效字符,则替换成空字符
        if ((ch >= 0x00 && ch <= 0x08) || (ch >= 0x0b && ch <= 0x0c) || (ch >= 0x0e && ch <= 0x1f)){
        a = a.replace(ch, ' ');
        }
        }*/
            String q[] = a.split("<br/>[0-9]+、");
            List<Question> list = new ArrayList<>();
            for (int i = 1; i < q.length; i++) {
           
            Question question = new Question();
        String[] split = q[i].split("<br/>");
        String ti = split[0].substring(1, 4);
        String timu = split[0].substring(5, split[0].length());
        System.out.println(timu);
        if(ti.equals("单选题") || ti.equals("选择题")){
        question.setType(1);
        }else if(ti.equals("多选题")){
        question.setType(2);
        }else if(ti.equals("填空题")){
        question.setType(3);
        }else if(ti.equals("判断题")){
        question.setType(4);
        }else if(ti.equals("解答题") || ti.equals("问答题") || ti.equals("简答题")){
        question.setType(5);
        }
        question.setTitle("<p>"+timu+"</p>");
       
        if(ti.equals("单选题") || ti.equals("选择题")){
        question.setOptionA("<p>"+split[1].substring(2)+"</p>");
        question.setOptionB("<p>"+split[2].substring(2)+"</p>");
        question.setOptionC("<p>"+split[3].substring(2)+"</p>");
        question.setOptionD("<p>"+split[4].substring(2)+"</p>");
        question.setAnswer(split[5].substring(split[5].indexOf(":")+1));
        question.setAnalysis("<p>"+split[6].substring(split[6].indexOf(":")+1)+"</p>");
        }else{
        question.setAnswer("<p>"+split[1].substring(split[1].indexOf(":")+1)+"</p>");
        question.setAnalysis("<p>"+split[2].substring(split[2].indexOf(":")+1)+"</p>");
        }
        list.add(question);
    }
            return list;
           


           /* LinkedList<String> list = new LinkedList<String>();


            //清除空字符
            for (int i = 0; i < q.length; i++) {
                if(StringUtils.isNotBlank(q[i].toString().replaceAll("</?[^>]+>","").trim())){


                    list.add(q[i].toString().trim());
                }
            }
            String[] result = {};
            String ws[]=list.toArray(result);
            for (String string : ws) {
    System.out.println(string);
    }
            int singleScore = 0;
            int multipleScore = 0;
            int fillingScore = 0;
            int judgeScore = 0;
            int askScore = 0;
            int singleNum = 0;
            int multipleNum = 0;
            int fillingNum = 0;
            int judgeNum = 0;
            int askNum = 0;*/
            //***********试卷基础数据赋值*********************//*
            /*for (int i = 0; i < ws.length; i++) {
                String delHtml=ws[i].toString().replaceAll("</?[^>]+>","").trim();//去除html
                if(delHtml.contains("、单选题")){
                    String numScore=numScore(delHtml);
                    singleNum= Integer.parseInt(numScore.split(",")[0]) ;
                    singleScore=Integer.parseInt(numScore.split(",")[1]) ;
                }else if(delHtml.contains("、多择题")){
                    String numScore=numScore(delHtml);
                    multipleNum= Integer.parseInt(numScore.split(",")[0]) ;
                    multipleScore=Integer.parseInt(numScore.split(",")[1]) ;
                }else if(delHtml.contains("、填空题")){
                    String numScore=numScore(delHtml);
                    fillingNum= Integer.parseInt(numScore.split(",")[0]) ;
                    fillingScore=Integer.parseInt(numScore.split(",")[1]) ;
                }else if(delHtml.contains("、判断题")){
                    String numScore=numScore(delHtml);
                    judgeNum= Integer.parseInt(numScore.split(",")[0]) ;
                    judgeScore=Integer.parseInt(numScore.split(",")[1]) ;
                }else if(delHtml.contains("、问答题")){
                    String numScore=numScore(delHtml);
                    askNum= Integer.parseInt(numScore.split(",")[0]) ;
                    askScore=Integer.parseInt(numScore.split(",")[1]) ;
                }


            }
            *//**************word试卷数据模型化****************//*
            List<Map<String, Object>> bigTiMaps = new ArrayList<Map<String,Object>>();
            List<Map<String, Object>> smalMaps = new ArrayList<Map<String,Object>>();
            List<Map<String, Object>> sleMaps = new ArrayList<Map<String,Object>>();
            String htmlText="";
            int smalScore=0;
            for (int j = ws.length-1; j>=0; j--) {
                String html= ws[j].toString().trim();//html格式
                String delHtml=ws[j].toString().replaceAll("</?[^>]+>","").trim();//去除html
                if(!isSelecteTitele(delHtml)&&!isTitele(delHtml)&&!isBigTilete(delHtml)){//无
                    if(isTitele(delHtml)){
                        smalScore=itemNum(delHtml);
                    }
                    htmlText=html+htmlText;
                }else if(isSelecteTitele(delHtml)){//选择题选择项
                    Map<String, Object> sleMap = new HashMap<String, Object>();//选择题选择项
                    sleMap.put("选项", delHtml.substring(0, 1));
                    sleMap.put("选择项", html+htmlText);
                    sleMaps.add(sleMap);
                }else if(isTitele(delHtml)){//小标题
                    Map<String, Object> smalMap = new HashMap<String, Object>();//小标题
                    smalMap.put("smalTilete", html+htmlText);
                    smalMap.put("smalScore", smalScore>0?smalScore+"":itemNum(delHtml)+"");
                    smalMap.put("sleMaps", sleMaps);
                    smalMaps.add(smalMap);
                }else if(isBigTilete(delHtml)){//大标题
                    Map<String, Object> bigTiMap = new HashMap<String, Object>();//大标题
                    bigTiMap.put("bigTilete", delHtml.substring(2, 5));
                    bigTiMap.put("smalMaps", smalMaps);
                    bigTiMaps.add(bigTiMap);
                }    


            }
            for (Map<String, Object> map : sleMaps) {
    System.out.println(map.toString());
    }*/
        }


        //获取大题-题目数量以及题目总计分数
        public static String numScore(String delHtml){


            String regEx="[^0-9+,|,+^0-9]";   
            Pattern p = Pattern.compile(regEx);   
            Matcher m = p.matcher(delHtml);
            String s=m.replaceAll("").trim();
            if(StringUtils.isNotBlank(s)){
                if(s.contains(",")){
                    return s;
                }else if(s.contains(",")){
                    return s.replace(",", ",");
                }else{
                    return "0,0";
                }
            }else{
                return "0,0";
            }


        }
        //获取每小题分数
        public static int itemNum(String delHtml){
            Pattern pattern = Pattern.compile("((.*?))"); //中文括号 
            Matcher matcher = pattern.matcher(delHtml);
            if (matcher.find()&&isNumeric(matcher.group(1))){
                return Integer.parseInt(matcher.group(1));
            }else {
                return 0;
            }
        }
        //判断Str是否是 数字
        public static boolean isNumeric(String str){ 
            Pattern pattern = Pattern.compile("[0-9]*"); 
            return pattern.matcher(str).matches();    
        } 
        //判断Str是否存在小标题号
        public static boolean isTitele(String str){
            Pattern pattern = Pattern.compile("^([\\d]+[-\\、].*)"); 
            return pattern.matcher(str).matches();
        }
        //判断Str是否是选择题选择项
        public static boolean isSelecteTitele(String str){
            Pattern pattern = Pattern.compile("^([a-zA-Z]+[-\\:].*)"); 
            return pattern.matcher(str).matches();
        }
        //判断Str是否是大标题
        public static boolean isBigTilete(String str){
            boolean iso= false ;
            if(str.contains("一、")){
                iso=true;
            }else if(str.contains("二、")){
                iso=true;
            }else if(str.contains("三、")){
                iso=true;
            }else if(str.contains("四、")){
                iso=true;
            }else if(str.contains("五、")){
                iso=true;
            }else if(str.contains("六、")){
                iso=true;
            }else if(str.contains("七、")){
                iso=true;
            }else if(str.contains("八、")){
                iso=true;
            }
            return iso;
        }
    }
    展开全文
  • 用 Python 操作 Word 文档

    千次阅读 2019-07-23 08:30:00
    图片来源于网络♚作者:贠云龙Blog:zhihu.com/people/yunlongyun本文主要讲解python中操作word的思路。一、Hello,world!使...
        

    640?wx_fmt=jpeg

    图片来源于网络


    作者:贠云龙

    Blog: zhihu.com/people/yunlongyun

    本文主要讲解python中操作word的思路。

    一、Hello,world!

    使用win32com需要安装pypiwin32

    pip install pypiwin32

    推荐使用python的IDLE,交互方便

    1、如何新建文档

    from win32com.client import Dispatchapp = Dispatch('Word.Application')# 新建word文档doc = app.Documents.Add()

    按F5运行,发现什么效果都没有, 这是因为Word被隐藏了。

    2、如何显示Word

    app.Visible = 1

    运行后,熟悉的Word界面出现。现在来输入文字。

    640?wx_fmt=jpeg

    3、如何输入

    我们在Word中输入文字时,一般会先使用鼠标点击需要输入文字的位置,这个过程是获得了光标焦点。

    当我们需要替换某些文字时,首先会选中某些文字,然后再输入、被选择的文字呈现出灰色的背景,表示被选中了。

    光标焦点和选择范围在Word中,都是Selection。什么都没选择的光标焦点,和选择了整片文章的选择范围,代表了Selection的最小和最大范围。

    这也是为什么整个Word中只能有一个Selection的原因。因为光标或者选择范围就只能有一个。

    # 运行下句代码后,s获得新建文档的光标焦点,也就是图中的回车符前s = app.Selection# 用“Hello, World!“替换s代表的范围的文本s.Text = 'Hello, world!'

    此时,s的范围为'Hello, world!'这句话的选择区域。

    640?wx_fmt=jpeg

    能如此方便的调用Word,得益于其底层的COM(组件对象模型)可以被任意语言调用。

    Selection是Word对象模型中的类,此处的s是它的对象(实例)。

    4、如何查看选择区域是什么

    s.Text可以查看或者设置s选择区域的文本。Word对象模型中很多对象都有默认属性,Text就是Selection的默认属性,类似python的__str__方法。运行s()调用s的默认属性,此处等于于运行了s.Text

    s()

    控制台显示,s的范围为'Hello, world!'这句话的选择区域。

    640?wx_fmt=jpeg

    二、对Word对象模型的简单理解

    Word中最重要的类(对象)有以下几个。

    1、Application对象:Word应用。Application包含了菜单栏、工具栏、命令以及所有文档等。

    # 如何获得app = win32com.client.Dispatch('Word.Application')

    2、Document对象:文档。可以有多个Document,就像Word可以打开多个文档。

    使用下列代码新建文档或者打开文档

    # 如何获得# 新建文档doc = app.Documents.Add()# 打开已有文档doc = app.Documents.Open('你的Word文件路径')

    3、Selection对象:选区:代表当前窗口的选区。它可以是文档中的选择(高亮)区域,也可以是插入点(如果没有什么被选中)。同一时间只能激活一个Selection。

    • 如何获得

    s = app.Selection

    在Word中,按下Alt+F11打开宏编辑器

    640?wx_fmt=jpeg

    然后按下F2打开对象浏览器

    640?wx_fmt=jpeg

    输入selection并回车,发现成员一列中完全匹配Selection的只有4个类,这表示只有这些类的Selection属性可以返回Selection对象(如图)。

    640?wx_fmt=jpeg

    Application我们前面介绍过,其它的类可以用同样的方法查询如何获得。

    • 如何使用Selection输入

    # 替换当前选择s.Text = 'Hello, world!'# 输入s.TypeText('Hello, world!')# 把当前选择复制到剪贴板s.Copy()# 粘贴剪贴板中的内容s.Paste()

    Text和TypeText的不同在于完成后的选区:

    Text:输入的文本(前例中选区为'Hello, world!');

    TypeText:文本后的插入点(前例中选区为!后的插入点)。

    • 如何变更Selection

    # 使用Start,End指定字符范围s.Start = 0s.End = n# s从第0个字符(第1个字符前的插入点)到第n个字符。# 汉字是每字为1字符# 相当于按下Delete键s.Delete() # 相当于按下Ctrl+As.WholeStory() # 向左移动s.MoveLeft()# 向右移动2个字符,第1个参数是移动单位WdUnits,见下图s.MoveRight(1, 2)

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    所有能获得Selection的类

    4、Range对象:连续区域。Range表示一个连续区域。Range由Start和End位置定义,用来区分文档的不同部分。Range是独立于Selection的。不管Selection是否改变,都可以定义和操作Range。文档中可以定义多个Range。这个连续区域同样可以小到一个插入点,大到整个文档。Selection有Range属性,而Range没有Selection属性。

    当使用Range(Start, End)方法来指定文档的特定范围时。文档的第一个字符位置为0,最后一个字符的位置和文档的字符总数相等。不提供参数时代表选择所有范围。

    • 如何获得

    r = doc.Range()# 或r = s.Range()

    Word中有很多对象的Range属性都能返回Range对象,请在Word-宏编辑器-对象浏览器中自己查询。

    • 如何使用

    因为本文仅使用Selection就可以达到效果,Range的很多属性和方法和Selection是类似的。

    5、Font对象:字体。包含对象的字体属性(字体名称、字号、颜色等)。

    • 如何获得

    font = s.Font# 或font = r.Font

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 字体设置为仿宋,电脑上必须安装有该字体font.Name = '仿宋'# 字号设置为三号font.Size = 16
    1. ParagraphFormat对象:段落格式。用来设置段落格式,包括对齐、缩进、行距、边框底纹等。

    • 如何获得

    pf = s.ParagraphFormat# 或pf = r.ParagraphFormat

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 左、中、右 对齐分别为0, 1, 2,其他对齐方式见.NET 文档中的ParagraphFormatpf.Alignment = 0# 单倍、1.5倍、双倍行距分别为0, 1, 2,其他见ParagraphFormat文档pf.LineSpacingRule = 0# 指定段落的左缩进值为21磅。pf.LeftIndent = 21

    7、PageSetup对象:页面设置。代表所有的页面设置属性,包括左边距,底边距,纸张大小等等。

    • 如何获得

    ps = doc.PageSetup# 或ps = s.PageSetup# 或ps = r.PageSetup

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 上边距79磅 ps.TopMargin = 79# 页面大小,A3、A4分别为6,7ps.PageSize = 7

    8、Styles对象:样式集。Styles包含指定文档中内置和用户定义的所有样式,它返回一个样式集。其中的每个样式的属性包括字体、 字形、 段落间距等。如常见的正文、页眉、标题1样式。

    • 如何获得

    # 只能通过文档获得styles = doc.Styles
    • 如何使用

    # 返回正文样式normal = styles(-1)# 修改正文样式的字体字号normal.Font.Name = '仿宋'normal.Font.Size = 16

    Styles的返回参数,标题1、标题2、标题3分别为-2、-3、-4,页眉为-32,标题为-63,其他见Styles文档

    三、解决问题思路

    因为有很多功能,在文档中难以直接找到,需要使用如下方法。

    1、把想实现的功能,使用word的录制宏,在宏编辑器里查看VBA代码,从而了解大概使用什么方法。

    2、使用在线的 .NET API,从而了解详细的语法

    3、如果不知道从哪获得实现该功能的对象,则可以使用word宏编辑器的对象浏览器(F2键),具体见前文Selection部分

    4、使用Python的IDLE进行实时交互

    app = win32com.client.Dispatch('word.application')app.Visible='True' # 让word程序可见,这样在交互命令行做的修改就可以实时显示doc = app.Documents.Open('你的桌面路径/test.docx') # word文件放在桌面方便手动修改

    然后输入自己想尝试的对象属性或方法。

    四、实例:格式化word文件为最新的公文国家标准

    只进行两个部分的设置,一是页面设置、二是页码设置

    from win32com.client import Dispatch #需要安装的是pypiwin32模块app=Dispatch('Word.Application')doc = app.Documents.Open('你的word文档路径')# 页面设置cm_to_points = 28.35 # 1厘米为28.35磅# 国家公文格式标准要求是上边距版心3.7cm# 但是如果简单的把上边距设置为3.7cm# 则因为文本的第一行本身有行距# 会导致实际版心离上边缘较远,上下边距设置为3.3cm# 是经过实验的,可以看看公文标准的图示# 版心指的是文字与边缘距离doc.PageSetup.TopMargin = 3.3*cm_to_points  # 上边距3.3厘米doc.PageSetup.BottomMargin = 3.3*cm_to_points  # 下边距3.3厘米doc.PageSetup.LeftMargin = 2.8*cm_to_points  # 左边距2.8厘米doc.PageSetup.RightMargin = 2.6*cm_to_points  # 右边距2.6厘米# 设置正常样式的字体# 是为了后面指定行和字符网格时# 按照这个字体标准进行doc.Styles(-1).Font.Name = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameFarEast = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameAscii = '仿宋'# word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameOther = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.Size = 16 # word中的“正常”样式字号为三号doc.PageSetup.LayoutMode = 1 # 指定行和字符网格doc.PageSetup.CharsLine = 28 # 每行28个字doc.PageSetup.LinesPage = 22 # 每页22行,会自动设置行间距# 页码设置doc.PageSetup.FooterDistance = 2.8*cm_to_points  # 页码距下边缘2.8厘米doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 # 首页页码相同doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 # 页脚奇偶页相同w = doc.windows(1)  # 获得文档的第一个窗口w.view.seekview = 4 # 获得页眉页脚视图s = w.selection  # 获取窗口的选择对象s.headerfooter.pagenumbers.startingnumber = startingnumber  # 设置起始页码s.headerfooter.pagenumbers.NumberStyle = 0  # 设置页码样式为单纯的阿拉伯数字s.WholeStory() # 扩选到整个部分(会选中整个页眉页脚)s.Delete() #按下删除键,这两句是为了清除原来的页码s.headerfooter.pagenumbers.Add(4)  # 添加页面外侧页码s.MoveLeft(1, 2)  # 移动到页码左边,移动了两个字符距离s.TypeText('— ')  # 给页码左边加上一字线,注意不是减号s.MoveRight() #移动到页码末尾,移动了一个字符距离# 默认参数是1(字符)s.TypeText(' —') s.WholeStory() # 扩选到整个页眉页脚部分,此处是必要的# 否则s只是在输入一字线后的一个光标,没有选择区域s.Font.Name = '宋体's.Font.Size = 14 #页码字号为四号s.paragraphformat.rightindent = 21 #页码向左缩进1字符(21磅)s.paragraphformat.leftindent = 21 # 页码向右缩进1字符(21磅)doc.Styles('页眉').ParagraphFormat.Borders(-3).LineStyle = 0 # 页眉无底边框横线

    参考文章:

    Python通过win32实现office自动化https://blog.csdn.net/lzl001/article/details/8435048引用Microsoft Word 对象的技术及实现https://www.docin.com/p-1333941826.htmlWord组件对象模型https://blog.csdn.net/wishfly/article/details/39959349


    640?wx_fmt=png

    ▼ 点击成为社区注册会员          「在看」一下,一起PY!

    展开全文
  • 用好Word文档结构图

    千次阅读 2009-09-11 12:01:00
    其实Word如果使用了文档结构图就可以方便的选择段落。有没有什么方法使文章一目了然?有,就是Word文档结构图。1.认识文档结构图?“文档结构图”是一个独立的窗格,能够显示文档的标题列表。如图1,就是本篇文章...
  • 1、以word文档形式的的试卷,格式要求第一行为试卷名,以非word自动生成的数字为题号 开头,以题型或固定格式文字为结尾,这里使用'[单选题]'。上传word,解析word文档内容,详细解析出试卷名,题号,问题,选项,...
  • word文档参考文献如何自动编号

    万次阅读 2010-10-16 08:59:00
    3.如“自动编号”后不是阿拉伯数字右下角的“选项”,在编号格式中选中阿拉伯数字。 4.确定后在该处就插入了一个上标“1”,而光标自动跳到文章最后,前面就是一个上标“1”,这就是输入第一个参考文献的...
  • 我们在编辑WORD文档的时候会经常使用分隔符,今天来讲一下怎样在Word2007文档中插入或删除分隔符。 工具/原料 Word2007 步骤/方法 1 在WORD2007...
  • java实现的导出word文档

    万次阅读 2016-11-24 12:53:49
    需要先用office2013做一个word模板,就是你想要生成的word的模板,保存为xml格式。然后在线格式化一下,这样生成的代码比较规范,然后将后缀修改为ftl,内容为一下格式:、 我使用的方法是通过Action跳转的方法来...
  • Python3爬取某教育平台题库保存为Word文档

    万次阅读 多人点赞 2017-10-24 11:37:27
    这时第一个sectionid/后的数字由5014变成了5015,说明这个数字是试题ID。 这样一来,可以在脑海中想到如何把这些题目都下载下来了,使用两个循环语句,第一层负责获取试题ID,第二层负责获取题目页数,其中的请求...
  • word文档设置页眉页脚的技巧

    万次阅读 2007-05-31 18:55:00
    word文档设置页眉页脚的技巧 分类:海阔天空在工作中经常遇到对文档的排版问题,现在我以一问一答形式进行解析,希望能对大家有帮助。也许在解答方面不够精准,但是能够达到目的;也许回答有些罗嗦,不过也是为了大家...
  • word文档修订功能

    2010-07-30 19:29:00
    这些操作再重复一次,就又回到普通模式了】,当你再删除文字等时候,word处理方式不是将内容从文档中删除,而是把删除的内容加一划线处理。当你进行插入文字时,word处理方式会在插入的文字下面加以下划线。  ...
  • 运用 Range 对象处理 Word 文档内容

    千次阅读 2009-11-22 20:27:00
    原地址: http://www.officexy.com/Articles/Word/Word_VBA20061027194952795.htm 在所有 Office 应用程序中,Microsoft Word 可能是应用最广泛的应用程序,它还经常在自定义 Office 解决方案中扮演重要的角色。...
  • 本文主要介绍word 文档下,如何使用通配符,进行指定内容部分替换,譬如`AXB`替换为`AAB` 直接抛出一个具体问题吧 我们知道英文中,大部分符号后面要跟空格,有时候容易出错,所以可以使用通配符来查找替换进行,在...
  • 同题,在写论文时,大概是由于文档字数过多,编辑时间越来越长,以至于出现...(有的是11.0,或者其他数字,可一一点开,查找word下是否有daodata,如我就是在16.0找到的,应该是和所使用的word版本相关)。 参考原po二楼 .
  • 运用Range 对象处理 Word 文档内容

    千次阅读 2015-05-19 15:02:36
    在所有 Office 应用程序中,Microsoft Word 可能是应用最广泛的应用程序,它还经常在自定义 Office 解决方案中扮演重要的角色。开发人员用各种不同的方式使用 Word,有一些方式很简单,而另一些极其复杂。无论涉及何...
  • 使用Jacob来处理Word文档 Word或Excel程序是以一种COM组件形式存在的。如果能够在Java中调用Word的COM组件,就 能使用它的方法来获取Word文档中的文本信息。目前网上有许多提供这样的工具。 1 Jacob的下载 ...
  • word怎么恢复自动保存Word can automatically create a backup of your document every time you save it. However, you can also have Word automatically save your document for you at regular intervals using ...
  • 前一段时间,在做ppt的时候,发现打一个字,需要很久电脑才能够反应出相应的字体,各种百度找资源之后,把相应的安装包卸载之后,这个问题解决了,可是却...(1)首先打开一个Word文档,打开“文件”——-“选项”—...
  • 在所有 Office 应用程序中,Microsoft Word 可能是应用最广泛的应用程序,...无论涉及何种自定义解决方案,用 Visual Basic for Applications (VBA) 处理 Word 文档的基本方法都是一样的。下边,我将概括地介绍如何使用
  • 教程 | Python 实现 Word 文档操作...

    千次阅读 2019-07-26 00:00:00
    本文由P"ython中文社区"编辑本文主要讲解Python中操作word的思路。一、Hello,world!使用win32com需要安装pypiwin32pip inst...
  • 用pyton将word文档转成html和pdf

    千次阅读 2017-06-20 17:50:57
    代码是从百度找的,如下: #!/usr/bin/env python #coding=utf-8 from win32com import client as wc word = wc.Dispatch('Word.Application') doc = word.Documents.Open('e:/1.doc') doc.SaveAs('e:/1....
  • Word 2003 长篇文档排版技巧

    千次阅读 2012-09-03 08:38:11
    简介 市场部经常要出各种分析报告,一写就是洋洋洒洒几...制作目录也是出力讨好的事,尽管小王知道Word中有插入目录的功能,可是尝试了几次就弃之不用了,原因是系统总是提示有错误。现在只能手工输入目录,加班加点
  • 遇到一篇中英文混排的Word文章,想批量删除文档里的英文而只保留中文,有什么快速便捷的方法?答案当然是肯定的了。且看。 在Word中只删除英文保留中文的方法 在Word的“编辑”菜单“查找”(或直接按ctrl+F快捷键...
  • 如果在Word文档中创建了页眉、页脚,那么在默认情况下,一篇文章从头到尾的页眉页脚都是一样的。 但有时,我们还需要根据不同的章节内容而设定不同的页眉页脚。有的朋友将不同的章节分别保存成不同的文件,然后再...
  • 适用于: Word 2016, Word 2013, Word 2010, Word Online, Word Starter, Word Starter ...Word 提供了用于查找文档中的特定内容的多个选项。您可以搜索和替换文本、 图像、 标题、 书签、 或某些类型的格式,如段落
  • doc.setData({ title: "word文档下载demo", table: _this.checklist, multi: _this.chanquan_list_2, }); doc.render(); var out = doc.getZip().generate({ type: "blob", mimeType: "application/vnd....
  • 把公式复制到Word文档中的一种方法

    千次阅读 2019-10-04 12:11:37
    调研整理几篇工作的损失函数时想到我很早以前照着公式打上去的痛苦,遂决定分享一下这种极大提高生产力的...前者是一个(比较轻量的)公式扫描工具,可以得到LaTeX格式的文本,在https://mathpix.com/下载;后者是...
  • word文档中加进参考文献的标注

    千次阅读 2010-06-15 16:20:00
     写论文时,参考文献的引用是一件很麻烦的事,每个杂志要求的文献格式是一样的,包括在文章中插入的方法和在文章后面排列的格式和顺序等都不同。根据排 列顺序,主要分为两种:一是按插入顺序排序,二是按作者...
  • 遇到一篇中英文混排的Word文章,想批量删除文档里的英文而只保留中文,有什么快速便捷的方法?答案当然是肯定的了。且看。 在Word中只删除英文保留中文的方法 : 在Word的“编辑”菜单“查找”(或直接按ctrl+F...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,376
精华内容 12,550
关键字:

word文档数字选不上