POI 操作word

2023-11-13

关于POI 操作word的基础知识在这个博客(http://elim.iteye.com/blog/2049110)中有非常清晰的解释,在这里我就不多解释了
本文研究的内容就是
XWPFParagraph:代表一个段落

XWPFRun:代表具有相同属性的一段文本

大家都知道在设计模式中有个构造器模式,用于那些拥有很多属性但是有些属性可选设置的对象的生成。笔者觉得段落和文本的构建能很好运用此种模式。

首先是段落构建器

    //段落构建器
    public class XWPFParagraphBuilder {
		//常量,在文档中定义长度和高度的单位
        private static final int PER_LINE = 100;
        //每个字符的单位长度
        private static final int PER_CHART = 100;
        //1厘米≈567
        private static final int PER_CM = 567;
        //每一磅的单位长度
        private static final int PER_POUND = 20;
        //行距单位长度
        private static final int ONE_LINE = 240;

        private XWPFParagraph paragraph = null;
        private CTPPr pPr = null;
        //保存通用段落属性引用,方便复用
        private Map<String, CTPPr> savedPPr = null;
        //设定间距的对象
        private CTSpacing pSpacing = null;
        //设定缩进的对象
        private CTInd pInd = null;


        public XWPFParagraphBuilder init(XWPFDocument document) {
            return init(document.createParagraph());
        }

        public XWPFParagraphBuilder init(XWPFParagraph paragraph) {
            if (paragraph == null) {
                throw new IllegalArgumentException("the paragraph should not be null");
            }
            this.paragraph = paragraph;
            pPr = getPrOfParagraph(paragraph);
            return this;
        }

        //设置段落对齐方式
        public XWPFParagraphBuilder align(ParagraphAlignment pAlign, TextAlignment vAlign) {
            ensureInit();
            if (pAlign != null) {
                paragraph.setAlignment(pAlign);
            }
            if (vAlign != null) {
                paragraph.setVerticalAlignment(vAlign);
            }
            return this;
        }

        //初始化段落间距属性,在设置各段落间距前调用
        public XWPFParagraphBuilder initSpacing() {
            ensureInit();
            pSpacing = pPr.getSpacing() != null ? pPr.getSpacing() : pPr.addNewSpacing();
            return this;
        }

        //设置段前和段后间距,以磅为单位
        public XWPFParagraphBuilder spaceInPound(double before, double after) {
            ensureInit();
            if (pSpacing == null) {
                initSpacing();
            }
            pSpacing.setBefore(BigInteger.valueOf((long) (before * PER_POUND)));
            pSpacing.setAfter(BigInteger.valueOf((long) (after * PER_POUND)));
            return this;
        }

        //设置段前和段后间距,以行为单位
        public XWPFParagraphBuilder spaceInLine(double beforeLines, double afterLines) {
            ensureInit();
            if (pSpacing == null) {
                initSpacing();
            }
            pSpacing.setBeforeLines(BigInteger.valueOf((long) (beforeLines * PER_LINE)));
            pSpacing.setAfterLines(BigInteger.valueOf((long) (afterLines * PER_LINE)));
            return this;
        }

        //设置段落行距
        public XWPFParagraphBuilder lineSpace(double value, STLineSpacingRule.Enum spaceRule) {
            ensureInit();
            if (pSpacing == null) {
                initSpacing();
            }
            int unit;
            if (spaceRule == null) {
                spaceRule = STLineSpacingRule.AUTO;
            }
            if (spaceRule.intValue() == STLineSpacingRule.INT_AUTO) {
                //当行距规则为多倍行距时,单位为行,且最小为0.06行
                unit = ONE_LINE;
                if (value < 0.06) {
                    value = 0.06;
                }
            } else {
                //当行距规则为固定值或最小值时,单位为磅,且最小为0.7磅
                unit = PER_POUND;
                if (value < 0.7) {
                    value = 0.7;
                }
            }
            pSpacing.setLine(BigInteger.valueOf((long) (value * unit)));
            pSpacing.setLineRule(spaceRule);
            return this;
        }

        public XWPFParagraphBuilder initInd() {
            ensureInit();
            pInd = pPr.getInd() != null ? pPr.getInd() : pPr.addNewInd();
            return this;
        }

        //设置段落缩进,以厘米为单位; 悬挂缩进高于首行缩进;右侧缩进高于左侧缩进
        public XWPFParagraphBuilder indentInCM(double firstLine, double hanging, double right, double left) {
            ensureInit();
            if (pInd == null) {
                initInd();
            }
            if (firstLine != 0) {
                pInd.setFirstLine(BigInteger.valueOf((long) (firstLine * PER_CM)));
            }
            if (hanging != 0) {
                pInd.setHanging(BigInteger.valueOf((long) (hanging * PER_CM)));
            }
            if (right != 0) {
                pInd.setRight(BigInteger.valueOf((long) (right * PER_CM)));
            }
            if (left != 0) {
                pInd.setLeft(BigInteger.valueOf((long) (left * PER_CM)));
            }
            return this;
        }

        //设置段落缩进,以字符为单位; 悬挂缩进高于首行缩进;右侧缩进高于左侧缩进
        public XWPFParagraphBuilder indentInChart(int firstLine, int hanging, int left, int right) {
            ensureInit();
            if (pInd == null) {
                initInd();
            }
            if (firstLine != 0) {
                pInd.setFirstLineChars(BigInteger.valueOf((long) (firstLine * PER_CHART)));
            }
            if (hanging != 0) {
                pInd.setHangingChars(BigInteger.valueOf((long) (hanging * PER_CHART)));
            }
            if (right != 0) {
                pInd.setRightChars(BigInteger.valueOf((long) (right * PER_CHART)));
            }
            if (left != 0) {
                pInd.setLeftChars(BigInteger.valueOf((long) (left * PER_CHART)));
            }
            return this;
        }

        public XWPFParagraphBuilder savePr(String pPrName) {
            ensureInit();
            if (savedPPr == null) {
                savedPPr = new HashedMap<String, CTPPr>();
            }

            savedPPr.put(pPrName, pPr);

            return this;
        }

        public XWPFParagraphBuilder samePrOf(String pPrName) {
            ensureInit();

            if (savedPPr != null && savedPPr.containsKey(pPrName)) {
                return samePrOf(savedPPr.get(pPrName));
            }

            return this;
        }

        public XWPFParagraphBuilder samePrOf(CTPPr pPr) {
            ensureInit();
            if (pPr != null) {
                paragraph.getCTP().setPPr(pPr);
            }
            return this;
        }

        public XWPFParagraphBuilder samePrOf(XWPFParagraph otherPra) {
            ensureInit();
            paragraph.getCTP().setPPr(getPrOfParagraph(otherPra));
            return this;
        }

        public XWPFParagraph build() {
            return paragraph;
        }

        //确保init方法是第一个调用的,避免出现空指针异常
        private void ensureInit() {
            if (this.paragraph == null) {
                throw new IllegalStateException("the init method must be invoked firstly");
            }
        }
    }

构建器的优点在于能够链式调用
示例:

        //新增一个段前2倍行距段后3倍行距,文本2倍行距的段落
        XWPFParagraph firstPar = paragraphBuilder.init(document).initSpacing().spaceInLine(2, 3)
                    .lineSpace(2, null).build();

如果有一段段落的属性与之前段落相同,你可以在链尾调用savePr(String pPrName),来为保存该属性,并制定名称,当有其他段落要用到次属性时就可以在调用samePrOf(String pPrName)来设定属性避免重复操作。

其中有一点需要注意的是:init方法一定是第一个调用的,不然会出现空指针异常

接下来是文本构建器(思想与段落相同)

	//文本构建器
    public class XWPFRunBuilder {
        private XWPFRun run = null;
        private Map<String, CTRPr> savedRPr;

        public XWPFRunBuilder init(XWPFParagraph paragraph) {
            return init(paragraph, false);
        }

        public XWPFRunBuilder init(XWPFParagraph paragraph, boolean newLine) {
            this.run = paragraph.createRun();
            if (newLine) {
                run.addBreak();
            }
            return this;
        }

        /**
         * insert a new Run in RunArray
         *
         * @param pos The position at which the new run should be added.
         */
        public XWPFRunBuilder init(XWPFParagraph paragraph, int pos) {
            this.run = paragraph.insertNewRun(pos);
            if (this.run == null) {
                return init(paragraph, false);
            }
            return this;
        }

        public XWPFRunBuilder init(XWPFRun run) {
            if (run == null) {
                throw new IllegalArgumentException("the run should not be null");
            }
            this.run = run;
            return this;
        }

        public XWPFRunBuilder content(String content) {
            ensureInit();
            if (StringUtils.isNotBlank(content)) {
                // pRun.setText(content);
                if (content.contains("\n")) {// System.properties("line.separator")
                    String[] lines = content.split("\n");
                    run.setText(lines[0], 0); // set first line into XWPFRun
                    for (int i = 1; i < lines.length; i++) {
                        // add break and insert new text
                        run.addBreak();
                        run.setText(lines[i]);
                    }
                } else {
                    run.setText(content, 0);
                }
            }
            return this;
        }

		//加粗
        public XWPFRunBuilder bold(boolean bold) {
            ensureInit();
            run.setBold(bold);
            return this;
        }

		//斜体
        public XWPFRunBuilder italic(boolean italic) {
            ensureInit();
            run.setItalic(italic);
            return this;
        }

		//删除线
        public XWPFRunBuilder strike(boolean strike) {
            ensureInit();
            run.setStrike(strike);
            return this;
        }
		
		//字体设置,中文字体、英文字体、字号
        public XWPFRunBuilder font(String cnFontFamily, String enFontFamily, String fontSize) {
            ensureInit();
            CTRPr rPr = getPrOfRun(run);
            // 设置字体
            CTFonts fonts = rPr.isSetRFonts() ? rPr.getRFonts() : rPr.addNewRFonts();
            if (StringUtils.isNotBlank(enFontFamily)) {
                fonts.setAscii(enFontFamily);
                fonts.setHAnsi(enFontFamily);
            }
            if (StringUtils.isNotBlank(cnFontFamily)) {
                fonts.setEastAsia(cnFontFamily);
                fonts.setHint(STHint.EAST_ASIA);
            }
            // 设置字体大小
            CTHpsMeasure sz = rPr.isSetSz() ? rPr.getSz() : rPr.addNewSz();
            sz.setVal(new BigInteger(fontSize));

            CTHpsMeasure szCs = rPr.isSetSzCs() ? rPr.getSzCs() : rPr
                    .addNewSzCs();
            szCs.setVal(new BigInteger(fontSize));
            return this;
        }

		//底纹
        public XWPFRunBuilder shade(STShd.Enum shdStyle, String shdColor) {
            ensureInit();
            CTRPr rPr = getPrOfRun(run);
            // 设置底纹
            CTShd shd = rPr.isSetShd() ? rPr.getShd() : rPr.addNewShd();
            if (shdStyle != null) {
                shd.setVal(shdStyle);
            }
            if (shdColor != null) {
                shd.setColor(shdColor);
                shd.setFill(shdColor);
            }
            return this;
        }

        /**
         * @param position 字符垂直方向上间距位置; >0:提升; <0:降低;=磅值*2
         * @return
         */
        public XWPFRunBuilder position(int position) {
            ensureInit();
            if (position != 0) {
                run.setTextPosition(position);
            }
            return this;
        }
		
		//字符间距
        public XWPFRunBuilder space(int spacingValue) {
            ensureInit();
            if (spacingValue > 0) {
                CTRPr rPr = getPrOfRun(run);
                CTSignedTwipsMeasure measure = rPr.isSetSpacing() ? rPr.getSpacing() : rPr.addNewSpacing();
                measure.setVal(new BigInteger(String.valueOf(spacingValue)));
            }
            return this;
        }

        /**
         * @param verticalAlign SUPERSCRIPT:上标;SUBSCRIPT:下标
         * @return
         */
        public XWPFRunBuilder verticalAlign(VerticalAlign verticalAlign) {
            ensureInit();
            if (verticalAlign != null) {
                run.setSubscript(verticalAlign);
            }
            return this;
        }

		//下划线
        public XWPFRunBuilder underLine(STUnderline.Enum underStyle, String underLineColor) {
            ensureInit();
            CTRPr rPr = getPrOfRun(run);
            CTUnderline udLine = rPr.addNewU();
            udLine.setVal(underStyle);
            udLine.setColor(underLineColor);
            return this;
        }

		//高亮
        public XWPFRunBuilder highLight(STHighlightColor.Enum highStyle) {
            ensureInit();
            CTRPr rPr = getPrOfRun(run);
            if (highStyle != null) {
                CTHighlight highLight = rPr.isSetHighlight() ? rPr.getHighlight() : rPr.addNewHighlight();
                highLight.setVal(highStyle);
            }
            return this;
        }

        public XWPFRunBuilder savePr(String rPrName) {
            ensureInit();
            if (savedRPr == null) {
                savedRPr = new HashedMap<String, CTRPr>();
            }
            savedRPr.put(rPrName, getPrOfRun(run));
            return this;
        }

        public XWPFRunBuilder samePrOf(String rPrName) {
            ensureInit();
            if (savedRPr != null && savedRPr.containsKey(rPrName)) {
                return samePrOf(savedRPr.get(rPrName));
            }
            return this;
        }

        public XWPFRunBuilder samePrOf(CTRPr rPr) {
            ensureInit();
            if (rPr != null) {
                run.getCTR().setRPr(rPr);
            }
            return this;
        }

        public XWPFRunBuilder samePrOf(XWPFRun otherRun) {
            ensureInit();
            run.getCTR().setRPr(getPrOfRun(otherRun));
            return this;
        }

        public XWPFRun build() {
            return run;
        }

        private void ensureInit() {
            if (this.run == null) {
                throw new IllegalStateException("the init method must be invoked firstly");
            }
        }
    }

文本构建器大体上与段落构建器类似,基本上能满足大多数操作。

备注:因为只是贴出部分代码,其中有两个工具方法未给出,全部代码在github可以看到(https://github.com/jadezhang123/learning/blob/master/apple/src/main/java/own/jadezhang/learning/apple/utils/WordHolder.java)

以后有时间会研究操作table,这个是重点。加油!
测试结果

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI 操作word 的相关文章

  • 【Java基础】 使用POI解析excel时格式判定问题及解决方案

    写在前面 本文主要介绍在实际开发过程中使用POI工具类去解析Excel格式文件遇到的问题引发的思考 学习以及解决方案 仅供参考 有考虑不周的地方还请指正 问题描述 博主在做excel解析的时候 遇到了一个奇怪的现象 xlsx拓展名的文件使用
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • postMan使用技巧

    使用postMan调试接口 一些接口要实现登录才能访问 即要还token才能访问 一般登录后 拿到token才复制到其他接口下添加token变量 如些复制感觉是挺麻烦的 这时我们可以设置postman的全局变量 操作如下 添加调试环境和全局
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • 开源项目MiniWord .NET Word 操作由Word模板和数据简单、快速生成文件

    MiniWord NET Word 介绍 MiniWord NET Word模板引擎 藉由Word模板和数据简单 快速生成文件 image Getting Started 安装 nuget link https www nuget org
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 仅需三步就可以把代码块完美插入到word中

    还在为在word中呈现代码而烦恼吗 如何在word中插入c 代码 如何在word中插入代码块 如何在word中完美的呈现代码 如何在word中对代码进行排版 来开始表演了 1 打开网站 http word wd1x com 支持c c ja
  • POI实现Word文件转PDF

    需求 采用spire doc生成word文件后 需要加一个预览PDF的功能 可以直接采用POI对docx文件进行转换处理 public static void main String args throws Exception String
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

    代码和效果图 先上能够正常显示页码页脚的Python代码和效果图 之后再解释原理和思路 from docx import Document from docx shared import Pt from docx oxml import O
  • 【已解决】为什么Word文档里有部分内容无法编辑?

    小伙伴们是否遇到过这样的情况 打开Word文档进行编辑 发现部分内容可正常编辑 另外一部分内容却无法编辑 这是怎么回事 又要如何解决呢 出现以上情况 一般是Word文档被设置了 限制保护 使其部分内容被锁定 无法进行修改编辑 我们可以在文档
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 使用Python将Word文档转换为PDF的方法

    摘要 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法 我们将使用python docx和pywin32库来实现这个功能 这些库提供了与Microsoft Word应用程序的交互能力 正文 在现实生活和工作中 我们可

随机推荐

  • Python嵌套字典的遍历

    对于字典 d 1 1 2 2 3 4 44 5 55 6 7 7 1024 8 88 9 9 1 如何获取到 7 1024 中的1024 2 如何获取到所有key为7的value值 方法一 直接输出 d 1 1 2 2 3 4 44 5 5
  • C/C++面试题

    1 指针和引用的区别 答 引用是在C 中引入的 它们之间的区别有 1 非空区别 指针可以为空 而引用不能为空 2 可修改区别 如果指针不是常指针 那么就可以修改指向 而引用不能 3 初始化区别 指针在定义时可以不用初始化 而引用在定义的同时
  • python调用js文件

    python调用js文件生成参数 JS逆向 安装exejs与nodejs 调用js生成参数 JS逆向 我就随便找了一个网站https cloud kingdee com passport auth login 随手输入一个账号密码 抓包后发
  • 正在配置更新请勿关闭计算机怎么办,电脑开机“显示正在配置更新请勿关闭计算机”该怎么办?...

    电脑开机 显示正在配置更新请勿关闭计算机 该怎么办 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 电脑开机 显示正在配置更新请勿关闭计算机 该怎么办 系统打补丁
  • 法兰轴机械加工工艺及夹具设计(说明书+CAD图纸+工序卡)

    一 零件的分析 1 1零件的作用 题目所给定的零件车床输出轴 见图1 其主要作用 一是传递转矩 使车床主轴获得旋转的动力 二是工作过程中经常承受载荷 三是支撑传动零部件 零件上的 80mm孔与动力源 电动机主轴等 配合起定心作用 用10 2
  • 疫情期间谁干谁赚钱的三个小副业,普通人也能干,基本不用你投资

    一切生意的本质 都是低买高卖 只是有时 这个利差来自货物 有时利差来自服务而已 疫情过后 三个生意千万不要干 谁干谁倒闭 天王老子救不了你 还有三个生意 谁干谁发财 一年赚个三五十万 搞点生活费一点毛病都没有 我先说不能碰的行业啊 第一个服
  • Linux进程信号

    目录 信号入门 信号的本质 信号的处理 产生信号 通过终端按键产生信号 调用系统函数向进程发信号 由软件条件产生信号 硬件异常产生信号 阻塞信号 信号其他相关常见概念 信号在内核中的表示 sigset t 信号集操作函数 sigprocma
  • sudo rosdep init 遇到Website may be down问题以及解决方案

    sudo rosdep init 遇到Website may be down问题以及解决方案 1 在终端中输入sudo gedit etc hosts 2 文末添加199 232 28 133 raw githubusercontent c
  • 华为OD机试真题-去除多余空格【2023.Q1】

    题目内容 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标 输入描述 输入为两行字符串 第一行 待去除多余空格的文本 用例保证如果有单引号 则单引号成对出现 且单引号可
  • PPTP/L2TP协议详解以及应用部署

    PPTP L2TP协议讲述以及应用部署 一 基本概念 PPTP PPTP是对端对端协议 PPP 的一种扩展 它采用了PPP所提供的身份验证 压缩与加密机制 PPTP能够随TCP IP协议一道自动进行安装 PPTP与Microsoft端对端加
  • 最好用的兼容多种数据库通用高效的大数据分页功能

    通用权限管理系统底层有一个通用分页查询功能 该功能可实现多种数据库的查询 支持多表关联分页查询 目前是最完善的分页功能实现 下面代码是使用的方法截图 后台代码截图1 后台代码截图2 后台代码截图3 后台代码截图4 后台代码截图5 页面后台代
  • 完整软件研发流程

    软件产品开发流程 下图所示的是一个软件产品开发大体上所需要经历的全部流程 1 启动 在项目启动阶段 主要确定项目的目标及其可行性 我们需要对项目的背景 干系人 解决的问题等等进行了解 并编制项目章程和组建项目团队 包括 产品经理 架构工程师
  • 哈夫曼编码与译码(数据结构课程设计)

    事先声明 哈夫曼编码中的选择函数Select思路借鉴了csdn大佬 非原创 吹一波彩虹屁 大佬真厉害 众所周知 数据结构这门课程是非常非常重要的 无论是找工作还是考研 你都能体会到 数据结构这本书的知识也非常的奇特美妙 希望大家好好学习研究
  • vscode函数跳转环境搭建(C/C++)

    之前读书学习时 代码量比较小 装个C C 插件就可搞定 但面对比较大的工程 只安装这个插件就不起作用了 就需要建立符号链接 1 基础环境C C 插件 C C 插件是来自微软官方的 C C 插件 必备的插件 是代码跳转 自动补全 代码大纲显示
  • 【教程】制作能在ARM板上直接运行的gcc本地编译器

    编译好的程序的下载链接 百度网盘 请输入提取码 提取码 ocmm 概述 通常情况下 我们是在电脑里面开一个Linux虚拟机 在虚拟机里面用交叉编译工具链编译好可执行文件后 将可执行文件拷贝到板子里面运行 也就是说 我们是用电脑上运行的gcc
  • gateway整合sentinel限流不生效排查

    问题 线上的sentinel 在测试压测时候可以正常被限流 但是在正常的流量中 发现被限流的接口很少 我发誓肯定都配置了限流规则 约定 文中的 服务名称以及地址 都被改写了 排查步骤 1 检查相关配置 以及 pom依赖配置 发现Sentin
  • effective java

    第一章 Java开发中通用的方法和准则 建议1 不要在常量和变量中出现易混淆的字母 i l 1 o 0等 建议2 莫让常量蜕变成变量 代码运行工程中不要改变常量值 建议3 三元操作符的类型务必一致 不一致会导致自动类型转换 类型提升int
  • 谷歌云

    本文由 Cloud Ace 云一整理 越来越多的组织正在Cloud Run上构建应用程序 这是一个完全托管的计算平台 可让您在 Google 的基础架构之上运行容器化应用程序 想想 Web 应用程序 实时仪表板 API 微服务 批量数据处理
  • Hibernate学习笔记(三) --- 映射枚举类型

    对于枚举类型 不能通过org hibernate annotations Type注解来简单的映射对应的数据库字段类型 除非自定义类型 对此 Hibernate提供了javax persistence Enumerated注解 该注解的参数
  • POI 操作word

    关于POI 操作word的基础知识在这个博客 http elim iteye com blog 2049110 中有非常清晰的解释 在这里我就不多解释了 本文研究的内容就是 XWPFParagraph 代表一个段落 XWPFRun 代表具有