精华内容
下载资源
问答
  • 前段时间写项目文档,发现Word导航栏标题的节点搜索还是蛮有意思的,想着自己也实现一下这样的逻辑。下就是Word节点搜索时的。    仔细观察搜索时的行为,可以分析需要实现以下功能: 1、节点递归查找 2...

        前段时间写项目文档,发现Word导航栏标题的节点搜索还是蛮有意思的,想着自己也实现一下这样的逻辑。下图就是Word节点搜索时的图。

     

        仔细观察搜索时的行为,可以分析需要实现以下功能:

    1、节点递归查找

    2、颜色标注匹配节点

    3、若匹配节点其父节点尚未展开,则需颜色标注该父节点,表示其子项存在匹配项

    4、展开节点时,若节点并非是匹配节点,则取消颜色标注

    5、收回节点时,若节点含有匹配子节点,则需按颜色标注

        项目中常常用到DevExpress,TreeList中有个CustomDrawNodeCell事件,可以很好控制每个节点显示的颜色。下面就用Winform+Dev控件简单实现这个功能。

        界面没什么好说的,就拖几个控件就好。

        TreeList数据源,大家可以根据项目需要绑定,我这里是自己随便生成的。

    class Data
        {
            public static DataTable InitData()
            {
                List<NodeModel> lists = GenerateData();
                ModelHandler<NodeModel> modelHandler = new ModelHandler<NodeModel>();
                return modelHandler.FillDataTable(lists);
            }
            public static List<NodeModel> GenerateData()
            {
                List<NodeModel> lists = new List<NodeModel>() { 
                    new NodeModel(){ID=101 ,PARENTID=100,NAME="第一类"},
                    new NodeModel(){ID=102 ,PARENTID=100,NAME="第二类"},
                    new NodeModel(){ID=103 ,PARENTID=100,NAME="第三类"},
                    new NodeModel(){ID=104 ,PARENTID=100,NAME="第四类"},
                    new NodeModel(){ID=105 ,PARENTID=100,NAME="第五类"},
                    new NodeModel(){ID=106 ,PARENTID=100,NAME="第六类"},
                    new NodeModel(){ID=107 ,PARENTID=101,NAME="张三"},
                    new NodeModel(){ID=108 ,PARENTID=113,NAME="张三"},
                    new NodeModel(){ID=109 ,PARENTID=103,NAME="李四"},
                    new NodeModel(){ID=110 ,PARENTID=104,NAME="王五"},
                    new NodeModel(){ID=111 ,PARENTID=105,NAME="黄四"},
                    new NodeModel(){ID=112 ,PARENTID=106,NAME="王六"},
                    new NodeModel(){ID=113 ,PARENTID=102,NAME="第二子类"}
                };
                return lists;
            }
        }
     class NodeModel
        {
            public int ID { get; set; }
    
            public int PARENTID { get; set; }
    
            public string NAME { get; set; }
        }

        为了实现上述的功能,逻辑应该是这样的,就是先对节点向下查找,对查找到的匹配节点再进行向上查找父节点,将匹配节点与其父节点区别标记,去重后形成一个集合,将这个集合交给绘制事件,绘制时根据属性判断是否需要颜色标注。

        因此需要写一个节点扩展类,至少包含三个属性,如是否是匹配的节点,是否需要颜色标注,节点的id。

        class NodeEx
        {
            private bool _matchNode;
            public bool MatchNode { get { return _matchNode; } }
    
            public bool DisPlay { set; get; }
    
            private int _id;
            public int ID { get { return _id; } }
    
            private string _Name;
            public string NAME { get { return _Name; } }
    
            public NodeEx(bool matchNode,TreeListNode node)
            {
                _matchNode = matchNode;
                _id = (int)node.GetValue("ID");
                _Name = node.GetValue("NAME").ToString();
            }
        }
        class Compare:IEqualityComparer<NodeEx>
        {
            public bool Equals(NodeEx x,NodeEx y)
            {
                return x.ID == y.ID;
            }
            public int GetHashCode(NodeEx obj)
            {
                return obj.ID.GetHashCode();
            }
        }

        继续实现递归查找方法,以及节点展开事件、节点收缩事件、节点绘制事件

     public partial class Form1 : Form
        {
            private List<NodeEx> listResult = new List<NodeEx>();//查询结果list
            private List<NodeEx> listDisplay = new List<NodeEx>();//绘制事件list
            private string filterText = "";//搜索文本
            public Form1()
            {
                InitializeComponent();
                InitStyle();
            }
            private void InitStyle()
            {
                treeList1.Tag = "DATA";
                treeList1.KeyFieldName = "ID";
                treeList1.ParentFieldName = "PARENTID";
                treeList1.DataSource = Data.InitData();
            }
            private void simpleButton1_Click(object sender, EventArgs e)
            {
                listResult.Clear();
                listDisplay.Clear();
                filterText = textEdit1.Text;
                if (string.IsNullOrWhiteSpace(filterText))
                {
                    treeList1.Refresh();
                    return;
                }
                SearchNodes(treeList1.Nodes);
                listDisplay.AddRange(listResult);
                listDisplay = listDisplay.Distinct(new Compare()).ToList();
                treeList1.Refresh();
            }
            private void SearchNodes(TreeListNodes nodes)
            {
                foreach (TreeListNode node in nodes)
                {
                    HighLightNodes(node);
                    // 如果当前节点下还包括子节点,就调用递归
                    if (node.Nodes.Count > 0)
                    {
                        SearchNodes(node.Nodes);
                    }
                }
            }
            private void HighLightNodes(TreeListNode node)
            {
                string nodeName = node.GetValue("NAME").ToString();
                if (nodeName.Contains(filterText.ToUpper()) || nodeName.Contains(filterText.ToLower()))
                {
                    NodeEx nodeEx = new NodeEx(true, node);
                    nodeEx.DisPlay = true;
                    listResult.Add(nodeEx);
                    SearchParentNode(node);
                }
            }
            /// <summary>
            /// 寻找父节点 是否应该以颜色标注
            /// </summary>
            /// <param name="node"></param>
            private void SearchParentNode(TreeListNode node)
            {
                if (node.ParentNode != null)
                {
                    var rs = listResult.Where(x => x.ID == (int)node.ParentNode.GetValue("ID")).FirstOrDefault();
                    //如果没有查找到,则加入list 确认是否需要颜色标注
                    //如果查找到,则不需做处理
                    if (rs == null)
                    {
                        NodeEx nodeEx = new NodeEx(false, node.ParentNode);
                        if (node.ParentNode.Expanded)
                        {
                            nodeEx.DisPlay = false;
                        }
                        else
                        {
                            nodeEx.DisPlay = true;
                        }
                        listDisplay.Add(nodeEx);
                        SearchParentNode(node.ParentNode);
                    }
                }
            }
            private void treeList1_AfterExpand(object sender, NodeEventArgs e)
            {
                var rs = listDisplay.Where(x => x.ID == (int)e.Node.GetValue("ID")).FirstOrDefault();
                if (rs != null)
                {
                    if (!rs.MatchNode)
                    {
                        rs.DisPlay = false;
                    }
                    treeList1.RefreshNode(e.Node);
                }         
            }
            private void treeList1_AfterCollapse(object sender, NodeEventArgs e)
            {
                var rs = listDisplay.Where(x => x.ID == (int)e.Node.GetValue("ID")).FirstOrDefault();
                if (rs != null)
                {
                    if (!rs.MatchNode)
                    {
                        rs.DisPlay = true;
                    }
                    treeList1.RefreshNode(e.Node);
                }
            }
            private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
            {
                var lists = listDisplay.Where(x => x.DisPlay == true).ToList();
                foreach (var nodeEx in lists)
                {
                    if ((int)e.Node.GetValue("ID")==nodeEx.ID)
                    {
                        e.Appearance.BackColor = Color.Yellow;
                    }
                }
            }
        }

     最后上实现的效果

     

    展开全文
  • 1、先简单介绍下word07版本以后的存储格式,word 07版本以后主要是以xml格式存储。如果想查看详情可将后缀名改为zip,再查看压缩文件可查看到各种文件,其中document.xml就是word主要展现给我们大家所看到的内容。2....


    1、先简单介绍下word07版本以后的存储格式,word 07版本以后主要是以xml格式存储。如果想查看详情可将后缀名改为zip,再查看压缩文件可查看到各种文件,其中document.xml就是word主要展现给我们大家所看到的内容。

    2.根据第一步的描述,我查看了document.xml,如果有图片,xml文件里会有w:drawing节点。解题思路就从这里来,把这个节点去掉,再替换成为一个文本节点。

    3.查看document.xml时我们会发现每个文本内容都是在w:t节点下的,但文本内容并不是w:t节点下的值,而是w:t节点下还隐藏了一个#:text节点,文本内容是装在#:text节点下的,#:text节点在document.xml并查看不到,就是这花了我比较多的时间。

    详细代码:

    XWPFDocument document// docx word文档的document

    Node node = document.getDocument().getDomNode();//得到文档跟节点,这里的节点大概跟document.xml看到的是一致的
    Node wcNode = Poi4WordUtil.getWtNode(node);//获取文档的一个w:t节点供后续拷贝

    this.setNodeData(node, wcNode, ssId, instId, dataDate);


    /**
    * 把图片节点换成文本节点

    * @param node
    * @param wcNode

    */
    private void setNodeData(Node node, Node wcNode) {
    if ("w:drawing".endsWith(node.getNodeName())) {
    Node parentNode = node.getParentNode();

    Node cloneNode = wcNode.cloneNode(true);//一个wt节点,它含包含一个#:text节点,将#:text节点的值替换为自己想要的值
    Node child = cloneNode.getFirstChild();
    String descr = Poi4WordUtil.getPicDescr(node);//获取图片可选文字的内容

    child.setNodeValue(“要设置的值”);

    parentNode.replaceChild(cloneNode, node);
    }
    if (node.hasChildNodes()) {
    NodeList temp = node.getChildNodes();
    for (int i = 0; i < temp.getLength(); i++) {
    setNodeData(temp.item(i), wcNode,);
    }
    }
    }


    /**
    * 获取word文档中其中的一个w:c节点,方便根据需要替换节点时作copy使用

    * @param node
    * @return
    */
    public static Node getWtNode(Node node) {
    if ("w:t".equals(node.getNodeName())) {
    return node;
    } else {
    if (node.hasChildNodes()) {
    NodeList temp = node.getChildNodes();
    Node wcNode = null;
    for (int i = 0; i < temp.getLength(); i++) {
    wcNode = getWtNode(temp.item(i));
    if (wcNode != null)
    break;
    }
    return wcNode;
    }
    return null;
    }
    }

    /**
    * 获取word文档里图片里可选文字的内容,传入的节点为w:drawing节点

    * @param node
    * @return
    */
    public static String getPicDescr(Node node) {
    NodeList childNodes = node.getFirstChild().getChildNodes();
    for (int i = 0; i < childNodes.getLength(); i++) {
    Node item = childNodes.item(i);
    if ("wp:docPr".equals(item.getNodeName())) {
    NamedNodeMap attributes = item.getAttributes();
    return attributes.getNamedItem("descr").getNodeValue();
    }
    }
    return null;
    }



    展开全文
  • Word中流程

    千次阅读 2012-05-15 01:45:35
    第一种流程制作  此流程是最基本的流程,也是我们平常用到最多的一种。(如下)  制作步骤开始:  1、单击“绘图”工具栏上的“自选图形”,然后选择“流程”,这里就可以看到众多制作...
     第一种流程图制作

      此流程图是最基本的流程图,也是我们平常用到最多的一种。(如下图)

    基本形流程图

      制作步骤开始:

      1、单击“绘图”工具栏上的“自选图形”,然后选择“流程图”,这里就可以看到众多制作流程图时所用到的形状了,大家可以选择自己喜欢的的形状;

    流程图过程

      2、单击要绘制流程图的位置,此时会出现个虚框;(如下图)

    创建图形虚框

      3、在绘图画布上插入你选择的图形,然后插入,(如下图);

    插入图形

      4、此时,我们再重复上述步骤,插入多种不同的图形,(如下图,我已经插入了很多种不同的图形);

    已经插入多个图形

      5、接下来,要做什么呢?既然是流程图,自然是要建立各种图形之间的连接了。这里我们使用Word提供的一个非常好用的自选图形——连接符来建立连接。 什么是连接符?你希望使用线条来连接形状并保持它们之间的连接吗?这就是连接符的作用。连接符看起来像线条,但是它将始终与其附加到的形状相连。也就是说,无论你怎样拖动各种形状,只要它们是以连接符相连的,就会始终连在一起;

      在Word提供了三种线型的连接符用于连接对象:直线、肘形线(带角度)和曲线;

    插入连接符

      选择连接符自选图形后,将鼠标指针移动到对象上时,会在其上显示蓝色连接符位置,这些点表示可以附加连接符线的位置;

    附加连接符线

      6、我们首先用带箭头的肘形线连接符和直线连接符将图形连接到一起,如图;

    连接图形

      7、这时发现你需要将最下面的矩形向下挪动一点,因此你拖动了这个矩形。发现了吗?连接符在随着矩形的拖动而有了变化。是的,它始终没有离开矩形;

    移动调整图形

      8、当然,你也可能发现有一条连接符连接错了地方,需要调整一下。该怎么做呢?你需要先解除连接符的锁定。具体操作方法是:
      (1)移动连接符的任一端点(对,就是那个红色的端点),则该端点将解除锁定或从对象中分离;

    解除锁定和分离

      (2)然后可以将其锁定到同一对象上的其他连接位置;

    锁定图形流程图

      9、接下来,我们需要在图形中添加文字。用鼠标右键单击形状,单击“添加文字”并开始键入。可以使用文档的排版工具对文字进行居中、字体、颜色等属性修改;

      需要注意的是,在Word中不能向线段或连接符上添加文字,但可以使用文本框可在这些绘图对象附近或上方放置文字。下图为流程图的范例。其中的画布颜色、线条的颜色都可以通过绘图工具栏修改;

    修改颜色及样式

      10、如上面的步骤,我们已经很快的画好了一个流程图。但是,您可能会希望调整一下整个流程图的位置,该如何操作呢?

    调整流程图位置

      首先用鼠标选取需要移动的图形组。如图所示的虚框部分,就是鼠标选取的区域;

    选取图形

      11、注意到了吗?被选取的图形的所有节点都很清楚地显示了出来;

    显示节点

      12、此时,您可以用鼠标移动这个区域。就可以轻松的将整个需要移动的图形组一次性的移动了。需要注意的是,必须确定鼠标为四向箭头时才能拖动;

    流程图制作完毕

      好了,到这里Word制作基本的流程图就讲完了,接下来再来演示下制作三维流程图的方法;


    第二种流程图制作

      三维流程图制作,此种流程图看起来比较精美华丽,制作起来也比上面那中要复杂得多。

    三维流程图

      步骤一: 页面和段落的设置

      为了流程图有较大的绘制空间,我们先来设置一下页面。

      1、启动Word,打开一个空白文档,并切换到页面视图。选择菜单“文件→页面设置”命令,打开“页面设置”对话框,在“页边距”选项卡中,设置上下边距为“1厘米”,左右边距为“2厘米”,完成后单击“确定”按钮;

    设置页面大小

      2、由于后面要在自选图形中输入文字,为了让输入的文字在垂直方向上看起来居中,这里顺便设置一下段前距。选择菜单“格式→段落”命令,打开“段落”对话框,在“缩进和间距”选项卡中设置段前间距为“1行”,完成后单击“确定”;

    段前设置

      步骤二:制作流程图的标题

      基本工作环境设置好之后就开始制作流程图的标题。大家看到的最终效果中的标题是放在一个矩形自选图形中的,下面开始制作。

      1、在窗口Word窗口底部的自选图形工具栏中选择“矩形”按钮;

    选择矩形

      2、这时可以在页面中看到“在此创建图形”的画布,接着拖动鼠标,在该画布中绘制矩形,让矩形的宽度与画布相同,高度可参照最终效果图,约3厘米;

      3、画好后调整画布的高度,使之与矩形的高度相同(图 5);

    画布高度调整

      4、接下来选中插入的矩形,单击鼠右键,在弹出的菜单中选择“设置自选图形格式”命令,打开“设置自选图形格式”对话框,在“颜色与线条”选项卡中,先设置线条颜色为“无线条颜色”,接着单击“填充”区“颜色”下拉箭头,选择“其它颜色”命令,打开“颜色”对话框,参照下图设置填充颜色,完成后依次单击两次“确定”;

    选择索要的颜色

      5、接下来在矩形框中插入艺术字标题。选中矩形框,单击鼠标右键,在弹出的菜单中选择“添加文字”命令,这时可以看到光标在矩形框内闪动,表示等待添加文字;

      6、选择底部“绘图”工具栏上的“插入艺术字”按钮(图 7),打开“艺术字库”对话框。选择第二行第二种艺术字,单击“确定”;

    选择插入艺术字

      7、在打开的“编辑‘艺术字’文字”对话框中,按下图输入文字和设置字体格式(图 9),完成后单击“确定”,返回Word编辑窗口,艺术字被加入到矩形框中;

    制作流程图标题

      8、接下来回车换行,输入“毕业论文写作流程图”文字,并将其字体设置为“宋体”、“小二”、“加粗”,对齐方式为“右对齐”,到这里为止标题就制作完成了;

    步骤三:绘制流程图框架

      接下来我们开始绘制流程图的框架。所谓框架就是画出图形、把图形大致布局并在其中输入文字。在这里大家可以体会到,如果已经作好了草图,这里的操作将是比较轻松的,如果在这里边想边画,可能会耽搁很多时间。

      1、单击窗口底部工具栏上的“自选图形”按钮,在弹出的菜单中选择“流程图”,接着选择“流程图”中的“准备”图形;

    插入流程图准形

      2、这时,在页面中标题的下方也会出现一个“在此创建图形”的画布,拖动鼠标,在画布的恰当位置画出“准备”图形;

      3、选中“准备”图形,单击鼠标“右键”,在弹出的菜单中选择“添加文字”命令,接着在其中输入文字“开始”;

      4、如果觉得“开始”文字的位置过于靠近底部,则可以适当调整它的段前距为“0.5”行;

    调整段前距

      5、然后设置其对齐方式为“居中对齐”,完成后的效果如下图;

    居中对齐

      6、接下来先拖动“画布”右下角控制点,使其扩大面积到页面底部边缘,以便能容纳流程图的其它图形;

      7、用同样的方法,绘制其它图形,并在其中输入相应的文字,完成后效果如下图;

    重复制作多个图形

      由于的框架的制作都是手工的,因此在对齐上可能不太准确,下面使用对齐命令精确对齐,同时我们将对图形作一些修饰,让它们有更漂亮的外观。

      1、按住Shift,同时选中左边一列的所有图形,单击窗口底部“绘图”工具栏上的“绘图”按钮,依次选择“对齐或分布→水平居中”命令,将所有选中的图形“水平居中”对齐;

    对齐或分布→水平居中

      2、同样的,同时选择“正式论文”和“打印上交”图形,执行“对齐或分布→垂直居中”命令,让它们“垂直居中”对齐;

      3、为了文字看起来更醒目,可以设置每个图形内的文字为“粗体”;

      4、接下来为图形设置三维效果。按住Shift键,同时选中所有的图形,单击底部“绘图”工具栏上的“三维效果样式”按钮,在弹出的列表中“三维样式1”,可以看到所有的图形被应用了三维效果样式;

    选择三维样式

      5、在所有图形保持被选中的状态下,再次单击“三维效果样式”按钮,选择“三维设置”命令,打开“三维设置”工具栏,按下图设置其“深度”为“12磅”。完成后三维效果的厚度看起来更薄,更自然;

    三维设置

      6、接下来为同种类型的图形设置相同的填充色。比如选中“开始”图形,单击鼠标右键,在弹出的菜单中选择“设置自选图形格式”命令,打开“设置自选图形格式”对话框,在“颜色与线条”选项卡内,按下图设置该图形的填充色;

    设置自选图形格式

      7、用同样的方法为其它图形设置填充色,让流程图的外观看起来更漂亮。

      步骤五:添加连接箭头

      下面的工作是为流程图的各个图形之间添加连接箭头。连接箭头可以让阅读者更准确快速地把握工作流程的走向。在绘制箭头之间,为了能够让绘出的箭头完全水平或者垂直,一定要在前面利用“对齐或分布”的“水平对齐”或者“垂直对齐”命令对图形进行过对齐。如果前面没有对齐过,则可以在绘制之间将相应图形“水平对齐”或“垂直对齐”。下面进入添加连接箭头的操作。

      1、选择窗口底部的“自选图形”按钮,在弹出的列表依次选择“连接符→直箭头连接符”; 

    选择连接符→直箭头

      2、接着在两个需要添加连接符的图形之间拖动鼠标,当鼠标移动到图形对象上时,图形会显示蓝色的连接点,这些点表示可以附加连接符。将鼠标在两个图形的下方连接点和上方连接点之间拖动即可将两个图形连接在一起;

    将图形连接

      步骤六:添加折线连接符和说明性文字

      接下来我们要添加三个折线(肘形)连接符。

      1、选择窗口底部的“自选图形”按钮,在弹出的列表依次选择“连接符→肘形箭头连接符”;

    选择连接符→肘形箭头

      2、先在“与指导教师讨论”图形左侧的连接点点一下,接着向左侧拖动鼠标,然后向上再往右,在“毕业论文选题”图形左侧的连接点上点一下即可。完成后可以看到连接线上有一个黄色的小点,利用鼠标拖动这个小点可以调整肘形线的幅度;

    调整肘形线的幅度

      3、接下来,在这个小黄点处画一个矩形框,在其中添加文字“未通过”,同时设置该矩形框的线条颜色为“无线条颜色”,即不显示边框;

    设置不显示边框

      4、设置完成后效果如下图;

    三维流程图制作完成

      5、其它肘形线和说明文字的添加完全一样,可以仿照操作。

      到这里本章用Word制作流程图就已经全部讲完了,看看你做的,是否和我们做的一样呢?认真的学习制作本次讲解的两个流程图,自己多练习下,相信以后无论是什么样的流程图,都不会难倒你了。虽说现在制作流程图的软件网上一大把,但任何事情还是不要太依赖,多动手,也可以锻炼自己的制作能力。

    展开全文
  • python word 公式转png图片处理方式

    千次阅读 2018-12-17 21:33:09
    因项目中需要导入word文档,但其中存在的公式,系统不支持,但又需要导入进系统,之前都是手动截图后再重新插进去,关键时候上千章试卷要进行截图也很耗时间,所以研究了一下转换方式 首先通过将docx后缀改成zip...

          因项目中需要导入word文档,但其中存在的公式,系统不支持,但又需要导入进系统,之前都是手动截图后再重新插进去,关键时候上千章试卷要进行截图也很耗时间,所以研究了一下转换方式

     

          首先通过将docx后缀改成zip解压后可以发现,公式分成两部分,一部分是.wmf的矢量图文件,一个是objectbin文件,但实际通过画图打开矢量图后发现公式已经可以完整显示出来了,那需要解决的关键部分就是.wmf转.png文件就行了。最开始采用了java来做,但发现通过wmf转svg再转png,一些符号会显示错误,例如微积分符号,可能和格式或者转换方式有关,故放弃。偶然间通过画图将矢量图wmf另存为png时发现所有符号都是显示正确的,那么C#中肯定存在可以完成转换的方式,果然,翻阅一些资料后发现wmf可以通过图元文件写入位图,最后再将图像信息存入文件中就可以很方便的完成转换了,代码如下:

                 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Xml;
    
    namespace Project1
    {
        class Class2
        {
            static void Main(string[] args)
             {
                 String FileName = args[0];
                 using (System.Drawing.Imaging.Metafile img = new System.Drawing.Imaging.Metafile(FileName))
                 {
                     System.Drawing.Imaging.MetafileHeader header = img.GetMetafileHeader();
                     float scale = header.DpiX / 96f;
                     using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)(scale * img.Width / header.DpiX * 100), (int)(scale * img.Height / header.DpiY * 100)))
                     {
                         using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
                         {
                             g.Clear(System.Drawing.Color.White);
                             g.ScaleTransform(scale, scale);
                             g.DrawImage(img, 0, 0);
                         }
                         bitmap.Save(@args[1], System.Drawing.Imaging.ImageFormat.Png);
                     }
                 }
                 Console.WriteLine("转换完成");
             }
        }
    }
    

       然后通过pydocx进行读取后发现公式这部分是存储在run中的,那接下来只需要提取原图片进行转换后再插回去就可以了

     首先是通过遍历run中的xml节点,遍历函数如下,通过run.element可以获取run的xml节点,之后通过遍历函数进行遍历,公式是存储在

    节点tag "{urn:schemas-microsoft-com:vml}imagedata"中,之后通过提取属性{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id来获得对应的资源id,然后通过资源id在

    document.part.rels[资源id]中提取对应的资源,如果contenttype为image/x-wmf则进行转换,之后将run清空后(run.clear)通过run.add_picture插入转换后图片即可,这种转换可以最大程度的保留结构,避免丢东西

    def iter_block_items(parent):
        """
          遍历节点
        """
        #document为主节点
        if type(parent)==document.DocumentPart:
            parent_elm = parent.element.body
        else:
            parent_elm=parent
    
        for child in parent_elm.iterchildren():
            #print(type(child))
            yield child
            for child2 in iter_block_items(child):
                yield child2
    

    后记:

    1.目前仅docx,doc文件需强行转换为docx后在进行处理

    2.关于图片大小,目前可以通过两种方式进行

      1)通过提取"{urn:schemas-microsoft-com:vml}shape"的内容,大致格式为

    """'height:13.95pt;width:42.95pt;'""",提取对应的pt长度,换算为Inches需要除以72

      2)可能存在第一种方法没有获取到长度的,则需要通过Image.open打开图片获取图片像素大小

    在转化为Inches即可(大致为width or height/缩放比率*72,缩放比率不太好找,需要自己摸索,大致上用37的花,目前见过的公式都转出来偏小一点)

    3.新版本word公式不再是图片的不支持

     

     

    展开全文
  • word中绘制流程

    2012-11-16 09:42:19
    Word自带的流程绘图工具来绘制流程。但是,Word的早期版本,即使是Word2000在流程的绘制,尤其是修改方面都是非常麻烦的。我们常常需要在线条的对准等细节问题上耗费大量的时间。幸运的是,新推出的Office XP...
  • php解析word,获得文档中的图片

    千次阅读 2018-07-09 15:14:14
    前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中。因为文档中存在公式,图片,表格等,因此写的比较麻烦。   思路 大体思路是先将word中格式为doc的文档转化为docx,用预处理程序将文档中...
  • Word Embedding

    2018-09-22 16:38:59
    同样是在上一篇博客中我所提到的最近在看的论文使用的模型中,初次接触Word Embedding。就是下面这个模型(Figure 3),让我一个小白被迫的主动学习了超多基础知识,当然,我在拿着这篇论文去给老师讲的时候脑子并...
  • 一、word2vec 在自然语言处理中,词向量是一种常见的词分布式表示。词表中的每个单词均由一个维度固定的连续向量表示。word2vec是2013年Google公布的训练词向量的工具,其包含了两个模型,分别是:CBOW和SkipGram。...
  • Word Ladder II

    千次阅读 2015-01-12 09:44:07
    Word Ladder II
  • 谈谈谷歌word2vec的原理

    万次阅读 2017-08-10 20:14:41
    word2vec在NLP领域中,为了能表示人类的语言符号,一般会把这些符号转成一种数学向量形式以方便处理,我们把语言单词嵌入到向量空间中就叫词嵌入(word embedding)。谷歌开源的word2vec则是这么一种词嵌入工具,它...
  • Word Ladder

    千次阅读 2015-01-10 20:40:03
    Word Ladder
  • word操作总结

    2018-02-06 11:41:14
    在公司工程中,有好多需求需要用到导出word文件,走过好多路,最早用的csdn上一个vb写的库导出word,完成当时一个紧迫项目 后来继续研究报表时,用了qt的com组件调用库,来调用微软的office组件进行报表导...
  • Word Ladder Ⅰ ** Problem Given two words (start and end), and a dictionary, find the length ofshortest transformation sequence from start to end, such that: Only one letter can be changed at...
  • word 内嵌自动编号

    千次阅读 2016-09-13 20:52:58
    word中,各种列表编号、图表序号、样式格式等等问题,我已经在 word常规模板设置 中做了比较详细的叙述。博客中我讲解了如何从零开始规范得构建一个word模板,规范的使用方式可以使word作为办公软件的效率大大提升。...
  • 关于NLP中,有各种不同的表达,如:词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系? 希望写完这篇文章后,自己能清楚地...
  • Word2Vec深入浅出

    2020-07-07 12:22:20
    Word2Vec深入浅出word2vec简介one-hot编码skip-gram模型CBOW模型Hierarchical SoftMaxNegative Samplingskip-gram在神经网络上的训练流程模型细节以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2...
  • 为什么要做 word embedding

    千次阅读 2017-12-18 11:23:44
    该篇主要是讨论为什么要做word embedding:gitbook阅读:Word Embedding介绍至于word embedding的详细训练方法在下一节描述。目录单词表达One hot representationDistributed representationWord embedding目的数据量...
  • 卷积 节点分类This article goes through the implementation of Graph Convolution Networks (GCN) using Spektral API, which is a Python library for graph deep learning based on Tensorflow 2. We are ...
  • 引子大家好我叫数据挖掘机皇家布鲁斯特大学肄业我喝最烈的果粒橙,钻最深的牛角尖——执着如我今天我要揭开Word2vec的神秘面纱直窥其本质相信我,这绝对是你看到的最浅白易懂的 Word2vec 中文总结(蛤?你问我为啥...
  • word2vec理论与实践

    2019-03-08 13:28:05
    本文简单的介绍了Google 于 2013 年开源推出的一个用于获取 word vector 的工具包(word2vec),并且简单的介绍了其中的两个训练模型(Skip-gram,CBOW),以及两种加速的方法(Hierarchical Softmax,Negative ...
  • 再谈word2vec

    万次阅读 2014-05-28 17:17:39
    之前写过一篇博文介绍如何使用word2vec,最近老板让我讲一讲word2vec,显然光讲word2vec的使用是不够的,更重要的是介绍原理。 背景介绍 Word2vec是google在2013年开源的一款将词表征为实数值向量的高效工具,一般...
  • word2vec代码注释

    2015-08-10 20:29:09
    虽然word2vec火了很久了,但自己一直拖延了没去看,借实验室组会讨论的机会花一天时间阅读了和word2vec相关的一点东西,算是先知后觉。   邓澍军老师的中文教程很不错,顺着里面的文献一路看下去就能了解个...
  • docx4j 处理word2007文档

    千次阅读 2017-05-12 15:16:12
    docx4j 处理word2007文档 一、处理word的第3方java项目 Word2007采用ECMA-376标准,在java开发中,处理word文档有很多优秀的... 网上例子很多,由于发布时间较早,很多外国网站的例子,建议Google搜索。 2)Jacob
  • 在本教程我们来看一下Mikolov et al中提到的word2vec模型。该模型是用于学习文字的向量表示,称之为“word embedding”。 亮点 本教程意在展现出在TensorfLow中构建word2vec模型有趣、本质的部分。 我们从我们...
  • Word Ladder题目大意给定一个起始字符串和一个目标字符串,现在将起始字符串按照特定的变换规则转换为目标字符串,求最少要进行多少次转换。转换规则为每次只能改变字符串中的一个字符,且每次转换后的字符串都要在...
  • 之前学习word2vec时,遇到一篇很棒的详解word2vec前因后果的文章,但是由于没有自己动手造它的代码,所以时间长了就容易忘记,再加之每次看到一些相关的文章就总想去看去收藏,所以觉得需要自己好好捋一捋,以后遇到...
  • Embedding Nodes ...也就是说,我们希望embedding之后的node vector点乘之后的值(可以理解为未归一化的cosine)接近于原graph中的节点相似度,原的相似度可以采用是否节点相连,是否有相同的邻居节点
  • Word2Vec详解-公式推导以及代码

    千次阅读 多人点赞 2019-08-20 13:59:15
    这里写自定义目录标题Word2Vec详解Word2Vec_pythoncbow-hsskip-hscbow-nsskip-nsdistance Word2Vec详解 Word2Vec_python cbow-hs skip-hs cbow-ns skip-ns distance Word2Vec_python The Englist...
  • 为了节省看无用资料的时间,就整理了一个笔记,希望能帮助各位尽快理word2vec的基本原理,避免浪费时间。一 、CBOW 加层次的网络结构与使用说明 Word2vec 总共有两种类型, 每种类型有两个策略, 总共 4 种。 这里...
  • // 第一个图表-条形 POIXMLDocumentPart poixmlDocumentPart0 = chartsMap.get("/word/charts/chart1.xml"); new PoiWordTools().replaceBarCharts(poixmlDocumentPart0, titleArr, fldNameArr, listItemsByType)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,166
精华内容 14,466
关键字:

word时间节点图