<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>幸运lxh</title>
  
  <subtitle>生活 工作 远方</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.luckylxh.top/"/>
  <updated>2025-02-06T09:04:31.545Z</updated>
  <id>https://blog.luckylxh.top/</id>
  
  <author>
    <name>枪兵幸运E</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Spring Framework路径遍历漏洞 (CVE-2024-38819)</title>
    <link href="https://blog.luckylxh.top/2025/02/06/Spring-Framework%E8%B7%AF%E5%BE%84%E9%81%8D%E5%8E%86%E6%BC%8F%E6%B4%9E-CVE-2024-38819/"/>
    <id>https://blog.luckylxh.top/2025/02/06/Spring-Framework路径遍历漏洞-CVE-2024-38819/</id>
    <published>2025-02-06T08:48:00.000Z</published>
    <updated>2025-02-06T09:04:31.545Z</updated>
    
    <content type="html"><![CDATA[<h2 id="SpringBoot-2-x-修复-CVE-2024-38819"><a href="#SpringBoot-2-x-修复-CVE-2024-38819" class="headerlink" title="SpringBoot 2.x 修复 CVE-2024-38819"></a>SpringBoot 2.x 修复 CVE-2024-38819</h2><h3 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h3><p>SpringBoot 2.x 最后一个开源版本 Spring Framework = 5.3.39 ,这个版本存在CVE-2024-38819漏洞，客户比较强硬，这个漏洞还必须要修复</p><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><ul><li><p>公司联系了Spring Framework官方，推荐是升级的SpringBoot3 ，或者付费使用 Spring Framework 5.3.40 ，Spring Framework官方我们丢给了国内的代理，可是国内的代理一言难尽，还没考虑好如何去对这个事情进行报价，该方案搁置</p></li><li><p>第二个思路是升级SpringBoot3,做了一些技术预研，这本身是最好的路子，可是我司客户，不可避免的还有用java8的，作为乙方，在政府，军工类项目中话语权很低，如果是国产化采购的服务器，就更难以推动升级jdk为17以上的版本，该思路只适用于部分场景，并且还要考虑到很多历史和定制项目，已经交付了，扫描出了漏洞，就算给升级SpringBoot3这个开发和测试工作量不可估量，暂时搁置。该方案为后面两年的推动目标</p></li><li><p>公司维护Spring Framework,在GitHub 的 Spring Framework 6.x 版本上，我们可以根据git提交明确的看到官方是如何修复该漏洞，以Spring Framework = 5.3.39 为基础版本，把官方的修改在5.3.39上进行一次相同修改，发出5.3.40版本，如果后续还有类似漏洞我们同样可以参照6.x的修改来维护下去。但是该方案也只能应急，后续还是推动SpringBoot3升级为主线</p></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;SpringBoot-2-x-修复-CVE-2024-38819&quot;&gt;&lt;a href=&quot;#SpringBoot-2-x-修复-CVE-2024-38819&quot; class=&quot;headerlink&quot; title=&quot;SpringBoot 2.x 修复 CVE-2024-3
      
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
  </entry>
  
  <entry>
    <title>SpringCloud下的跨微服务收集和执行</title>
    <link href="https://blog.luckylxh.top/2025/02/06/SpringCloud%E4%B8%8B%E7%9A%84%E8%B7%A8%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%94%B6%E9%9B%86%E5%92%8C%E6%89%A7%E8%A1%8C/"/>
    <id>https://blog.luckylxh.top/2025/02/06/SpringCloud下的跨微服务收集和执行/</id>
    <published>2025-02-06T08:13:00.000Z</published>
    <updated>2025-02-06T08:44:28.272Z</updated>
    
    <content type="html"><![CDATA[<h2 id="跨微服务的资源收集和执行"><a href="#跨微服务的资源收集和执行" class="headerlink" title="跨微服务的资源收集和执行"></a>跨微服务的资源收集和执行</h2><h3 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h3><p>当服务为微服务部署模式的时候，一些底层的扩展可能会在不同的微服务上进行扩展，那么我们需要把他们收集到一个服务上，让用户能在任意的微服务上看到全部的扩展资源，如果用户执行了相关资源，应该还能够在对应的微服务上进行执行</p><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>基于SpringCloud Feign等技术，在微服务启动时，通过SpringCloud获取其他微服务情况，并进一步获取资源，生成代理类，注入到当前微服务，在调用时，走Feign调用到其他微服务上执行，当前微服务获取返回结果</p><ul><li>基于上述方案，我司已经实现了，多语言，计划任务，参数导入导出，多语言等，多种资源的跨微服务收集和执行</li></ul><a id="more"></a><h3 id="核心"><a href="#核心" class="headerlink" title="核心"></a>核心</h3><ul><li><p>开发者</p><ul><li>微服务资源收集和执行框架的开发者 （A类开发者）</li><li>系统选项框架的的定义者（B类开发者）</li><li>系统选项的扩展开发者（C类开发者）</li></ul></li></ul><h4 id="A类开发者"><a href="#A类开发者" class="headerlink" title="A类开发者"></a>A类开发者</h4><ul><li>定义微服务收集框架，定义微服务收集和执行的顶级接口A1,实现A1接口的这类资源，会参与微服务收集和执行</li><li>其他微服务资源的自动注入，定义@A2注解，被@A2注解标记的列表会自动注入相关的其他微服务资源</li><li>当前微服务启动的时候，需要主动去找注册中心询问当前存活的微服务，然后主动收集其资源到本地，并广播出，自己服务已经启动，让其他微服务来收集自己的资源</li><li>… 还有一些细节</li></ul><h4 id="B类开发者"><a href="#B类开发者" class="headerlink" title="B类开发者"></a>B类开发者</h4><ul><li>定义系统选项的顶级接口，以及前/后端页面的开发</li><li>定义了系统选项扩展的顶级接口B1</li><li><p>根据A类开发者的接口，进行实现</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">//定义该接口，需要支持远端收集特性</span><br><span class="line">@Component</span><br><span class="line">public class ****** implements A1 &#123;</span><br><span class="line"></span><br><span class="line">    public String getClassName() &#123;</span><br><span class="line">        return B1.class.getName();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public String getTitle() &#123;</span><br><span class="line">        return &quot;系统选项接口&quot;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>获取系统选项列表的地方要多写上注解@A2</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">@Autowired //收集本服务内的实例</span><br><span class="line">@A2 //收集其他微服务的实例</span><br><span class="line">private List&lt;B1&gt; services;</span><br></pre></td></tr></table></figure></li></ul><h4 id="C类开发者"><a href="#C类开发者" class="headerlink" title="C类开发者"></a>C类开发者</h4><ul><li>基于B类开发的文档进行系统选项开发</li></ul><h3 id="优缺点"><a href="#优缺点" class="headerlink" title="优缺点"></a>优缺点</h3><ul><li>微服务可以随意打包，在任意一个微服务上，都可以看到完整的系统选项列表</li><li>缺点是依赖注册中心，在收集和执行的阶段，使用feign调用，需要注册中心提供具体的微服务实例</li></ul><h3 id="相关注意事项"><a href="#相关注意事项" class="headerlink" title="相关注意事项"></a>相关注意事项</h3><ul><li>A类开发者，要定义全局的feign请求头，来解决跨微服务的情况下，认证的问题，用户信息需要传递下去</li><li>A类开发者，要处理好，微服务的启动和下线，去处理好当前Spring环境中注入的Feign代理类</li><li>B类开发者定义的顶级类必须是接口，java的动态代理，只能代理接口</li><li>B类开发者，定义的顶级接口，上不要有链式调用，每个方法的参数和返回结果都要可序列化</li><li>B类开发者，要注意，你收集到的List并不是一成不变的，会随着其他微服务的启动和下线，动态的变化</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;跨微服务的资源收集和执行&quot;&gt;&lt;a href=&quot;#跨微服务的资源收集和执行&quot; class=&quot;headerlink&quot; title=&quot;跨微服务的资源收集和执行&quot;&gt;&lt;/a&gt;跨微服务的资源收集和执行&lt;/h2&gt;&lt;h3 id=&quot;需求&quot;&gt;&lt;a href=&quot;#需求&quot; class=&quot;headerlink&quot; title=&quot;需求&quot;&gt;&lt;/a&gt;需求&lt;/h3&gt;&lt;p&gt;当服务为微服务部署模式的时候，一些底层的扩展可能会在不同的微服务上进行扩展，那么我们需要把他们收集到一个服务上，让用户能在任意的微服务上看到全部的扩展资源，如果用户执行了相关资源，应该还能够在对应的微服务上进行执行&lt;/p&gt;
&lt;h3 id=&quot;思路&quot;&gt;&lt;a href=&quot;#思路&quot; class=&quot;headerlink&quot; title=&quot;思路&quot;&gt;&lt;/a&gt;思路&lt;/h3&gt;&lt;p&gt;基于SpringCloud Feign等技术，在微服务启动时，通过SpringCloud获取其他微服务情况，并进一步获取资源，生成代理类，注入到当前微服务，在调用时，走Feign调用到其他微服务上执行，当前微服务获取返回结果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于上述方案，我司已经实现了，多语言，计划任务，参数导入导出，多语言等，多种资源的跨微服务收集和执行&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
  </entry>
  
  <entry>
    <title>Linux 对java进程分析</title>
    <link href="https://blog.luckylxh.top/2023/12/22/Linux-%E6%89%93%E7%BA%BF%E7%A8%8Bdump/"/>
    <id>https://blog.luckylxh.top/2023/12/22/Linux-打线程dump/</id>
    <published>2023-12-22T01:54:00.000Z</published>
    <updated>2024-10-09T08:08:48.922Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Linux-下-对java进程分析"><a href="#Linux-下-对java进程分析" class="headerlink" title="Linux 下 对java进程分析"></a>Linux 下 对java进程分析</h2><blockquote><p>JDK8</p><p>Linux</p></blockquote> <a id="more"></a><h3 id="留存线程"><a href="#留存线程" class="headerlink" title="留存线程"></a>留存线程</h3><ul><li>jstack主要用来查看某个Java进程内的线程堆栈信息</li><li>打一次线程dump</li><li><code>jstack pid &gt; t.txt</code></li><li>每间隔5秒打三次线程dump</li><li><p><code>for i in {1..3};do jstack -l pid &gt;&gt; $ip_$(date +%Y%m%d_%T).txt;i+=1;sleep 5;done</code></p></li><li><p>查看当前进程里面的线程情况<code>top -H -p pid</code></p></li></ul><p><img src="/images/pasted-77.png" alt="upload successful"></p><ul><li>文件可以使用 <code>java -jar jca4614.jar</code>进行查看</li></ul><h3 id="留存内存对象"><a href="#留存内存对象" class="headerlink" title="留存内存对象"></a>留存内存对象</h3><ul><li>jmap导出堆内存</li><li><code>jmap -dump:live,format=b,file=dump.hprof pid</code></li><li><p>导出的文件可以用<code>Jprofiler</code>或者<code>jvisualvm</code>进行分析</p></li><li><p>查看占用内存最大的对象前100<code>jmap -histo pid|head -100</code></p></li></ul><h3 id="留存gc"><a href="#留存gc" class="headerlink" title="留存gc"></a>留存gc</h3><ul><li>在线上看<code>gc</code>是否频繁和耗时</li><li><code>jstat -gcutil ${pid} 1000</code> 每隔一秒打印一次GC</li></ul><p><img src="/images/pasted-80.png" alt="upload successful"></p><p>可以看到，单次 Young GC 平均耗时是 60ms 左右，还是不错的，但是Young GC（YGC ）非常频繁，基本上每秒一次，有时还会一秒两次，在一秒两次的时候，Young GC对系统响应的压力就会比较明显。</p><p>jstat相关指标说明：</p><ul><li>YGCT：Young GC 总时间，单位为秒</li><li>YGC：Young GC 次数</li><li>FGCT：Full GC 总时间，单位为秒</li><li>FGC：Full GC 次数</li><li><p>GCT：GC 总时间，是 YGCT 和 FGCT 之和<br>接着查看 GC log，打印 GC log 需要在 JVM 启动参数里添加如下参数：</p></li><li><p>-XX:+PrintGCDateStamps：打印 GC 发生的时间戳。</p></li><li>-XX:+PrintTenuringDistribution：打印 GC 发生时的代龄信息。</li><li>-XX:+PrintGCApplicationStoppedTime：打印 GC 停顿时长</li><li>-XX:+PrintGCApplicationConcurrentTime：打印 GC 间隔的服务运行时长</li><li>-XX:+PrintGCDetails：打印 GC 详情，包括 GC 前/内存等。</li><li>-Xloggc:../gclogs/gc.log.date：指定 GC log 的路径</li></ul><p><img src="/images/pasted-81.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;Linux-下-对java进程分析&quot;&gt;&lt;a href=&quot;#Linux-下-对java进程分析&quot; class=&quot;headerlink&quot; title=&quot;Linux 下 对java进程分析&quot;&gt;&lt;/a&gt;Linux 下 对java进程分析&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;JDK8&lt;/p&gt;
&lt;p&gt;Linux&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="java" scheme="https://blog.luckylxh.top/tags/java/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot对接Redis高可用集群</title>
    <link href="https://blog.luckylxh.top/2022/08/22/SpringBoot%E5%AF%B9%E6%8E%A5Redis%E9%AB%98%E5%8F%AF%E7%94%A8%E9%9B%86%E7%BE%A4/"/>
    <id>https://blog.luckylxh.top/2022/08/22/SpringBoot对接Redis高可用集群/</id>
    <published>2022-08-22T03:04:00.000Z</published>
    <updated>2022-08-22T03:06:31.019Z</updated>
    
    <content type="html"><![CDATA[<h2 id="SpringBoot对接高可用Redis的情况和配置方式"><a href="#SpringBoot对接高可用Redis的情况和配置方式" class="headerlink" title="SpringBoot对接高可用Redis的情况和配置方式"></a>SpringBoot对接高可用Redis的情况和配置方式</h2><blockquote><p>Redis 高可用分两个方式：主从哨兵模式或者Cluster集群</p><p>SpringBoot 版本 <code>2.6.8</code></p></blockquote> <a id="more"></a><h3 id="主从哨兵模式"><a href="#主从哨兵模式" class="headerlink" title="主从哨兵模式"></a>主从哨兵模式</h3><p>常见的部署是一主二从三哨兵模式，一个<code>redis</code>节点主节点，承担写+读的责任。两个<code>redis</code>节点，作为只读节点，不承担写入责任，三个<code>redis</code>节点，通过特殊的启动模式，作为监控节点，监控主节点的实例状态。</p><p>特性：高可用、部分高并发，主从节点数据完全一致</p><p>缺点：高并发特性不明显</p><p>优点：支持性好，可无缝衔接具体项目，完美支持<code>lua</code>脚本</p><h4 id="Spring-Boot对接"><a href="#Spring-Boot对接" class="headerlink" title="Spring Boot对接"></a>Spring Boot对接</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#主节点的名称</span><br><span class="line">spring.redis.sentinel.master=mymaster</span><br><span class="line"># 三个哨兵的地址</span><br><span class="line">spring.redis.sentinel.nodes=127.0.0.1:26663,127.0.0.1:26662,127.0.0.1:26661</span><br><span class="line"># 哨兵如果有密码，配置哨兵密码</span><br><span class="line">spring.redis.sentinel.password=redis</span><br><span class="line"># 主节点的密码</span><br><span class="line">spring.redis.password=redis</span><br></pre></td></tr></table></figure><h3 id="Cluster集群"><a href="#Cluster集群" class="headerlink" title="Cluster集群"></a>Cluster集群</h3><p>常见的部署是三主三从，三个<code>redis</code>节点，作为主节点，承担写+读的责任。三个<code>redis</code>节点，从节点提供数据读能力，不承担写入责任。Cluster集群式无中心的架构，六者之间相互监控，当有主节点实例状态出问题，从节点自动顶上</p><p>特性：高可用、高并发，数据分片，三个主节点数据不一致</p><p>优点：高并发</p><p>缺点：数据分片，导致原生不支持<code>mset,mget，pipeline</code>等批量操作,部分支持<code>lua</code>脚本</p><h4 id="Spring-Boot对接-1"><a href="#Spring-Boot对接-1" class="headerlink" title="Spring Boot对接"></a>Spring Boot对接</h4><ul><li><p>对接尽量使用<code>lettuce</code>,不要使用<code>jedis</code></p><ul><li><p><code>cluster</code>集群原生不支持批量操作</p></li><li><p><code>lettuce</code>和<code>jedis</code>都对其进行二次封装，能在<code>cluster</code>集群中使用<code>mset,mget</code></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">mset mget</span><br><span class="line"><span class="comment">//redis.clients.jedis.JedisCluster 2013</span></span><br><span class="line">  <span class="meta">@Override</span></span><br><span class="line">  <span class="function"><span class="keyword">public</span> String <span class="title">mset</span><span class="params">(<span class="keyword">final</span> String... keysvalues)</span> </span>&#123;</span><br><span class="line">    String[] keys = <span class="keyword">new</span> String[keysvalues.length / <span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> keyIdx = <span class="number">0</span>; keyIdx &lt; keys.length; keyIdx++) &#123;</span><br><span class="line">      keys[keyIdx] = keysvalues[keyIdx * <span class="number">2</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> JedisClusterCommand&lt;String&gt;(connectionHandler, maxAttempts, maxTotalRetriesDuration) &#123;</span><br><span class="line">      <span class="meta">@Override</span></span><br><span class="line">      <span class="function"><span class="keyword">public</span> String <span class="title">execute</span><span class="params">(Jedis connection)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> connection.mset(keysvalues);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;.run(keys.length, keys);</span><br><span class="line">  &#125;</span><br><span class="line"><span class="comment">// io.lettuce.core.cluster.RedisAdvancedClusterAsyncCommandsImpl&lt;K, V&gt; 350 </span></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> RedisFuture&lt;String&gt; <span class="title">mset</span><span class="params">(Map&lt;K, V&gt; map)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">        Map&lt;Integer, List&lt;K&gt;&gt; partitioned = SlotHash.partition(codec, map.keySet());</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (partitioned.size() &lt; <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">super</span>.mset(map);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        Map&lt;Integer, RedisFuture&lt;String&gt;&gt; executions = <span class="keyword">new</span> HashMap&lt;&gt;();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (Map.Entry&lt;Integer, List&lt;K&gt;&gt; entry : partitioned.entrySet()) &#123;</span><br><span class="line"></span><br><span class="line">            Map&lt;K, V&gt; op = <span class="keyword">new</span> HashMap&lt;&gt;();</span><br><span class="line">            entry.getValue().forEach(k -&gt; op.put(k, map.get(k)));</span><br><span class="line"></span><br><span class="line">            RedisFuture&lt;String&gt; mset = <span class="keyword">super</span>.mset(op);</span><br><span class="line">            executions.put(entry.getKey(), mset);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> MultiNodeExecution.firstOfAsync(executions);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></li></ul></li></ul><ul><li><p><code>lettuce</code>还支持<code>pipeline</code>,<code>jedis</code>不支持，会直接抛出异常</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// pipeline </span></span><br><span class="line"><span class="comment">// org.springframework.data.redis.connection.lettuce.LettuceConnection  490</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">openPipeline</span><span class="params">()</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!isPipelined) &#123;</span><br><span class="line">isPipelined = <span class="keyword">true</span>;</span><br><span class="line">ppline = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line">flushState = <span class="keyword">this</span>.pipeliningFlushPolicy.newPipeline();</span><br><span class="line">flushState.onOpen(<span class="keyword">this</span>.getOrCreateDedicatedConnection());</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// org.springframework.data.redis.connection.jedis.JedisClusterConnection  849</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">openPipeline</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> UnsupportedOperationException(<span class="string">"Pipeline is currently not supported for JedisClusterConnection."</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><ul><li><code>lua</code>脚本,如果不是批量操作，或者此次批量操作涉及的<code>key</code>能分片到同一台<code>redis</code>上，可以执行</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">#六个节点的地址</span><br><span class="line">spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006</span><br><span class="line">#拓扑动态感应即客户端能够根据 redis cluster 集群的变化，动态改变客户端的节点情况，完成故障转移。</span><br><span class="line">spring.redis.lettuce.cluster.refresh.adaptive=true</span><br><span class="line">#集群拓扑刷新周期 单位毫秒</span><br><span class="line">spring.redis.lettuce.cluster.refresh.period=10000  </span><br><span class="line">#是否发现和查询所有群集节点以获取群集拓扑。设置为false时，仅将初始种子节点用作拓扑发现的源</span><br><span class="line">spring.redis.lettuce.cluster.refresh.dynamic-refresh-sources=true</span><br><span class="line"># 节点的密码</span><br><span class="line">spring.redis.password=redis</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;SpringBoot对接高可用Redis的情况和配置方式&quot;&gt;&lt;a href=&quot;#SpringBoot对接高可用Redis的情况和配置方式&quot; class=&quot;headerlink&quot; title=&quot;SpringBoot对接高可用Redis的情况和配置方式&quot;&gt;&lt;/a&gt;SpringBoot对接高可用Redis的情况和配置方式&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Redis 高可用分两个方式：主从哨兵模式或者Cluster集群&lt;/p&gt;
&lt;p&gt;SpringBoot 版本 &lt;code&gt;2.6.8&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
      <category term="Redis" scheme="https://blog.luckylxh.top/tags/Redis/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot 对接redis哨兵集群</title>
    <link href="https://blog.luckylxh.top/2022/08/19/SpringBoot-%E5%AF%B9%E6%8E%A5redis%E5%93%A8%E5%85%B5%E9%9B%86%E7%BE%A4/"/>
    <id>https://blog.luckylxh.top/2022/08/19/SpringBoot-对接redis哨兵集群/</id>
    <published>2022-08-19T06:46:00.000Z</published>
    <updated>2022-08-19T08:37:58.415Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Redis哨兵集群"><a href="#Redis哨兵集群" class="headerlink" title="Redis哨兵集群"></a>Redis哨兵集群</h2><p>使用Redis哨兵集群，主要是为了高可用，这次部署是，一主，二从，三哨兵。主可写可读，从可读，哨兵不提供读写服务，只是监控</p> <a id="more"></a><h3 id="一主"><a href="#一主" class="headerlink" title="一主"></a>一主</h3><hr><ul><li>主要配置密码,端口，和可访问的ip</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#任何ip</span><br><span class="line">bind 0.0.0.0</span><br><span class="line">#端口 6666</span><br><span class="line">port 6666</span><br><span class="line">#作为主节点的密码 是 redis</span><br><span class="line">masterauth redis</span><br><span class="line">#密码 redis</span><br><span class="line">requirepass redis</span><br></pre></td></tr></table></figure><p><img src="/images/pasted-74.png" alt="upload successful"></p><h3 id="二从"><a href="#二从" class="headerlink" title="二从"></a>二从</h3><hr><ul><li>ip，只读，主信息等</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">bind 0.0.0.0</span><br><span class="line">port 6664</span><br><span class="line">#port 6665</span><br><span class="line">#主节点的ip和端口</span><br><span class="line">slaveof host.docker.internal 6666</span><br><span class="line"># 从节点只读 当被选取为主节点是这个是停止的</span><br><span class="line">slave-read-only yes</span><br><span class="line"># 从节点在处于快照同步期间是否对外提供服务</span><br><span class="line">slave-serve-stale-data yes</span><br><span class="line"># master的认证口令</span><br><span class="line">masterauth redis</span><br><span class="line"># 密码</span><br><span class="line">requirepass redis</span><br></pre></td></tr></table></figure><p><img src="/images/pasted-75.png" alt="upload successful"></p><h3 id="三哨兵"><a href="#三哨兵" class="headerlink" title="三哨兵"></a>三哨兵</h3><hr><ul><li>ip，主信息，选举等</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">bind 0.0.0.0</span><br><span class="line">port 26661</span><br><span class="line"># port 26661 port 26662 port 26663</span><br><span class="line">#开启域名解析</span><br><span class="line">sentinel resolve-hostnames yes</span><br><span class="line">#保留域名（程序可以获取到域名）</span><br><span class="line">sentinel announce-hostnames yes</span><br><span class="line"># 主服务信息 ip 端口 以及几个哨兵认为主服务挂了</span><br><span class="line">sentinel monitor mymaster host.docker.internal 6666 2</span><br><span class="line"># 主 密码</span><br><span class="line">sentinel auth-pass mymaster redis</span><br><span class="line">sentinel down-after-milliseconds mymaster 15000</span><br><span class="line">sentinel parallel-syncs mymaster 1</span><br><span class="line">sentinel failover-timeout mymaster 80000</span><br><span class="line">#密码</span><br><span class="line">requirepass redis</span><br></pre></td></tr></table></figure><p><img src="/images/pasted-76.png" alt="upload successful"></p><h3 id="docker-compose启动"><a href="#docker-compose启动" class="headerlink" title="docker-compose启动"></a>docker-compose启动</h3><ul><li>结合docker 启动</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line">version: &quot;3&quot;</span><br><span class="line">services:  </span><br><span class="line">  masterRedis:</span><br><span class="line">    container_name: &quot;masterRedis&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 6666:6666</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\master-6666\\redis.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">    #network_mode: host</span><br><span class="line">  slave:</span><br><span class="line">    container_name: &quot;slave&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 6665:6665</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\slave-6665\\redis-6665.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf</span><br><span class="line">    depends_on:</span><br><span class="line">      - masterRedis</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">  slave2:</span><br><span class="line">    container_name: &quot;slave2&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 6664:6664</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\slave-6664\\redis-6664.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf</span><br><span class="line">    depends_on:</span><br><span class="line">      - masterRedis</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">  sentinel:</span><br><span class="line">    container_name: &quot;sentinel&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 26663:26663</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\sentinel-26663\\sentinel-26663.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf --sentinel</span><br><span class="line">    depends_on:</span><br><span class="line">      - masterRedis</span><br><span class="line">      - slave</span><br><span class="line">      - slave2</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">  sentinel2:</span><br><span class="line">    container_name: &quot;sentinel2&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 26662:26662</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\sentinel-26662\\sentinel-26662.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf --sentinel</span><br><span class="line">    depends_on:</span><br><span class="line">      - masterRedis</span><br><span class="line">      - slave</span><br><span class="line">      - slave2</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">  sentinel3:</span><br><span class="line">    container_name: &quot;sentinel3&quot;</span><br><span class="line">    image: redis</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - 26661:26661</span><br><span class="line">    volumes:</span><br><span class="line">      - &quot;D:\\env\\study\\redis\\sentinel-26661\\sentinel-26661.conf:/etc/redis/redis.conf&quot; </span><br><span class="line">    command: redis-server /etc/redis/redis.conf --sentinel</span><br><span class="line">    #networks:</span><br><span class="line">    #  extnetwork:</span><br><span class="line">    #    ipv4_address: 10.2.21.6</span><br><span class="line">    depends_on:</span><br><span class="line">      - masterRedis</span><br><span class="line">      - slave</span><br><span class="line">      - slave2</span><br><span class="line">    extra_hosts:</span><br><span class="line">      - &quot;host.docker.internal:host-gateway&quot;</span><br><span class="line">#networks:</span><br><span class="line">#   extnetwork:</span><br><span class="line">#      driver: bridge</span><br><span class="line">#      ipam:</span><br><span class="line">#        config:</span><br><span class="line">#          - subnet: 10.2.21.0/16</span><br></pre></td></tr></table></figure><h4 id="SpringBoot介入"><a href="#SpringBoot介入" class="headerlink" title="SpringBoot介入"></a>SpringBoot介入</h4><ul><li>配置文件</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#主节点的名称</span><br><span class="line">spring.redis.sentinel.master=mymaster</span><br><span class="line"># 三个哨兵的地址</span><br><span class="line">spring.redis.sentinel.nodes=127.0.0.1:26663,127.0.0.1:26662,127.0.0.1:26661</span><br><span class="line"># 哨兵如果有密码，配置哨兵密码</span><br><span class="line">spring.redis.sentinel.password=redis</span><br><span class="line"># 主节点的密码</span><br><span class="line">spring.redis.password=redis</span><br></pre></td></tr></table></figure><ul><li>一些坑</li><li>docker 部署的服务，给程序返回的主节点ip是虚拟ip,所以我这里用了域名，防止给程序一个根本连接不上的地址</li><li>为什么我用了docker,我还是要我本地的端口和容器端口一致，也是为了，如果主节点挂掉，哨兵给的从节点地址和端口，我spring程序是宿主机上的服务，想要连接上，尽量保证一致（虽然没什么卵用，因为主关了，哨兵给程序的新的redis的ip是 docker的内网地址）</li><li>哨兵上配置主的时候，竟然默认不支持域名的解析，需要增加如下两个配置<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#开启域名解析</span><br><span class="line">sentinel resolve-hostnames yes</span><br><span class="line">#保留域名（程序可以获取到域名）</span><br><span class="line">sentinel announce-hostnames yes</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;Redis哨兵集群&quot;&gt;&lt;a href=&quot;#Redis哨兵集群&quot; class=&quot;headerlink&quot; title=&quot;Redis哨兵集群&quot;&gt;&lt;/a&gt;Redis哨兵集群&lt;/h2&gt;&lt;p&gt;使用Redis哨兵集群，主要是为了高可用，这次部署是，一主，二从，三哨兵。主可写可读，从可读，哨兵不提供读写服务，只是监控&lt;/p&gt;
    
    </summary>
    
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
      <category term="Redis" scheme="https://blog.luckylxh.top/tags/Redis/"/>
    
  </entry>
  
  <entry>
    <title>统一认证中心的一些思考</title>
    <link href="https://blog.luckylxh.top/2022/03/28/%E7%BB%9F%E4%B8%80%E8%AE%A4%E8%AF%81%E4%B8%AD%E5%BF%83%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83/"/>
    <id>https://blog.luckylxh.top/2022/03/28/统一认证中心的一些思考/</id>
    <published>2022-03-28T08:25:23.000Z</published>
    <updated>2022-08-19T06:42:53.375Z</updated>
    
    <content type="html"><![CDATA[<h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p>统一认证中心，常见的有CAS、oAuth2等认证中心，主要解决，多个异构系统页面单点</p><a id="more"></a>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h4&gt;&lt;p&gt;统一认证中心，常见的有CAS、oAuth2等认证中心，主要解决，多个异构系统页面单点&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Excel分组的存储结构浅析</title>
    <link href="https://blog.luckylxh.top/2021/06/22/Excel%E5%88%86%E7%BB%84%E7%9A%84%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84%E6%B5%85%E6%9E%90/"/>
    <id>https://blog.luckylxh.top/2021/06/22/Excel分组的存储结构浅析/</id>
    <published>2021-06-22T04:12:00.000Z</published>
    <updated>2021-06-22T04:19:13.472Z</updated>
    
    <content type="html"><![CDATA[<h2 id="WPS-中Excel-创建组数据存储分析"><a href="#WPS-中Excel-创建组数据存储分析" class="headerlink" title="WPS 中Excel 创建组数据存储分析"></a>WPS 中Excel 创建组数据存储分析</h2><p>在工作中常遇到长篇幅的数据报表。</p><p>将表格数据分组显示可以更加直观的让我们观察数据、整理数据。</p><p><img src="/images/pasted-69.png" alt="upload successful"></p><p>如上图所示,探究下其文件存储格式</p> <a id="more"></a><h3 id="行分组"><a href="#行分组" class="headerlink" title="行分组"></a>行分组</h3><hr><ul><li>行方向的分组</li></ul><h4 id="两个行分组"><a href="#两个行分组" class="headerlink" title="两个行分组"></a>两个行分组</h4><ul><li>两个行分组 直接必须至少空一行,否则会变成一个行分组</li></ul><p><img src="/images/pasted-70.png" alt="upload successful"></p><ul><li>数据结构 sheet1.xml</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span> <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span> <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span> <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span> <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span> <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:A8"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">tabSelected</span>=<span class="string">"1"</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"A5"</span> <span class="attr">sqref</span>=<span class="string">"A5:A8"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"14.25"</span> <span class="attr">outlineLevelRow</span>=<span class="string">"7"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetData</span>&gt;</span></span><br><span class="line">        // row 上带有了 outlineLevel 代表是行分组 值 是1 代表了是1层级</span><br><span class="line">        //层级代表了是否有嵌套,可以见 行分组嵌套</span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"1"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>1<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"2"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A2"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>2<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"3"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A3"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>3<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        // 第4行没有 所以 页面上 是两个行分组 如果第4行也有 应该会变成一个行分组</span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"4"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A4"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>4<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"5"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A5"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>5<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"6"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A6"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>6<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"7"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A7"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>7<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"8"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A8"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>8<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetData</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.7"</span> <span class="attr">right</span>=<span class="string">"0.7"</span> <span class="attr">top</span>=<span class="string">"0.75"</span> <span class="attr">bottom</span>=<span class="string">"0.75"</span> <span class="attr">header</span>=<span class="string">"0.3"</span> <span class="attr">footer</span>=<span class="string">"0.3"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="行分组嵌套"><a href="#行分组嵌套" class="headerlink" title="行分组嵌套"></a>行分组嵌套</h4><ul><li>一个行分组中包括了另一个行分组</li></ul><p><img src="/images/pasted-71.png" alt="upload successful"></p><ul><li>数据结构 sheet1.xml</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span> <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span> <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span> <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span> <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span> <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:A9"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">tabSelected</span>=<span class="string">"1"</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"A3"</span> <span class="attr">sqref</span>=<span class="string">"A3:A4"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"14.25"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetData</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"1"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>1<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"2"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A2"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>2<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        // outlineLevel 层级为 2  嵌入到了 为1的层级</span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"3"</span> <span class="attr">outlineLevel</span>=<span class="string">"2"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A3"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>3<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"4"</span> <span class="attr">outlineLevel</span>=<span class="string">"2"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A4"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>4<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"5"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A5"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>5<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"6"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A6"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>6<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"7"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A7"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>7<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"8"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A8"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>8<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"9"</span> <span class="attr">spans</span>=<span class="string">"1:1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A9"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>9<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetData</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.7"</span> <span class="attr">right</span>=<span class="string">"0.7"</span> <span class="attr">top</span>=<span class="string">"0.75"</span> <span class="attr">bottom</span>=<span class="string">"0.75"</span> <span class="attr">header</span>=<span class="string">"0.3"</span> <span class="attr">footer</span>=<span class="string">"0.3"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="列分组"><a href="#列分组" class="headerlink" title="列分组"></a>列分组</h3><hr><ul><li>列方向的分组</li></ul><h4 id="两个列分组"><a href="#两个列分组" class="headerlink" title="两个列分组"></a>两个列分组</h4><ul><li>两个列方向的分组 分组直接至少空一列 否则会变成一个列分组</li></ul><p><img src="/images/pasted-72.png" alt="upload successful"></p><ul><li>数据结构 sheet1.xml</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span> <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span> <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span> <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span> <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span> <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:G1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">tabSelected</span>=<span class="string">"1"</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"E1"</span> <span class="attr">sqref</span>=<span class="string">"E1:G1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"14.25"</span> <span class="attr">outlineLevelCol</span>=<span class="string">"6"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">cols</span>&gt;</span></span><br><span class="line">        //这里记录 列方向的 分组信息</span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"1"</span> <span class="attr">max</span>=<span class="string">"3"</span> <span class="attr">width</span>=<span class="string">"9"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"5"</span> <span class="attr">max</span>=<span class="string">"7"</span> <span class="attr">width</span>=<span class="string">"9"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">cols</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetData</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:7"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>1<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"B1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>2<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"C1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>3<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"D1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>4<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"E1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>5<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"F1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>6<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"G1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>7<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetData</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.7"</span> <span class="attr">right</span>=<span class="string">"0.7"</span> <span class="attr">top</span>=<span class="string">"0.75"</span> <span class="attr">bottom</span>=<span class="string">"0.75"</span> <span class="attr">header</span>=<span class="string">"0.3"</span> <span class="attr">footer</span>=<span class="string">"0.3"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="列分组嵌套"><a href="#列分组嵌套" class="headerlink" title="列分组嵌套"></a>列分组嵌套</h4><ul><li>一个列分组中包括另一个列分组</li></ul><p><img src="/images/pasted-73.png" alt="upload successful"></p><ul><li>数据结构 sheet1.xml</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span> <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span> <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span> <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span> <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span> <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:I1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">tabSelected</span>=<span class="string">"1"</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"B1"</span> <span class="attr">sqref</span>=<span class="string">"B1:D1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"14.25"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">cols</span>&gt;</span></span><br><span class="line">        // 同样逻辑 通过outlineLevel 层级描述嵌套</span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"1"</span> <span class="attr">max</span>=<span class="string">"1"</span> <span class="attr">width</span>=<span class="string">"9"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"2"</span> <span class="attr">max</span>=<span class="string">"4"</span> <span class="attr">width</span>=<span class="string">"9"</span> <span class="attr">outlineLevel</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"5"</span> <span class="attr">max</span>=<span class="string">"8"</span> <span class="attr">width</span>=<span class="string">"9"</span> <span class="attr">outlineLevel</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">cols</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetData</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">row</span> <span class="attr">r</span>=<span class="string">"1"</span> <span class="attr">spans</span>=<span class="string">"1:9"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"A1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>1<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"B1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>2<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"C1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>3<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"D1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>4<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"E1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>5<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"F1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>6<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"G1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>7<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"H1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>8<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">c</span> <span class="attr">r</span>=<span class="string">"I1"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">v</span>&gt;</span>9<span class="tag">&lt;/<span class="name">v</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">c</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">row</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetData</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.7"</span> <span class="attr">right</span>=<span class="string">"0.7"</span> <span class="attr">top</span>=<span class="string">"0.75"</span> <span class="attr">bottom</span>=<span class="string">"0.75"</span> <span class="attr">header</span>=<span class="string">"0.3"</span> <span class="attr">footer</span>=<span class="string">"0.3"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;WPS-中Excel-创建组数据存储分析&quot;&gt;&lt;a href=&quot;#WPS-中Excel-创建组数据存储分析&quot; class=&quot;headerlink&quot; title=&quot;WPS 中Excel 创建组数据存储分析&quot;&gt;&lt;/a&gt;WPS 中Excel 创建组数据存储分析&lt;/h2&gt;&lt;p&gt;在工作中常遇到长篇幅的数据报表。&lt;/p&gt;
&lt;p&gt;将表格数据分组显示可以更加直观的让我们观察数据、整理数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/pasted-69.png&quot; alt=&quot;upload successful&quot;&gt;&lt;/p&gt;
&lt;p&gt;如上图所示,探究下其文件存储格式&lt;/p&gt;
    
    </summary>
    
      <category term="Excel" scheme="https://blog.luckylxh.top/categories/Excel/"/>
    
    
      <category term="Excel" scheme="https://blog.luckylxh.top/tags/Excel/"/>
    
  </entry>
  
  <entry>
    <title>web版的单机版构建</title>
    <link href="https://blog.luckylxh.top/2020/09/23/web%E7%89%88%E7%9A%84%E5%8D%95%E6%9C%BA%E7%89%88%E6%9E%84%E5%BB%BA/"/>
    <id>https://blog.luckylxh.top/2020/09/23/web版的单机版构建/</id>
    <published>2020-09-23T03:19:00.000Z</published>
    <updated>2020-09-23T04:10:00.481Z</updated>
    
    <content type="html"><![CDATA[<h4 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h4><p>   把一个成熟的Web版本程序 做成单机版(桌面)程序,应对不同的客户环境</p>   <a id="more"></a><h4 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h4><p> 正常的 Web项目 一般由几个模块组成</p><ul><li>数据库服务</li><li>后台服务</li><li>前台服务</li><li><p>redis等中间件</p><p>后台服务和前台服务 在 War包部署中可以合二为一 redis等中间件 如果是为了单机版部署也是可以优化掉的.所以我们在单机版部署中 必须的模块就剩下 这几个了</p></li><li>业务服务</li><li>数据库服务</li><li>桌面程序服务</li></ul><p>ps: 当然数据库服务这里默认是一个单机版自带一个数据库服务,应对客户场景保密 不通外网的情况 如果客户服务可以通外网,也允许数据库服务外联,我们就可以 把数据库服务给去掉 ,这里分析 单机版自带数据库服务的情况</p><h4 id="方案"><a href="#方案" class="headerlink" title="方案"></a>方案</h4><ul><li>业务服务(包含数据库,不包括前台代码) =&gt; jar方式打一个可执行jar包,h2文件模式内嵌数据库 </li><li>桌面程序服务(electron 包括前台代码) =&gt;做桌面应用程序</li></ul><p>启动 步骤如下</p><ul><li>用户点击 demo.exe文件 electron服务启动(前台服务启动),页面展示启动中</li><li>逻辑代码 用命令行启动 单机版内包含的可执行 jar文件 拉起业务服务</li><li>前台和后台约定好一个接口代表业务服务启动成功,前台代码 以一定的频率调用接口,查询后台服务启动的情况(推荐后台使用:spring-boot-starter-actuator做生命周期管理)</li><li>前台服务得知后台启动成功,进入业务页面.整体服务启动成功</li></ul><p>关闭步骤如下</p><ul><li>用户点击退出或者❌号</li><li>electron服务(前台服务)监听到,给后台发送退出请求(spring-boot-starter-actuator 有提供退出接口)</li><li>electron服务 退出</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;需求&quot;&gt;&lt;a href=&quot;#需求&quot; class=&quot;headerlink&quot; title=&quot;需求&quot;&gt;&lt;/a&gt;需求&lt;/h4&gt;&lt;p&gt;   把一个成熟的Web版本程序 做成单机版(桌面)程序,应对不同的客户环境&lt;/p&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Electron" scheme="https://blog.luckylxh.top/tags/Electron/"/>
    
      <category term="H2" scheme="https://blog.luckylxh.top/tags/H2/"/>
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
      <category term="单机版" scheme="https://blog.luckylxh.top/tags/%E5%8D%95%E6%9C%BA%E7%89%88/"/>
    
  </entry>
  
  <entry>
    <title>Electron 学习</title>
    <link href="https://blog.luckylxh.top/2020/09/23/Electron-%E5%AD%A6%E4%B9%A0/"/>
    <id>https://blog.luckylxh.top/2020/09/23/Electron-学习/</id>
    <published>2020-09-23T03:01:00.000Z</published>
    <updated>2020-09-23T04:09:04.135Z</updated>
    
    <content type="html"><![CDATA[<h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p><a href="https://www.electronjs.org" target="_blank" rel="noopener">electron</a> 是基于 nodejs的一个封装了一个谷歌的浏览器内核,让我们写js代码就可以开发出来一个桌面应用,适合web项目 封装单机版.</p><a id="more"></a><h4 id="npm-依赖"><a href="#npm-依赖" class="headerlink" title="npm 依赖"></a>npm 依赖</h4><p> 直接加入<br> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;electron&quot;: &quot;^9.2.0&quot;,</span><br></pre></td></tr></table></figure></p><p> 就直接吧 electron依赖进来了<br> main.js是 electron默认的入口文件 在里面我们就可以开始我们的开发了,可以参照<a href="https://www.electronjs.org/docs" target="_blank" rel="noopener">官方文档</a></p><h4 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h4> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"> &#123;</span><br><span class="line">  &quot;name&quot;: &quot;electron-demo&quot;,</span><br><span class="line">  &quot;version&quot;: &quot;1.0.0&quot;,</span><br><span class="line">  &quot;description&quot;: &quot;&quot;,</span><br><span class="line">  &quot;main&quot;: &quot;main.js&quot;,//默认的入口文件</span><br><span class="line">  &quot;scripts&quot;: &#123;</span><br><span class="line">    &quot;start&quot;: &quot;electron .&quot; //启动命令</span><br><span class="line">  &#125;,</span><br><span class="line">  &quot;author&quot;: &quot;&quot;,</span><br><span class="line">  &quot;license&quot;: &quot;ISC&quot;,</span><br><span class="line">  &quot;devDependencies&quot;: &#123;</span><br><span class="line">    &quot;electron&quot;: &quot;^9.2.0&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="打包"><a href="#打包" class="headerlink" title="打包"></a>打包</h4> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"> &#123;</span><br><span class="line">  &quot;name&quot;: &quot;electron-demo&quot;,</span><br><span class="line">  &quot;version&quot;: &quot;1.0.0&quot;,</span><br><span class="line">  &quot;description&quot;: &quot;&quot;,</span><br><span class="line">  &quot;main&quot;: &quot;main.js&quot;,</span><br><span class="line">  &quot;scripts&quot;: &#123;</span><br><span class="line">    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;,</span><br><span class="line">    &quot;start&quot;: &quot;electron .&quot;,</span><br><span class="line">    &quot;package&quot;: &quot;electron-packager ./ --out dist --overwrite --icon=icon/window.ico&quot;, // electron-packager 是一种打包方式 </span><br><span class="line">    &quot;pack&quot;: &quot;electron-builder --dir --win --x64&quot;, // electron-builder是另外一种打包方式</span><br><span class="line">    &quot;dist&quot;: &quot;electron-builder&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &quot;author&quot;: &quot;&quot;,</span><br><span class="line">  &quot;license&quot;: &quot;ISC&quot;,</span><br><span class="line">  &quot;devDependencies&quot;: &#123;</span><br><span class="line">    &quot;electron&quot;: &quot;^9.2.0&quot;,</span><br><span class="line">    &quot;electron-builder&quot;: &quot;^22.8.0&quot;,</span><br><span class="line">    &quot;electron-packager&quot;: &quot;^15.0.0&quot;</span><br><span class="line">  &#125;,</span><br><span class="line">  &quot;build&quot;: &#123; //electron-builder 配合使用 可以更改 win上的 打包exe的图标</span><br><span class="line">    &quot;productName&quot;: &quot;blog&quot;,</span><br><span class="line">    &quot;appId&quot;: &quot;blog.luckylxh.top&quot;,</span><br><span class="line">    &quot;win&quot;: &#123;</span><br><span class="line">      &quot;icon&quot;: &quot;icon/favicon.ico&quot;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p> 打包后的样式如下</p><p><img src="/images/pasted-68.png" alt="upload successful"></p><p> 双击 exe就可以运行!</p>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://www.electronjs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;electron&lt;/a&gt; 是基于 nodejs的一个封装了一个谷歌的浏览器内核,让我们写js代码就可以开发出来一个桌面应用,适合web项目 封装单机版.&lt;/p&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Electron" scheme="https://blog.luckylxh.top/tags/Electron/"/>
    
      <category term="Nodejs" scheme="https://blog.luckylxh.top/tags/Nodejs/"/>
    
  </entry>
  
  <entry>
    <title>Spring Boot H2嵌入式整合</title>
    <link href="https://blog.luckylxh.top/2020/08/11/Spring-Boot-H2%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%95%B4%E5%90%88/"/>
    <id>https://blog.luckylxh.top/2020/08/11/Spring-Boot-H2嵌入式整合/</id>
    <published>2020-08-11T01:32:00.000Z</published>
    <updated>2020-09-23T04:08:15.073Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Spring-Boot-H2-嵌入模式整合"><a href="#Spring-Boot-H2-嵌入模式整合" class="headerlink" title="Spring Boot  H2 嵌入模式整合"></a>Spring Boot  H2 嵌入模式整合</h3><h4 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h4><p>我们已经有一个成熟的WEB报表产品结构了,是BS架构.</p><p>但是在业务场景上,部分定制项目或者说产品需要做单机版.给用户安装的单机版不适合大家统一使用一个远程的数据库服务,我们不得不去研究嵌入式数据库到我们的项目中,让我们的单机版自身带有数据库服务.</p><a id="more"></a><h4 id="H2使用场景"><a href="#H2使用场景" class="headerlink" title="H2使用场景"></a>H2使用场景</h4><p>H2 是一个用 Java 开发的嵌入式数据库，它本身只是一个类库，即只有一个 jar 文件，可以直接嵌入到应用项目中。H2 主要有如下三个用途：</p><ul><li>也是最常使用的用途就在于可以同应用程序打包在一起发布，这样可以非常方便地存储少量结构化数据(嵌入模式)。</li><li>用于单元测试。启动速度快，而且可以关闭持久化功能，每一个用例执行完随即还原到初始状态(内存模式)。</li><li>作为缓存，即当做内存数据库，作为NoSQL的一个补充。当某些场景下数据模型必须为关系型，可以拿它当Memcached使，作为后端MySQL/Oracle的一个缓冲层，缓存一些不经常变化但需要频繁访问的数据，比如字典表、权限表(内存模式)</li></ul><h4 id="H2启动模式"><a href="#H2启动模式" class="headerlink" title="H2启动模式"></a>H2启动模式</h4><ul><li>内存模式:数据无法持久化  jdbc:h2:mem:***</li><li>嵌入模式:jar包直接跟随后台服务,数据持久化到文件系统 jdbc:h2:file:***</li><li>服务模式:当成远程的数据库服务,提供给应用程序 jdbc:h2:tcp:***</li></ul><h4 id="嵌入模式整合"><a href="#嵌入模式整合" class="headerlink" title="嵌入模式整合"></a>嵌入模式整合</h4><ul><li><p>Spring Boot 与 H2 整合十分的简单,直接引用 com.h2database:h2 版本号使用 Spring Boot提供的就可以</p></li><li><p>注意事项;</p><ul><li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">H2 数据库报错 Database &quot;XXX&quot; not found, and IFEXISTS=true, so we cant auto-create it [90146] 的解决办法</span><br></pre></td></tr></table></figure></li><li><p>以前的h2数据库当没有数据库的时候,会自动创建一个空的数据库,但是在2019年的版本后,禁止了这项功能,所以如果你对这个功能不在意可以使用 下面的老版本依赖,会自动创建数据库</p></li><li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependency&gt;</span><br><span class="line">        &lt;groupId&gt;com.h2database&lt;/groupId&gt;</span><br><span class="line">        &lt;artifactId&gt;h2&lt;/artifactId&gt;</span><br><span class="line">        &lt;version&gt;1.4.193&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br></pre></td></tr></table></figure></li><li><p>另外一种解决方法就是,版本号还是使用 Spring Boot提供的h2默认版本号,在配置文件中修改如下</p></li><li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">spring.datasource.url=jdbc:h2:file:./h2/data2;IFEXISTS=FALSE;</span><br></pre></td></tr></table></figure></li><li><p>注意:只这样写还是无法自动创建数据库,我们需要手动根据这个地址在启动成功后,手动连接一次数据库</p></li><li><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DesktipApplication</span> </span>&#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger LOGGER = LoggerFactory.getLogger(DesktipApplication.class);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> SQLException </span>&#123;</span><br><span class="line">ConfigurableApplicationContext run = SpringApplication.run(DesktipApplication.class, args);</span><br><span class="line">String url = run.getEnvironment().getProperty(<span class="string">"spring.datasource.url"</span>);</span><br><span class="line">String username = run.getEnvironment().getProperty(<span class="string">"spring.datasource.username"</span>);</span><br><span class="line">String password = run.getEnvironment().getProperty(<span class="string">"spring.datasource.password"</span>);</span><br><span class="line"><span class="comment">//h2 新版本的已经 不能直接创建空的数据库,尝试根据 jdbc链接一次,创建数据库</span></span><br><span class="line">Connection connection = DriverManager.getConnection(url, username, password);</span><br><span class="line">connection.close();</span><br><span class="line">LOGGER.info(<span class="string">"启动成功"</span>);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>常用的配置信息</p></li><li><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">##h2数据库 IFEXISTS=FALSE 没有数据库的时候自动创建 AUTO_SERVER=TRUE 混合模式</span><br><span class="line">spring.datasource.driver-class-name=org.h2.Driver</span><br><span class="line">#jdbc:h2:file:&#123;path&#125; path可以写绝对路径 也可以写相对路径 ~代表当前用户目录 .代表当前目录</span><br><span class="line">spring.datasource.url=jdbc:h2:file:./h2/data2;IFEXISTS=FALSE;AUTO_SERVER=TRUE</span><br><span class="line">spring.datasource.username=sa</span><br><span class="line">spring.datasource.password=</span><br><span class="line">#开启console 可以通过浏览器访问数据库页面</span><br><span class="line">spring.h2.console.enabled=true</span><br><span class="line">#开启h2 console 跟踪 方便调试  默认 false</span><br><span class="line">spring.h2.console.settings.trace=false</span><br><span class="line">#允许console 远程访问 默认false</span><br><span class="line">spring.h2.console.settings.web-allow-others=true</span><br><span class="line">#  h2 访问路径上下文 默认为 h2-console</span><br><span class="line">spring.h2.console.path=/h2-console</span><br></pre></td></tr></table></figure></li></ul></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;Spring-Boot-H2-嵌入模式整合&quot;&gt;&lt;a href=&quot;#Spring-Boot-H2-嵌入模式整合&quot; class=&quot;headerlink&quot; title=&quot;Spring Boot  H2 嵌入模式整合&quot;&gt;&lt;/a&gt;Spring Boot  H2 嵌入模式整合&lt;/h3&gt;&lt;h4 id=&quot;需求&quot;&gt;&lt;a href=&quot;#需求&quot; class=&quot;headerlink&quot; title=&quot;需求&quot;&gt;&lt;/a&gt;需求&lt;/h4&gt;&lt;p&gt;我们已经有一个成熟的WEB报表产品结构了,是BS架构.&lt;/p&gt;
&lt;p&gt;但是在业务场景上,部分定制项目或者说产品需要做单机版.给用户安装的单机版不适合大家统一使用一个远程的数据库服务,我们不得不去研究嵌入式数据库到我们的项目中,让我们的单机版自身带有数据库服务.&lt;/p&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="H2" scheme="https://blog.luckylxh.top/tags/H2/"/>
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
  </entry>
  
  <entry>
    <title>Spring Cloud 和 Spring Cloud Alibaba</title>
    <link href="https://blog.luckylxh.top/2020/04/28/Spring-Cloud-%E5%92%8C-Spring-Cloud-Alibaba/"/>
    <id>https://blog.luckylxh.top/2020/04/28/Spring-Cloud-和-Spring-Cloud-Alibaba/</id>
    <published>2020-04-28T02:19:00.000Z</published>
    <updated>2020-09-23T04:07:37.538Z</updated>
    
    <content type="html"><![CDATA[<p>最近开始研究 <code>Spring Cloud</code> 和 <code>Spring Cloud Alibaba</code>,记录下自己对<code>Spring Boot</code> 和上方两个他们的关系和理解。</p><p><code>Spring Boot</code> 是基于 <code>Sping</code> 的一套快速构建的的脚手架，让开发人员可以快速的构建一个简单的<code>web</code>项目。</p><p>然后随着时间的发展分布式和微服务因为各种优势，进入了各个大佬的眼中，所以<code>Spring Cloud</code>就应用而生了，他专注于因为分布式和微服务，所引入的新问题，比如，网关，服务治理，注册中心等等，定下了一套完整的解决方案，并且这套解决方案有着很好的抽象，方便第三方服务的替代。</p><p>但是随着 <code>Spring Cloud</code>下的多个服务停止支持各个服务的维护和更新，<code>Spring Cloud Alibaba</code>站了出来，他基于 <code>Spring Cloud</code> 很好的抽象标准 用自己的公司下开发的服务，开始逐步替换 <code>Spring Cloud</code>下原本的服务。所以简单来说是 <code>Spring Cloud</code> 提供接口 <code>Spring Cloud Alibaba</code> 是其中的一个实现。 并且 阿里大厂的实力，国内开发人员还是十分信任的，所以现在<code>Spring Cloud Alibaba</code> 也就越来越火了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;最近开始研究 &lt;code&gt;Spring Cloud&lt;/code&gt; 和 &lt;code&gt;Spring Cloud Alibaba&lt;/code&gt;,记录下自己对&lt;code&gt;Spring Boot&lt;/code&gt; 和上方两个他们的关系和理解。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Spring Bo
      
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="SpringCloud" scheme="https://blog.luckylxh.top/tags/SpringCloud/"/>
    
  </entry>
  
  <entry>
    <title>Excel 条件格式存储结构浅析</title>
    <link href="https://blog.luckylxh.top/2020/03/04/Excel-%E6%9D%A1%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84%E6%B5%85%E6%9E%90/"/>
    <id>https://blog.luckylxh.top/2020/03/04/Excel-条件格式存储结构浅析/</id>
    <published>2020-03-04T06:10:00.000Z</published>
    <updated>2020-09-23T04:06:54.034Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Excel条件格式"><a href="#Excel条件格式" class="headerlink" title="Excel条件格式"></a>Excel条件格式</h2><ul><li>在Excel表格中进行数据分析时，您可能需要通过一些特征条件来找到特定的数据，还可能需要用更直观的方法来展现数据规律。</li></ul><a id="more"></a><h3 id="手写公式的条件格式"><a href="#手写公式的条件格式" class="headerlink" title="手写公式的条件格式"></a>手写公式的条件格式</h3><h4 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h4><ul><li>原始数据如下</li></ul><p><img src="/images/pasted-61.png" alt="upload successful"></p><ul><li>要求<ul><li>公司将进行一次内部晋升，需要将年龄为30岁以下的所有“研究员” 用蓝色背景标识出来</li><li>公司将进行一次内部晋升，需要将年龄为25岁以下的所有“研究员” 用红色背景色标识出来</li><li>公司将进行一次内部晋升，需要将年龄为20岁以下的所有“研究员” 用下划线 标识出来（探讨 如果为真则停止 这个勾选框）</li></ul></li></ul><h4 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h4><ul><li>一个条件</li></ul><p><img src="/images/pasted-62.png" alt="upload successful"></p><ul><li>二个样式冲突的条件</li></ul><p><img src="/images/pasted-63.png" alt="upload successful"></p><ul><li>样式不冲突的条件</li></ul><p><img src="/images/pasted-64.png" alt="upload successful"></p><ul><li>如果为真则停止</li></ul><p><img src="/images/pasted-65.png" alt="upload successful"></p><p>做了几个效果图方便理解 Excel中条件格式的各种行为和设置，下面我们看存储结构吧</p><h4 id="存储"><a href="#存储" class="headerlink" title="存储"></a>存储</h4><ul><li>sheet.xml</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:F33"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">tabSelected</span>=<span class="string">"1"</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"A2"</span> <span class="attr">sqref</span>=<span class="string">"A2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"13.5"</span> <span class="attr">outlineLevelCol</span>=<span class="string">"5"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">cols</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"5"</span> <span class="attr">max</span>=<span class="string">"5"</span> <span class="attr">width</span>=<span class="string">"28.25"</span> <span class="attr">customWidth</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">col</span> <span class="attr">min</span>=<span class="string">"6"</span> <span class="attr">max</span>=<span class="string">"6"</span> <span class="attr">width</span>=<span class="string">"48.75"</span> <span class="attr">customWidth</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">cols</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetData</span>&gt;</span></span><br><span class="line">        *****</span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetData</span>&gt;</span></span><br><span class="line">    //sqref 应用位置 expression 表达式  formula 公式  priority 优先（越小越优先） stopIfTrue 是否 //为真停止   dxfId 对应 styles.xml中的的 <span class="tag">&lt;<span class="name">dxfs</span> /&gt;</span> 下的元素下标</span><br><span class="line">    <span class="tag">&lt;<span class="name">conditionalFormatting</span> <span class="attr">sqref</span>=<span class="string">"A2:D13"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cfRule</span> <span class="attr">type</span>=<span class="string">"expression"</span> <span class="attr">dxfId</span>=<span class="string">"0"</span> <span class="attr">priority</span>=<span class="string">"5"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">formula</span>&gt;</span>($C2=&amp;quot;研究员&amp;quot;)*($D2&amp;lt;30)<span class="tag">&lt;/<span class="name">formula</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cfRule</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cfRule</span> <span class="attr">type</span>=<span class="string">"expression"</span> <span class="attr">dxfId</span>=<span class="string">"1"</span> <span class="attr">priority</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">formula</span>&gt;</span>($C2=&amp;quot;研究员&amp;quot;)*($D2&amp;lt;25)<span class="tag">&lt;/<span class="name">formula</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cfRule</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cfRule</span> <span class="attr">type</span>=<span class="string">"expression"</span> <span class="attr">dxfId</span>=<span class="string">"2"</span> <span class="attr">priority</span>=<span class="string">"1"</span> <span class="attr">stopIfTrue</span>=<span class="string">"1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">formula</span>&gt;</span>($C2=&amp;quot;研究员&amp;quot;)*($D2&amp;lt;20)<span class="tag">&lt;/<span class="name">formula</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cfRule</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">conditionalFormatting</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.75"</span> <span class="attr">right</span>=<span class="string">"0.75"</span> <span class="attr">top</span>=<span class="string">"1"</span> <span class="attr">bottom</span>=<span class="string">"1"</span> <span class="attr">header</span>=<span class="string">"0.5"</span> <span class="attr">footer</span>=<span class="string">"0.5"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure><ul><li><p>styles.xml</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">styleSheet</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">numFmts</span> <span class="attr">count</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">numFmt</span> <span class="attr">numFmtId</span>=<span class="string">"44"</span> <span class="attr">formatCode</span>=<span class="string">"_ &amp;quot;￥&amp;quot;* #,##0.00_ ;_ &amp;quot;￥&amp;quot;* \-#,##0.00_ ;_ &amp;quot;￥&amp;quot;* &amp;quot;-&amp;quot;??_ ;_ @_ "</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">numFmt</span> <span class="attr">numFmtId</span>=<span class="string">"41"</span> <span class="attr">formatCode</span>=<span class="string">"_ * #,##0_ ;_ * \-#,##0_ ;_ * &amp;quot;-&amp;quot;_ ;_ @_ "</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">numFmt</span> <span class="attr">numFmtId</span>=<span class="string">"42"</span> <span class="attr">formatCode</span>=<span class="string">"_ &amp;quot;￥&amp;quot;* #,##0_ ;_ &amp;quot;￥&amp;quot;* \-#,##0_ ;_ &amp;quot;￥&amp;quot;* &amp;quot;-&amp;quot;_ ;_ @_ "</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">numFmt</span> <span class="attr">numFmtId</span>=<span class="string">"43"</span> <span class="attr">formatCode</span>=<span class="string">"_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &amp;quot;-&amp;quot;??_ ;_ @_ "</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">numFmts</span>&gt;</span></span><br><span class="line">    ******</span><br><span class="line">    //条件格式的样式</span><br><span class="line">    <span class="tag">&lt;<span class="name">dxfs</span> <span class="attr">count</span>=<span class="string">"3"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dxf</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">fill</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">patternFill</span> <span class="attr">patternType</span>=<span class="string">"solid"</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">bgColor</span> <span class="attr">rgb</span>=<span class="string">"FF00B0F0"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">patternFill</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">fill</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dxf</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dxf</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">fill</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">patternFill</span> <span class="attr">patternType</span>=<span class="string">"solid"</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">bgColor</span> <span class="attr">rgb</span>=<span class="string">"FFFF0000"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">patternFill</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">fill</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dxf</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dxf</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">font</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">strike</span> <span class="attr">val</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">font</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">dxf</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dxfs</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tableStyles</span> <span class="attr">count</span>=<span class="string">"0"</span> <span class="attr">defaultTableStyle</span>=<span class="string">"TableStyleMedium2"</span> <span class="attr">defaultPivotStyle</span>=<span class="string">"PivotStyleLight16"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">extLst</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">ext</span> <span class="attr">uri</span>=<span class="string">"&#123;EB79DEF2-80B8-43e5-95BD-54CBDDF9020C&#125;"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x14:slicerStyles</span> <span class="attr">defaultSlicerStyle</span>=<span class="string">"SlicerStyleLight1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">ext</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">extLst</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">styleSheet</span>&gt;</span></span><br></pre></td></tr></table></figure><p>上述两个 xml文件 存储结构对应 效果图 还是比较好理解的</p></li></ul><h3 id="Excel自带的条件格式"><a href="#Excel自带的条件格式" class="headerlink" title="Excel自带的条件格式"></a>Excel自带的条件格式</h3><ul><li>Excel中自己带有的部分简便的条件公式。可以探讨下它的存储结构</li></ul><p><img src="/images/pasted-66.png" alt="upload successful"></p><ul><li>效果图</li></ul><p><img src="/images/pasted-67.png" alt="upload successful"></p><ul><li>存储</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">worksheet</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:xdr</span>=<span class="string">"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:mc</span>=<span class="string">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:etc</span>=<span class="string">"http://www.wps.cn/officeDocument/2017/etCustomData"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetPr</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dimension</span> <span class="attr">ref</span>=<span class="string">"A1:G22"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">sheetView</span> <span class="attr">workbookViewId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">selection</span> <span class="attr">activeCell</span>=<span class="string">"J11"</span> <span class="attr">sqref</span>=<span class="string">"J11"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">sheetView</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sheetViews</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sheetFormatPr</span> <span class="attr">defaultColWidth</span>=<span class="string">"9"</span> <span class="attr">defaultRowHeight</span>=<span class="string">"13.5"</span> <span class="attr">outlineLevelCol</span>=<span class="string">"6"</span>/&gt;</span></span><br><span class="line">    *********</span><br><span class="line">    </span><br><span class="line">    </span><br><span class="line">    // sqref 应用位置 type:dataBar和 colorScale 应该是Excel自己带的两个类型</span><br><span class="line">    <span class="tag">&lt;<span class="name">conditionalFormatting</span> <span class="attr">sqref</span>=<span class="string">"A2:D13"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cfRule</span> <span class="attr">type</span>=<span class="string">"dataBar"</span> <span class="attr">priority</span>=<span class="string">"2"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">dataBar</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">cfvo</span> <span class="attr">type</span>=<span class="string">"min"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">cfvo</span> <span class="attr">type</span>=<span class="string">"max"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">color</span> <span class="attr">rgb</span>=<span class="string">"FF638EC6"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">dataBar</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">extLst</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">ext</span> <span class="attr">uri</span>=<span class="string">"&#123;B025F937-C7B1-47D3-B67F-A62EFF666E3E&#125;"</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">x14:id</span>&gt;</span>&#123;be709f9a-bb79-4f30-badf-ed91d38783ef&#125;<span class="tag">&lt;/<span class="name">x14:id</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">ext</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">extLst</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cfRule</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cfRule</span> <span class="attr">type</span>=<span class="string">"colorScale"</span> <span class="attr">priority</span>=<span class="string">"1"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">colorScale</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">cfvo</span> <span class="attr">type</span>=<span class="string">"min"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">cfvo</span> <span class="attr">type</span>=<span class="string">"percentile"</span> <span class="attr">val</span>=<span class="string">"50"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">cfvo</span> <span class="attr">type</span>=<span class="string">"max"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">color</span> <span class="attr">rgb</span>=<span class="string">"FFF8696B"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">color</span> <span class="attr">rgb</span>=<span class="string">"FFFFEB84"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">color</span> <span class="attr">rgb</span>=<span class="string">"FF63BE7B"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">colorScale</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cfRule</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">conditionalFormatting</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pageMargins</span> <span class="attr">left</span>=<span class="string">"0.75"</span> <span class="attr">right</span>=<span class="string">"0.75"</span> <span class="attr">top</span>=<span class="string">"1"</span> <span class="attr">bottom</span>=<span class="string">"1"</span> <span class="attr">header</span>=<span class="string">"0.5"</span> <span class="attr">footer</span>=<span class="string">"0.5"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">headerFooter</span>/&gt;</span></span><br><span class="line">    //这里也有一些扩展属性</span><br><span class="line">    <span class="tag">&lt;<span class="name">extLst</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">ext</span> <span class="attr">uri</span>=<span class="string">"&#123;78C0D931-6437-407d-A8EE-F0AAD7539E65&#125;"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x14:conditionalFormattings</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">x14:conditionalFormatting</span></span></span><br><span class="line"><span class="tag">                    <span class="attr">xmlns:xm</span>=<span class="string">"http://schemas.microsoft.com/office/excel/2006/main"</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">x14:cfRule</span> <span class="attr">type</span>=<span class="string">"dataBar"</span> <span class="attr">id</span>=<span class="string">"&#123;be709f9a-bb79-4f30-badf-ed91d38783ef&#125;"</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">x14:dataBar</span> <span class="attr">minLength</span>=<span class="string">"0"</span> <span class="attr">maxLength</span>=<span class="string">"100"</span> <span class="attr">border</span>=<span class="string">"1"</span> <span class="attr">negativeBarBorderColorSameAsPositive</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:cfvo</span> <span class="attr">type</span>=<span class="string">"autoMin"</span>/&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:cfvo</span> <span class="attr">type</span>=<span class="string">"autoMax"</span>/&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:borderColor</span> <span class="attr">rgb</span>=<span class="string">"FF638EC6"</span>/&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:negativeFillColor</span> <span class="attr">rgb</span>=<span class="string">"FFFF0000"</span>/&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:negativeBorderColor</span> <span class="attr">rgb</span>=<span class="string">"FFFF0000"</span>/&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">x14:axisColor</span> <span class="attr">rgb</span>=<span class="string">"FF000000"</span>/&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">x14:dataBar</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">x14:cfRule</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">xm:sqref</span>&gt;</span>A2:D13<span class="tag">&lt;/<span class="name">xm:sqref</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">x14:conditionalFormatting</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">x14:conditionalFormattings</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">ext</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">extLst</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">worksheet</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这里看存储结构，就没有 手写公式那么的清晰明了。涉及到Excel程序的内容就过多了</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;Excel条件格式&quot;&gt;&lt;a href=&quot;#Excel条件格式&quot; class=&quot;headerlink&quot; title=&quot;Excel条件格式&quot;&gt;&lt;/a&gt;Excel条件格式&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;在Excel表格中进行数据分析时，您可能需要通过一些特征条件来找到特定的数据，还可能需要用更直观的方法来展现数据规律。&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="Excel" scheme="https://blog.luckylxh.top/categories/Excel/"/>
    
    
      <category term="Excel" scheme="https://blog.luckylxh.top/tags/Excel/"/>
    
  </entry>
  
  <entry>
    <title>Excel 数据透视表存储结构浅析</title>
    <link href="https://blog.luckylxh.top/2020/03/04/Excel-%E6%95%B0%E6%8D%AE%E9%80%8F%E8%A7%86%E8%A1%A8%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84%E6%B5%85%E6%9E%90/"/>
    <id>https://blog.luckylxh.top/2020/03/04/Excel-数据透视表存储结构浅析/</id>
    <published>2020-03-04T06:05:00.000Z</published>
    <updated>2020-09-23T04:06:34.832Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Excel-数据透视表"><a href="#Excel-数据透视表" class="headerlink" title="Excel 数据透视表"></a>Excel 数据透视表</h2><ul><li>接上篇文章 说下 数据透视表的结构</li></ul><a id="more"></a><h3 id="XML存储结构"><a href="#XML存储结构" class="headerlink" title="XML存储结构"></a>XML存储结构</h3><ul><li><p>先看四个图</p></li><li><p>图一 Excel 展示样式</p></li></ul><p><img src="/images/pasted-57.png" alt="upload successful"></p><ul><li>图二 Excel 展示样式</li></ul><p><img src="/images/pasted-58.png" alt="upload successful"></p><ul><li>图三 Excel解压后的结构</li></ul><p><img src="/images/pasted-59.png" alt="upload successful"></p><ul><li>图四 简要描述</li></ul><p><img src="/images/pasted-60.png" alt="upload successful"></p><h4 id="pivotCache"><a href="#pivotCache" class="headerlink" title="pivotCache"></a>pivotCache</h4><ul><li>数据透视表的数据源 可能多种多样，所以 Excel在存储上 对原始数据做了备份处理，这个pivotCache就是存储的备份数据，所以你改变了源数据值，数据透视表不会实时刷新，需要 手动刷新的原因</li></ul><h5 id="pivotCacheDefinition1-xml"><a href="#pivotCacheDefinition1-xml" class="headerlink" title="pivotCacheDefinition1.xml"></a>pivotCacheDefinition1.xml</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">pivotCacheDefinition</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">r:id</span>=<span class="string">"rId1"</span> <span class="attr">createdVersion</span>=<span class="string">"5"</span> <span class="attr">refreshedVersion</span>=<span class="string">"5"</span> <span class="attr">minRefreshableVersion</span>=<span class="string">"3"</span> <span class="attr">refreshedDate</span>=<span class="string">"43893.4935185185"</span> <span class="attr">refreshedBy</span>=<span class="string">"Administrator"</span> <span class="attr">recordCount</span>=<span class="string">"9"</span>&gt;</span></span><br><span class="line">    //数据源 源数据 来自 我是第二个  的 A4:C13 区域 </span><br><span class="line">    <span class="tag">&lt;<span class="name">cacheSource</span> <span class="attr">type</span>=<span class="string">"worksheet"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">worksheetSource</span> <span class="attr">ref</span>=<span class="string">"A4:C13"</span> <span class="attr">sheet</span>=<span class="string">"我是第二个"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">cacheSource</span>&gt;</span></span><br><span class="line">    // name  姓名 科目 分数 为源数据3列  </span><br><span class="line">    <span class="tag">&lt;<span class="name">cacheFields</span> <span class="attr">count</span>=<span class="string">"3"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cacheField</span> <span class="attr">name</span>=<span class="string">"姓名"</span> <span class="attr">numFmtId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">sharedItems</span> <span class="attr">count</span>=<span class="string">"3"</span>&gt;</span></span><br><span class="line">                //<span class="tag">&lt;<span class="name">s</span>/&gt;</span> 代表是字符串</span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"小李"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"小张"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"小王"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">sharedItems</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cacheField</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cacheField</span> <span class="attr">name</span>=<span class="string">"科目"</span> <span class="attr">numFmtId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">sharedItems</span> <span class="attr">count</span>=<span class="string">"3"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"数学"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"英语"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">s</span> <span class="attr">v</span>=<span class="string">"语文"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">sharedItems</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cacheField</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">cacheField</span> <span class="attr">name</span>=<span class="string">"分数"</span> <span class="attr">numFmtId</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">sharedItems</span> <span class="attr">containsSemiMixedTypes</span>=<span class="string">"0"</span> <span class="attr">containsString</span>=<span class="string">"0"</span> <span class="attr">containsNumber</span>=<span class="string">"1"</span> <span class="attr">containsInteger</span>=<span class="string">"1"</span> <span class="attr">minValue</span>=<span class="string">"45"</span> <span class="attr">maxValue</span>=<span class="string">"99"</span> <span class="attr">count</span>=<span class="string">"9"</span>&gt;</span></span><br><span class="line">                //<span class="tag">&lt;<span class="name">n</span>&gt;</span><span class="tag">&lt;/<span class="name">n</span>&gt;</span> 代表是数值</span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"91"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"89"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"78"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"56"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"68"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"69"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"77"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"99"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">n</span> <span class="attr">v</span>=<span class="string">"45"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">sharedItems</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">cacheField</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">cacheFields</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">pivotCacheDefinition</span>&gt;</span></span><br></pre></td></tr></table></figure><p>pivotCacheDefinition1.xml 记录了原有的所有数据，但是还不够，因为 原先在Excel上 数据都是一行一列的，每个分数都可以找到对应的学生和科目，而pivotCacheDefinition1.xml  明显没有满足这个需求</p><h5 id="pivotCacheRecords1-xml"><a href="#pivotCacheRecords1-xml" class="headerlink" title="pivotCacheRecords1.xml"></a>pivotCacheRecords1.xml</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">pivotCacheRecords</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns:r</span>=<span class="string">"http://schemas.openxmlformats.org/officeDocument/2006/relationships"</span> <span class="attr">count</span>=<span class="string">"9"</span>&gt;</span></span><br><span class="line">    //  <span class="tag">&lt;<span class="name">r</span>/&gt;</span> 代表源数据的一行   <span class="tag">&lt;<span class="name">x</span>/&gt;</span> 的下标对应  pivotCacheDefinition1.xml 中 <span class="tag">&lt;<span class="name">cacheField</span>/&gt;</span> 在   // <span class="tag">&lt;<span class="name">cacheFields</span>/&gt;</span>中的下标，属性元素 v对应的值 是  <span class="tag">&lt;<span class="name">sharedItems</span>/&gt;</span> 中 元素的下标 </span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span> //小李</span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span> //数学</span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span> //91</span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span>//小张</span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span>//数学</span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span>//89</span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"3"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"4"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"5"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"6"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"7"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">r</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"8"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">r</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">pivotCacheRecords</span>&gt;</span></span><br></pre></td></tr></table></figure><p>pivotCacheRecords1.xml 就把数据串联了起来</p><h4 id="pivotTables"><a href="#pivotTables" class="headerlink" title="pivotTables"></a>pivotTables</h4><ul><li>记录数据透视表格</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span><br><span class="line">//属性记录 名称，格式，边框，高度等</span><br><span class="line"><span class="tag">&lt;<span class="name">pivotTableDefinition</span></span></span><br><span class="line"><span class="tag">    <span class="attr">xmlns</span>=<span class="string">"http://schemas.openxmlformats.org/spreadsheetml/2006/main"</span> <span class="attr">name</span>=<span class="string">"数据透视表1"</span> <span class="attr">cacheId</span>=<span class="string">"0"</span> <span class="attr">autoFormatId</span>=<span class="string">"1"</span> <span class="attr">applyNumberFormats</span>=<span class="string">"0"</span> <span class="attr">applyBorderFormats</span>=<span class="string">"0"</span> <span class="attr">applyFontFormats</span>=<span class="string">"0"</span> <span class="attr">applyPatternFormats</span>=<span class="string">"0"</span> <span class="attr">applyAlignmentFormats</span>=<span class="string">"0"</span> <span class="attr">applyWidthHeightFormats</span>=<span class="string">"1"</span> <span class="attr">dataCaption</span>=<span class="string">"值"</span> <span class="attr">updatedVersion</span>=<span class="string">"5"</span> <span class="attr">minRefreshableVersion</span>=<span class="string">"3"</span> <span class="attr">createdVersion</span>=<span class="string">"5"</span> <span class="attr">useAutoFormatting</span>=<span class="string">"1"</span> <span class="attr">compact</span>=<span class="string">"0"</span> <span class="attr">indent</span>=<span class="string">"0"</span> <span class="attr">outline</span>=<span class="string">"1"</span> <span class="attr">compactData</span>=<span class="string">"0"</span> <span class="attr">outlineData</span>=<span class="string">"1"</span> <span class="attr">showDrill</span>=<span class="string">"1"</span> <span class="attr">multipleFieldFilters</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">    //数据透视表 展示位置</span><br><span class="line">    <span class="tag">&lt;<span class="name">location</span> <span class="attr">ref</span>=<span class="string">"G4:H8"</span> <span class="attr">firstHeaderRow</span>=<span class="string">"1"</span> <span class="attr">firstDataRow</span>=<span class="string">"1"</span> <span class="attr">firstDataCol</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">    //三列属性 姓名 科目  分数</span><br><span class="line">    <span class="tag">&lt;<span class="name">pivotFields</span> <span class="attr">count</span>=<span class="string">"3"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">pivotField</span> <span class="attr">axis</span>=<span class="string">"axisRow"</span> <span class="attr">compact</span>=<span class="string">"0"</span> <span class="attr">showAll</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">items</span> <span class="attr">count</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">t</span>=<span class="string">"default"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">pivotField</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">pivotField</span> <span class="attr">compact</span>=<span class="string">"0"</span> <span class="attr">showAll</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">items</span> <span class="attr">count</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">t</span>=<span class="string">"default"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">pivotField</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">pivotField</span> <span class="attr">dataField</span>=<span class="string">"1"</span> <span class="attr">compact</span>=<span class="string">"0"</span> <span class="attr">showAll</span>=<span class="string">"0"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">items</span> <span class="attr">count</span>=<span class="string">"10"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"8"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"3"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"4"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"6"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"7"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">x</span>=<span class="string">"5"</span>/&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">item</span> <span class="attr">t</span>=<span class="string">"default"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">items</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">pivotField</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">pivotFields</span>&gt;</span></span><br><span class="line">    //行过滤选择 x= 0  就是上方第一个 姓名</span><br><span class="line">    <span class="tag">&lt;<span class="name">rowFields</span> <span class="attr">count</span>=<span class="string">"1"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">field</span> <span class="attr">x</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">rowFields</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">rowItems</span> <span class="attr">count</span>=<span class="string">"4"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x</span> <span class="attr">v</span>=<span class="string">"2"</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">t</span>=<span class="string">"grand"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">rowItems</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">colItems</span> <span class="attr">count</span>=<span class="string">"1"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">colItems</span>&gt;</span></span><br><span class="line">    //值 对应 fld = 2  对应第三个</span><br><span class="line">    <span class="tag">&lt;<span class="name">dataFields</span> <span class="attr">count</span>=<span class="string">"1"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">dataField</span> <span class="attr">name</span>=<span class="string">"求和项:分数"</span> <span class="attr">fld</span>=<span class="string">"2"</span> <span class="attr">baseField</span>=<span class="string">"0"</span> <span class="attr">baseItem</span>=<span class="string">"0"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dataFields</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pivotTableStyleInfo</span> <span class="attr">name</span>=<span class="string">"PivotStyleLight16"</span> <span class="attr">showRowHeaders</span>=<span class="string">"1"</span> <span class="attr">showColHeaders</span>=<span class="string">"1"</span> <span class="attr">showLastColumn</span>=<span class="string">"1"</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">extLst</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">ext</span> <span class="attr">uri</span>=<span class="string">"&#123;962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2&#125;"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">xmlns:x14</span>=<span class="string">"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">x14:pivotTableDefinition</span> <span class="attr">hideValuesRow</span>=<span class="string">"1"</span></span></span><br><span class="line"><span class="tag">                <span class="attr">xmlns:xm</span>=<span class="string">"http://schemas.microsoft.com/office/excel/2006/main"</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">ext</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">extLst</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">pivotTableDefinition</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;Excel-数据透视表&quot;&gt;&lt;a href=&quot;#Excel-数据透视表&quot; class=&quot;headerlink&quot; title=&quot;Excel 数据透视表&quot;&gt;&lt;/a&gt;Excel 数据透视表&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;接上篇文章 说下 数据透视表的结构&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="Excel" scheme="https://blog.luckylxh.top/categories/Excel/"/>
    
    
      <category term="Excel" scheme="https://blog.luckylxh.top/tags/Excel/"/>
    
  </entry>
  
  <entry>
    <title>Excel存储结构浅析</title>
    <link href="https://blog.luckylxh.top/2020/03/04/Excel%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84%E6%B5%85%E6%9E%90/"/>
    <id>https://blog.luckylxh.top/2020/03/04/Excel存储结构浅析/</id>
    <published>2020-03-04T04:30:00.000Z</published>
    <updated>2020-09-23T04:06:15.235Z</updated>
    
    <content type="html"><![CDATA[<h4 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h4><ul><li><p>最近项目上想要对现在用的表格组件进行底层重构，所以对类似的产品Excel的存储结构上是否有可以借鉴的地方，所以就有了今天的这篇文章。</p></li><li><p>文章主要探讨Excel数据存储，样式存储，合并单元格信息存储等基础数据的存储，细分Excel解压后的各个文件的职责，和存储结构。</p></li></ul><a id="more"></a><h4 id="Excel-展示图"><a href="#Excel-展示图" class="headerlink" title="Excel 展示图"></a>Excel 展示图</h4><p><img src="/images/pasted-53.png" alt="upload successful"></p><h4 id="Excel-结构图"><a href="#Excel-结构图" class="headerlink" title="Excel 结构图"></a>Excel 结构图</h4><p><img src="/images/pasted-54.png" alt="upload successful"></p><ul><li>需要重点介绍的其实都在 xl文件夹中</li></ul><p><img src="/images/pasted-55.png" alt="upload successful"></p><h5 id="worksheets-sheet-xml"><a href="#worksheets-sheet-xml" class="headerlink" title="worksheets/sheet.xml"></a>worksheets/sheet.xml</h5><ul><li>记录一个sheet页的行、列、单元格、合并等信息<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;</span><br><span class="line">&lt;worksheet</span><br><span class="line">    xmlns=&quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&quot;</span><br><span class="line">    xmlns:r=&quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships&quot;</span><br><span class="line">    xmlns:xdr=&quot;http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing&quot;</span><br><span class="line">    xmlns:x14=&quot;http://schemas.microsoft.com/office/spreadsheetml/2009/9/main&quot;</span><br><span class="line">    xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;</span><br><span class="line">    xmlns:etc=&quot;http://www.wps.cn/officeDocument/2017/etCustomData&quot;&gt;</span><br><span class="line">    &lt;sheetPr/&gt;</span><br><span class="line">    //单元格分布</span><br><span class="line">    &lt;dimension ref=&quot;A1:D15&quot;/&gt;</span><br><span class="line">    //打开默认选中单元格</span><br><span class="line">    &lt;sheetViews&gt;</span><br><span class="line">        &lt;sheetView workbookViewId=&quot;0&quot;&gt;</span><br><span class="line">            &lt;selection activeCell=&quot;M7&quot; sqref=&quot;M7&quot;/&gt;</span><br><span class="line">        &lt;/sheetView&gt;</span><br><span class="line">    &lt;/sheetViews&gt;</span><br><span class="line">    //默认的行高 宽高等</span><br><span class="line">    &lt;sheetFormatPr defaultColWidth=&quot;9&quot; defaultRowHeight=&quot;13.5&quot; outlineLevelCol=&quot;3&quot;/&gt;</span><br><span class="line">    //列信息</span><br><span class="line">    &lt;cols&gt;</span><br><span class="line">        &lt;col min=&quot;2&quot; max=&quot;2&quot; width=&quot;19.375&quot; customWidth=&quot;1&quot;/&gt;</span><br><span class="line">        &lt;col min=&quot;4&quot; max=&quot;4&quot; width=&quot;18.25&quot; customWidth=&quot;1&quot;/&gt;</span><br><span class="line">    &lt;/cols&gt;</span><br><span class="line">    //按照行 罗列每个单元格信息</span><br><span class="line">    &lt;sheetData&gt;</span><br><span class="line">        &lt;row r=&quot;1&quot; ht=&quot;14.25&quot; spans=&quot;1:1&quot;&gt;</span><br><span class="line">            // t = s 单表 共享字符串 shareStrings.xml，&lt;v&gt; 中是存放的下标</span><br><span class="line">            &lt;c r=&quot;A1&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;15&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;2&quot; ht=&quot;14.25&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">        // s = 4  是单元格的样式 存放到 styles.xml中的 &lt;cellXfs&gt; 节点元素的下标</span><br><span class="line">            &lt;c r=&quot;B2&quot; s=&quot;4&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;16&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;3&quot; ht=&quot;30&quot; customHeight=&quot;1&quot; spans=&quot;2:4&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B3&quot; s=&quot;5&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;17&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">            &lt;c r=&quot;D3&quot; s=&quot;6&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;18&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;4&quot; ht=&quot;14.25&quot;/&gt;</span><br><span class="line">        &lt;row r=&quot;5&quot; ht=&quot;14.25&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B5&quot; s=&quot;7&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;19&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;6&quot; ht=&quot;14.25&quot; spans=&quot;3:4&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;C6&quot; s=&quot;8&quot; t=&quot;s&quot;&gt;</span><br><span class="line">                &lt;v&gt;20&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">            &lt;c r=&quot;D6&quot; s=&quot;8&quot;/&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;7&quot; ht=&quot;14.25&quot; spans=&quot;2:4&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B7&quot;&gt;</span><br><span class="line">                &lt;v&gt;1&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">            &lt;c r=&quot;C7&quot; s=&quot;9&quot;/&gt;</span><br><span class="line">            &lt;c r=&quot;D7&quot; s=&quot;9&quot;/&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;8&quot; ht=&quot;14.25&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B8&quot;&gt;</span><br><span class="line">                &lt;v&gt;2&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;9&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B9&quot;&gt;</span><br><span class="line">            //求和公式</span><br><span class="line">                &lt;f&gt;SUM(B7:B8)&lt;/f&gt;</span><br><span class="line">                &lt;v&gt;3&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;13&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B13&quot;&gt;</span><br><span class="line">                &lt;v&gt;1&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;14&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B14&quot;&gt;</span><br><span class="line">                &lt;v&gt;2&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">        &lt;row r=&quot;15&quot; spans=&quot;2:2&quot;&gt;</span><br><span class="line">            &lt;c r=&quot;B15&quot;&gt;</span><br><span class="line">            //求和公式</span><br><span class="line">                &lt;f&gt;SUM(B13:B14)&lt;/f&gt;</span><br><span class="line">                &lt;v&gt;3&lt;/v&gt;</span><br><span class="line">            &lt;/c&gt;</span><br><span class="line">        &lt;/row&gt;</span><br><span class="line">    &lt;/sheetData&gt;</span><br><span class="line">    //合并单元格信息，合并单元格中的值，由左上角单元格记录</span><br><span class="line">    &lt;mergeCells count=&quot;1&quot;&gt;</span><br><span class="line">        &lt;mergeCell ref=&quot;C6:D7&quot;/&gt;</span><br><span class="line">    &lt;/mergeCells&gt;</span><br><span class="line">    //条件公式信息，暂不讲解</span><br><span class="line">    &lt;conditionalFormatting sqref=&quot;B8:B9&quot;&gt;</span><br><span class="line">        &lt;cfRule type=&quot;colorScale&quot; priority=&quot;1&quot;&gt;</span><br><span class="line">            &lt;colorScale&gt;</span><br><span class="line">                &lt;cfvo type=&quot;min&quot;/&gt;</span><br><span class="line">                &lt;cfvo type=&quot;percentile&quot; val=&quot;50&quot;/&gt;</span><br><span class="line">                &lt;cfvo type=&quot;max&quot;/&gt;</span><br><span class="line">                &lt;color rgb=&quot;FFF8696B&quot;/&gt;</span><br><span class="line">                &lt;color rgb=&quot;FFFFEB84&quot;/&gt;</span><br><span class="line">                &lt;color rgb=&quot;FF63BE7B&quot;/&gt;</span><br><span class="line">            &lt;/colorScale&gt;</span><br><span class="line">        &lt;/cfRule&gt;</span><br><span class="line">    &lt;/conditionalFormatting&gt;</span><br><span class="line">    //打印用的 页边距</span><br><span class="line">    &lt;pageMargins left=&quot;0.699305555555556&quot; right=&quot;0.699305555555556&quot; top=&quot;0.75&quot; bottom=&quot;0.75&quot; header=&quot;0.3&quot; footer=&quot;0.3&quot;/&gt;</span><br><span class="line">    //打印纸张等</span><br><span class="line">    &lt;pageSetup paperSize=&quot;9&quot; orientation=&quot;portrait&quot;/&gt;</span><br><span class="line">    //页眉页脚</span><br><span class="line">    &lt;headerFooter/&gt;</span><br><span class="line">    //图表 对应 drawings 文件夹</span><br><span class="line">    &lt;drawing r:id=&quot;rId1&quot;/&gt;</span><br><span class="line">&lt;/worksheet&gt;</span><br></pre></td></tr></table></figure></li></ul><h5 id="shareStrings-xml"><a href="#shareStrings-xml" class="headerlink" title="shareStrings.xml"></a>shareStrings.xml</h5><ul><li>共享字符串文件，记录每个sheet页中单元格的文本信息，而sheet.xml中只记录下标。<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;</span><br><span class="line">&lt;sst</span><br><span class="line">    xmlns=&quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&quot; count=&quot;103&quot; uniqueCount=&quot;49&quot;&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;表头&lt;/t&gt; // 例如这个 在 sheet.xml中就 只记录 0 的下标</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;表列&lt;/t&gt;// 例如这个 在 sheet.xml中就 只记录 1 的下标</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    *****</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;数学&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;小张&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;小王&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;英语&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;总计&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;语文&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;测试&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;B2我有上和右边&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;我B3有上下粗边框&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;D3我有左右&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;B5 斜线&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;我是合并信息&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;你好&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    &lt;si&gt;</span><br><span class="line">        &lt;t&gt;我是百度&lt;/t&gt;</span><br><span class="line">    &lt;/si&gt;</span><br><span class="line">    *****</span><br><span class="line">&lt;/sst&gt;</span><br></pre></td></tr></table></figure></li></ul><h5 id="styles-xml"><a href="#styles-xml" class="headerlink" title="styles.xml"></a>styles.xml</h5><ul><li>样式文件，记录整个Excel的单元格样式信息</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;</span><br><span class="line">&lt;styleSheet</span><br><span class="line">    xmlns=&quot;http://schemas.openxmlformats.org/spreadsheetml/2006/main&quot;&gt;</span><br><span class="line">    //数字格式化信息</span><br><span class="line">    &lt;numFmts count=&quot;4&quot;&gt;</span><br><span class="line">        &lt;numFmt numFmtId=&quot;44&quot; formatCode=&quot;_ &amp;quot;￥&amp;quot;* #,##0.00_ ;_ &amp;quot;￥&amp;quot;* \-#,##0.00_ ;_ &amp;quot;￥&amp;quot;* &amp;quot;-&amp;quot;??_ ;_ @_ &quot;/&gt;</span><br><span class="line">        &lt;numFmt numFmtId=&quot;41&quot; formatCode=&quot;_ * #,##0_ ;_ * \-#,##0_ ;_ * &amp;quot;-&amp;quot;_ ;_ @_ &quot;/&gt;</span><br><span class="line">        &lt;numFmt numFmtId=&quot;42&quot; formatCode=&quot;_ &amp;quot;￥&amp;quot;* #,##0_ ;_ &amp;quot;￥&amp;quot;* \-#,##0_ ;_ &amp;quot;￥&amp;quot;* &amp;quot;-&amp;quot;_ ;_ @_ &quot;/&gt;</span><br><span class="line">        &lt;numFmt numFmtId=&quot;43&quot; formatCode=&quot;_ * #,##0.00_ ;_ * \-#,##0.00_ ;_ * &amp;quot;-&amp;quot;??_ ;_ @_ &quot;/&gt;</span><br><span class="line">    &lt;/numFmts&gt;</span><br><span class="line">    //字体信息</span><br><span class="line">    &lt;fonts count=&quot;20&quot;&gt;</span><br><span class="line">        &lt;font&gt;</span><br><span class="line">            &lt;sz val=&quot;11&quot;/&gt;</span><br><span class="line">            &lt;color theme=&quot;1&quot;/&gt;</span><br><span class="line">            &lt;name val=&quot;宋体&quot;/&gt;</span><br><span class="line">            &lt;charset val=&quot;134&quot;/&gt;</span><br><span class="line">            &lt;scheme val=&quot;minor&quot;/&gt;</span><br><span class="line">        &lt;/font&gt;</span><br><span class="line">        &lt;font&gt;</span><br><span class="line">            &lt;u/&gt;</span><br><span class="line">            &lt;sz val=&quot;11&quot;/&gt;</span><br><span class="line">            &lt;color rgb=&quot;FF800080&quot;/&gt;</span><br><span class="line">            &lt;name val=&quot;宋体&quot;/&gt;</span><br><span class="line">            &lt;charset val=&quot;0&quot;/&gt;</span><br><span class="line">            &lt;scheme val=&quot;minor&quot;/&gt;</span><br><span class="line">        &lt;/font&gt;</span><br><span class="line">       ******</span><br><span class="line">    &lt;/fonts&gt;</span><br><span class="line">    //背景色信息</span><br><span class="line">    &lt;fills count=&quot;33&quot;&gt;</span><br><span class="line">        &lt;fill&gt;</span><br><span class="line">            &lt;patternFill patternType=&quot;none&quot;/&gt;</span><br><span class="line">        &lt;/fill&gt;</span><br><span class="line">        &lt;fill&gt;</span><br><span class="line">            &lt;patternFill patternType=&quot;gray125&quot;/&gt;</span><br><span class="line">        &lt;/fill&gt;</span><br><span class="line">        &lt;fill&gt;</span><br><span class="line">            &lt;patternFill patternType=&quot;solid&quot;&gt;</span><br><span class="line">                &lt;fgColor theme=&quot;9&quot; tint=&quot;0.599993896298105&quot;/&gt;</span><br><span class="line">                &lt;bgColor indexed=&quot;64&quot;/&gt;</span><br><span class="line">            &lt;/patternFill&gt;</span><br><span class="line">        &lt;/fill&gt;</span><br><span class="line">        ***</span><br><span class="line">    &lt;/fills&gt;</span><br><span class="line">    //边框信息</span><br><span class="line">    &lt;borders count=&quot;14&quot;&gt;</span><br><span class="line">        &lt;border&gt;</span><br><span class="line">            &lt;left/&gt;</span><br><span class="line">            &lt;right/&gt;</span><br><span class="line">            &lt;top/&gt;</span><br><span class="line">            &lt;bottom/&gt;</span><br><span class="line">            &lt;diagonal/&gt;</span><br><span class="line">        &lt;/border&gt;</span><br><span class="line">        &lt;border&gt;</span><br><span class="line">            &lt;left/&gt;</span><br><span class="line">            &lt;right style=&quot;thick&quot;&gt;</span><br><span class="line">                &lt;color auto=&quot;1&quot;/&gt;</span><br><span class="line">            &lt;/right&gt;</span><br><span class="line">            &lt;top style=&quot;thick&quot;&gt;</span><br><span class="line">                &lt;color auto=&quot;1&quot;/&gt;</span><br><span class="line">            &lt;/top&gt;</span><br><span class="line">            &lt;bottom/&gt;</span><br><span class="line">            &lt;diagonal/&gt;</span><br><span class="line">        &lt;/border&gt;</span><br><span class="line">        &lt;border&gt;</span><br><span class="line">            &lt;left/&gt;</span><br><span class="line">            &lt;right/&gt;</span><br><span class="line">            &lt;top/&gt;</span><br><span class="line">            &lt;bottom style=&quot;thick&quot;&gt;</span><br><span class="line">                &lt;color auto=&quot;1&quot;/&gt;</span><br><span class="line">            &lt;/bottom&gt;</span><br><span class="line">            &lt;diagonal/&gt;</span><br><span class="line">        &lt;/border&gt;</span><br><span class="line">       ***</span><br><span class="line">    &lt;/borders&gt;</span><br><span class="line">    &lt;cellStyleXfs count=&quot;49&quot;&gt;</span><br><span class="line">       ***</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;2&quot; fillId=&quot;2&quot; borderId=&quot;0&quot; applyNumberFormat=&quot;0&quot; applyBorder=&quot;0&quot; applyAlignment=&quot;0&quot; applyProtection=&quot;0&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;6&quot; fillId=&quot;5&quot; borderId=&quot;0&quot; applyNumberFormat=&quot;0&quot; applyBorder=&quot;0&quot; applyAlignment=&quot;0&quot; applyProtection=&quot;0&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">    &lt;/cellStyleXfs&gt;</span><br><span class="line">    //单元格样式信息</span><br><span class="line">    &lt;cellXfs count=&quot;10&quot;&gt;</span><br><span class="line">    //对应上方的 xml节点的下标</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;0&quot; xfId=&quot;0&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;0&quot; xfId=&quot;0&quot; applyAlignment=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment horizontal=&quot;center&quot; vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;0&quot; xfId=&quot;0&quot; applyAlignment=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;1&quot; fillId=&quot;0&quot; borderId=&quot;0&quot; xfId=&quot;10&quot; applyFont=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;1&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;2&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;3&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;4&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;5&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot; applyAlignment=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment horizontal=&quot;center&quot; vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">        &lt;xf numFmtId=&quot;0&quot; fontId=&quot;0&quot; fillId=&quot;0&quot; borderId=&quot;2&quot; xfId=&quot;0&quot; applyBorder=&quot;1&quot; applyAlignment=&quot;1&quot;&gt;</span><br><span class="line">            &lt;alignment horizontal=&quot;center&quot; vertical=&quot;center&quot;/&gt;</span><br><span class="line">        &lt;/xf&gt;</span><br><span class="line">    &lt;/cellXfs&gt;</span><br><span class="line">    &lt;cellStyles count=&quot;49&quot;&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;常规&quot; xfId=&quot;0&quot; builtinId=&quot;0&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;货币[0]&quot; xfId=&quot;1&quot; builtinId=&quot;7&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 3&quot; xfId=&quot;2&quot; builtinId=&quot;38&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;输入&quot; xfId=&quot;3&quot; builtinId=&quot;20&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;货币&quot; xfId=&quot;4&quot; builtinId=&quot;4&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;千位分隔[0]&quot; xfId=&quot;5&quot; builtinId=&quot;6&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 3&quot; xfId=&quot;6&quot; builtinId=&quot;39&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;差&quot; xfId=&quot;7&quot; builtinId=&quot;27&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;千位分隔&quot; xfId=&quot;8&quot; builtinId=&quot;3&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 3&quot; xfId=&quot;9&quot; builtinId=&quot;40&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;超链接&quot; xfId=&quot;10&quot; builtinId=&quot;8&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;百分比&quot; xfId=&quot;11&quot; builtinId=&quot;5&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;已访问的超链接&quot; xfId=&quot;12&quot; builtinId=&quot;9&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;注释&quot; xfId=&quot;13&quot; builtinId=&quot;10&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 2&quot; xfId=&quot;14&quot; builtinId=&quot;36&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;标题 4&quot; xfId=&quot;15&quot; builtinId=&quot;19&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;警告文本&quot; xfId=&quot;16&quot; builtinId=&quot;11&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;标题&quot; xfId=&quot;17&quot; builtinId=&quot;15&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;解释性文本&quot; xfId=&quot;18&quot; builtinId=&quot;53&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;标题 1&quot; xfId=&quot;19&quot; builtinId=&quot;16&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;标题 2&quot; xfId=&quot;20&quot; builtinId=&quot;17&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 1&quot; xfId=&quot;21&quot; builtinId=&quot;32&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;标题 3&quot; xfId=&quot;22&quot; builtinId=&quot;18&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 4&quot; xfId=&quot;23&quot; builtinId=&quot;44&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;输出&quot; xfId=&quot;24&quot; builtinId=&quot;21&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;计算&quot; xfId=&quot;25&quot; builtinId=&quot;22&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;检查单元格&quot; xfId=&quot;26&quot; builtinId=&quot;23&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 6&quot; xfId=&quot;27&quot; builtinId=&quot;50&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 2&quot; xfId=&quot;28&quot; builtinId=&quot;33&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;链接单元格&quot; xfId=&quot;29&quot; builtinId=&quot;24&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;汇总&quot; xfId=&quot;30&quot; builtinId=&quot;25&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;好&quot; xfId=&quot;31&quot; builtinId=&quot;26&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;适中&quot; xfId=&quot;32&quot; builtinId=&quot;28&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 5&quot; xfId=&quot;33&quot; builtinId=&quot;46&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 1&quot; xfId=&quot;34&quot; builtinId=&quot;29&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 1&quot; xfId=&quot;35&quot; builtinId=&quot;30&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 1&quot; xfId=&quot;36&quot; builtinId=&quot;31&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 2&quot; xfId=&quot;37&quot; builtinId=&quot;34&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 2&quot; xfId=&quot;38&quot; builtinId=&quot;35&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 3&quot; xfId=&quot;39&quot; builtinId=&quot;37&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 4&quot; xfId=&quot;40&quot; builtinId=&quot;41&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;20% - 强调文字颜色 4&quot; xfId=&quot;41&quot; builtinId=&quot;42&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 4&quot; xfId=&quot;42&quot; builtinId=&quot;43&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 5&quot; xfId=&quot;43&quot; builtinId=&quot;45&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 5&quot; xfId=&quot;44&quot; builtinId=&quot;47&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 5&quot; xfId=&quot;45&quot; builtinId=&quot;48&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;强调文字颜色 6&quot; xfId=&quot;46&quot; builtinId=&quot;49&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;40% - 强调文字颜色 6&quot; xfId=&quot;47&quot; builtinId=&quot;51&quot;/&gt;</span><br><span class="line">        &lt;cellStyle name=&quot;60% - 强调文字颜色 6&quot; xfId=&quot;48&quot; builtinId=&quot;52&quot;/&gt;</span><br><span class="line">    &lt;/cellStyles&gt;</span><br><span class="line">    </span><br><span class="line">    &lt;tableStyles count=&quot;0&quot; defaultTableStyle=&quot;TableStyleMedium2&quot; defaultPivotStyle=&quot;PivotStyleLight16&quot;/&gt;</span><br><span class="line">    &lt;extLst&gt;</span><br><span class="line">        &lt;ext uri=&quot;&#123;EB79DEF2-80B8-43e5-95BD-54CBDDF9020C&#125;&quot;</span><br><span class="line">            xmlns:x14=&quot;http://schemas.microsoft.com/office/spreadsheetml/2009/9/main&quot;&gt;</span><br><span class="line">            &lt;x14:slicerStyles defaultSlicerStyle=&quot;SlicerStyleLight1&quot;/&gt;</span><br><span class="line">        &lt;/ext&gt;</span><br><span class="line">    &lt;/extLst&gt;</span><br><span class="line">&lt;/styleSheet&gt;</span><br></pre></td></tr></table></figure><h5 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h5><p><img src="/images/pasted-56.png" alt="upload successful"></p><ul><li>Excel在存储上 做了很多的优化，所以07版本 的比 03版本的容量更小却可以存储更多的数据，但是这样通过下标的方式优化了存储对程序而言是一个不小的挑战</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;最近项目上想要对现在用的表格组件进行底层重构，所以对类似的产品Excel的存储结构上是否有可以借鉴的地方，所以就有了今天的这篇文章。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;文章主要探讨Excel数据存储，样式存储，合并单元格信息存储等基础数据的存储，细分Excel解压后的各个文件的职责，和存储结构。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="Excel" scheme="https://blog.luckylxh.top/categories/Excel/"/>
    
    
      <category term="Excel" scheme="https://blog.luckylxh.top/tags/Excel/"/>
    
  </entry>
  
  <entry>
    <title>网易裁员</title>
    <link href="https://blog.luckylxh.top/2020/01/06/%E7%BD%91%E6%98%93%E8%A3%81%E5%91%98/"/>
    <id>https://blog.luckylxh.top/2020/01/06/网易裁员/</id>
    <published>2020-01-06T07:32:00.000Z</published>
    <updated>2020-09-23T04:05:40.146Z</updated>
    
    <content type="html"><![CDATA[<video src="/videos/wangyicaiyuan.mp4" type="video/mp4" controls="controls" width="100%" height="100%"><br></video><p><a href="https://www.bilibili.com/video/av77151622" target="_blank" rel="noopener">原视频链接</a> ：<a href="https://www.bilibili.com/video/av77151622" target="_blank" rel="noopener">https://www.bilibili.com/video/av77151622</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;video src=&quot;/videos/wangyicaiyuan.mp4&quot; type=&quot;video/mp4&quot; controls=&quot;controls&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;&lt;br&gt;&lt;/video&gt;

&lt;p&gt;&lt;a href=&quot;https://www
      
    
    </summary>
    
      <category term="生活" scheme="https://blog.luckylxh.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
      <category term="裁员" scheme="https://blog.luckylxh.top/tags/%E8%A3%81%E5%91%98/"/>
    
  </entry>
  
  <entry>
    <title>程序中的数值</title>
    <link href="https://blog.luckylxh.top/2020/01/03/%E7%A8%8B%E5%BA%8F%E4%B8%AD%E7%9A%84%E6%95%B0%E5%80%BC/"/>
    <id>https://blog.luckylxh.top/2020/01/03/程序中的数值/</id>
    <published>2020-01-03T07:14:00.000Z</published>
    <updated>2020-09-23T04:05:02.707Z</updated>
    
    <content type="html"><![CDATA[<h4 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h4><ul><li>聊下Java和js的数值类型，这个地方也是开发中容易出错的地方。</li><li>IEEE 754 浮点“双精度格式” 标准。</li></ul><h4 id="资料"><a href="#资料" class="headerlink" title="资料"></a>资料</h4><ul><li>计算机只存储和运算都是二进制数据。我们常用的十进制数据在存储和运算的时候需要转换为二进制。</li><li>js 没有java的整数和浮点值的概念，统一用的number类型。</li></ul><p>以js number 64位双精度结构：</p><p><img src="/images/pasted-51.png" alt="upload successful"></p><a id="more"></a><ul><li>sign 1个符号位 代表正负</li><li>exponent 11个指数位 代表指数信息</li><li>fraction 52个尾数位 代表数值信息</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">举个例子，如果是5.5这个数字的话，则计算过程是这样的：</span><br><span class="line">5.5 转二进制 =====&gt; 101.1 科学计数法 =====&gt; 1.011*2^2 </span><br><span class="line">存入计算机： </span><br><span class="line">符号位：0 </span><br><span class="line">指数位：2 加1023 =====&gt; 1025 转二进制 =====&gt; 10000000001 </span><br><span class="line">尾数位：1.011 隐去小数点左边的1 =====&gt; 011</span><br></pre></td></tr></table></figure><p><img src="/images/pasted-52.png" alt="upload successful"></p><ul><li>js 不丢失精度的最大值就是2的52次方减去1 如果超过这个值并且小于 MAX_VALUE,可用表示但是精度会丢失.</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;聊下Java和js的数值类型，这个地方也是开发中容易出错的地方。&lt;/li&gt;
&lt;li&gt;IEEE 754 浮点“双精度格式” 标准。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;资料&quot;&gt;&lt;a href=&quot;#资料&quot; class=&quot;headerlink&quot; title=&quot;资料&quot;&gt;&lt;/a&gt;资料&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;计算机只存储和运算都是二进制数据。我们常用的十进制数据在存储和运算的时候需要转换为二进制。&lt;/li&gt;
&lt;li&gt;js 没有java的整数和浮点值的概念，统一用的number类型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以js number 64位双精度结构：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/pasted-51.png&quot; alt=&quot;upload successful&quot;&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Java" scheme="https://blog.luckylxh.top/tags/Java/"/>
    
      <category term="Js" scheme="https://blog.luckylxh.top/tags/Js/"/>
    
  </entry>
  
  <entry>
    <title>程序如何正确的处理时间</title>
    <link href="https://blog.luckylxh.top/2020/01/03/%E7%A8%8B%E5%BA%8F%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E7%9A%84%E5%A4%84%E7%90%86%E6%97%B6%E9%97%B4/"/>
    <id>https://blog.luckylxh.top/2020/01/03/程序如何正确的处理时间/</id>
    <published>2020-01-03T01:23:00.000Z</published>
    <updated>2020-09-23T04:04:19.170Z</updated>
    
    <content type="html"><![CDATA[<h4 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h4><ul><li>源于一次bug的调试，测试输入用户的生日为：1991-07-24 保存后。刷新页面，生日变成了 1991-07-23。</li><li>经过排查，是夏令时和时区的概念不清楚导致的bug，这次就来系统的讲讲夏令时和时区的概念，和我们如何正确的处理时间。</li></ul><h4 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h4><h5 id="时区"><a href="#时区" class="headerlink" title="时区"></a>时区</h5><p>由于世界各国家与地区经度不同，地方时也有所不同，因此会划分为不同的时区。</p><p>正式的时区划分包括24个时区，每一时区由一个英文字母表示。每隔经度15°划分一个时区，有一个例外，每个时区有一条中央子午线；例如，GMT属于“z”区，因此其时间后通常添加后缀“Z”（口语中用后缀“Zulu”）</p><a id="more"></a> <h5 id="夏令时"><a href="#夏令时" class="headerlink" title="夏令时"></a>夏令时</h5><p>夏令时，表示为了节约能源，人为规定时间的意思。也叫夏时制，夏时令（Daylight Saving Time：DST），又称“日光节约时制”和“夏令时间”，在这一制度实行期间所采用的统一时间称为“夏令时间”。</p><p>一般在天亮早的夏季人为将时间调快一小时，可以使人早起早睡，减少照明量，以充分利用光照资源，从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。</p><h5 id="冬令时"><a href="#冬令时" class="headerlink" title="冬令时"></a>冬令时</h5><p>有夏令时就会有冬令时。高纬度和中纬度的许多国家在夏季到来前，把时针拨快一小时，新的时间就是夏令时，到下半季秋季来临前，再把时针拨回一小时，即形成冬令时。</p><h5 id="夏令时和冬令时的影响"><a href="#夏令时和冬令时的影响" class="headerlink" title="夏令时和冬令时的影响"></a>夏令时和冬令时的影响</h5><p>拿美国来说，美国各个地区的时间都不同，不像中国一样统一使用北京时间，美国一般以三月份第二个周日凌晨两点当成夏季的开始，十一月份第一个周日的凌晨两点当成冬季的开始。</p><p>所以在每年的三月份第二个周日凌晨两点过后，时间就会往前调快一个小时；同理，十一月份第一个周日把这一个小时调回来。</p><p>你也可以理解成美国那边，一年里面有一天只有23小时（夏天开始那一天），有一天有25小时（冬天开始那一天），其他时间每天都是24小时。</p><p>所以你会发现，夏天的时候，中国的北京时间（东八区）与美国太平洋时区（西八区）的时差是15小时，而到了冬天却变成16小时</p><h4 id="讲解"><a href="#讲解" class="headerlink" title="讲解"></a>讲解</h4><ul><li>中国区内开发java默认的时区是  Asia/Shanghai  也就是中国时区，而中国在1986年到1991年施行了夏令时，导致在夏令时的时间内，会少一小时的时间，1991-07-24 保存到数据库后变成了 1991-07-23 23:00:00 CDT。</li></ul><h5 id="方案"><a href="#方案" class="headerlink" title="方案"></a>方案</h5><ul><li><p>如果项目上没有跨国，可以在项目启动的时候。统一设置时区为东八区.当然也要注意数据库。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TimeZone.setDefault(TimeZone.getTimeZone(<span class="string">"GMT+08"</span>));</span><br></pre></td></tr></table></figure></li><li><p>如果项目跨国了，推荐使用时间戳作为时间的记录值，数据库用Long类型，前台展示也更灵活</p></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;源于一次bug的调试，测试输入用户的生日为：1991-07-24 保存后。刷新页面，生日变成了 1991-07-23。&lt;/li&gt;
&lt;li&gt;经过排查，是夏令时和时区的概念不清楚导致的bug，这次就来系统的讲讲夏令时和时区的概念，和我们如何正确的处理时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;概念&quot;&gt;&lt;a href=&quot;#概念&quot; class=&quot;headerlink&quot; title=&quot;概念&quot;&gt;&lt;/a&gt;概念&lt;/h4&gt;&lt;h5 id=&quot;时区&quot;&gt;&lt;a href=&quot;#时区&quot; class=&quot;headerlink&quot; title=&quot;时区&quot;&gt;&lt;/a&gt;时区&lt;/h5&gt;&lt;p&gt;由于世界各国家与地区经度不同，地方时也有所不同，因此会划分为不同的时区。&lt;/p&gt;
&lt;p&gt;正式的时区划分包括24个时区，每一时区由一个英文字母表示。每隔经度15°划分一个时区，有一个例外，每个时区有一条中央子午线；例如，GMT属于“z”区，因此其时间后通常添加后缀“Z”（口语中用后缀“Zulu”）&lt;/p&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Java" scheme="https://blog.luckylxh.top/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot 浅析</title>
    <link href="https://blog.luckylxh.top/2019/08/16/SpringBoot-%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86/"/>
    <id>https://blog.luckylxh.top/2019/08/16/SpringBoot-启动原理/</id>
    <published>2019-08-16T08:52:00.000Z</published>
    <updated>2020-09-23T04:03:31.456Z</updated>
    
    <content type="html"><![CDATA[<p>SpringBoot 使用已经有不短的时间了，这次来系统的过下，自动配置原理，和启动原理。</p><h3 id="Spring-Boot-优点"><a href="#Spring-Boot-优点" class="headerlink" title="Spring Boot 优点"></a>Spring Boot 优点</h3><ul><li>Spring Boot 首先还是Spring</li><li>它减少了大量的开发时间并提高了生产力</li><li>它避免了编写大量的样板代码，注释和XML配置</li><li>它遵循“自用默认配置”方法，以减少开发工作量</li><li>独立运行的Spring项目</li><li>内嵌的Servlet容器</li><li>….</li><li>重点：自用默认配置，约定大于配置，开箱即用</li><li>如何实现的？<a id="more"></a> <h3 id="自动配置"><a href="#自动配置" class="headerlink" title="自动配置"></a>自动配置</h3></li><li>@EnableAutoConfiguration</li><li>@Conditional</li></ul><h4 id="EnableAutoConfiguration"><a href="#EnableAutoConfiguration" class="headerlink" title="@EnableAutoConfiguration"></a>@EnableAutoConfiguration</h4><ul><li>顾名思义，EnableAutoConguration是和自动化配置相关的东西。</li><li>Spring应用上下文的自动化配置，尝试去猜测和配置你需要的bean。这些被自动化配置的类通常在classpath路径下，或者是你自己定义的bean。</li><li>可以使用exclude来排除那些你不想被自动化配置的类。</li><li>被EnableAutoConfiguration注解的类所在的包有着特殊的意义，他们通常被认为是默认的包，并对其及下属的包进行扫描。</li><li>自动配置的类通常是在@Configuration里面配置的类</li><li>AutoConfigurationImportSelector 类提供支持，从 META-INF/spring.factories 中获取配置类</li></ul><h4 id="Conditional"><a href="#Conditional" class="headerlink" title="@Conditional"></a>@Conditional</h4><ul><li>@Conditional是Spring4新提供的注解，它的作用是按照一定的条件进行判断，满足条件给容器注册bean</li><li>Spring Boot 对在这个注解的基础上进行扩充了许多的@ConditionalOnXXXXXX</li><li>@ConditionalOnBean（某个Bean是否存在）</li><li>@ConditionalOnClass（类是否存在）</li><li>@ConditionalOnExpression（当表达式为true的时候，才会实例化一个Bean）</li><li>参考 HttpEncodingAutoConfiguration </li></ul><h3 id="启动原理"><a href="#启动原理" class="headerlink" title="启动原理"></a>启动原理</h3><p>我们从一个简单的SpringBoot入手</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">@SpringBootApplication</span><br><span class="line">public class DemoApplication &#123;</span><br><span class="line"></span><br><span class="line">public static void main(String[] args) &#123;</span><br><span class="line">SpringApplication.run(DemoApplication.class, args);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>进来以后 先 new SpringApplication(primarySources)对象，看下他的构造方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">public SpringApplication(ResourceLoader resourceLoader, Class&lt;?&gt;... primarySources) &#123;</span><br><span class="line">this.resourceLoader = resourceLoader;</span><br><span class="line">Assert.notNull(primarySources, &quot;PrimarySources must not be null&quot;);</span><br><span class="line">        //记录主资源</span><br><span class="line">this.primarySources = new LinkedHashSet&lt;&gt;(Arrays.asList(primarySources));</span><br><span class="line">        //判断启动类型，这里是SERVLET</span><br><span class="line">this.webApplicationType = deduceWebApplicationType();</span><br><span class="line">        //从 META-INF/spring.factories 收集 ApplicationContextInitializer，并实例化</span><br><span class="line">setInitializers((Collection) getSpringFactoriesInstances(</span><br><span class="line">ApplicationContextInitializer.class));</span><br><span class="line">        //从 META-INF/spring.factories 收集 ApplicationListener，并实例化</span><br><span class="line">setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));</span><br><span class="line">        //判断主类</span><br><span class="line">this.mainApplicationClass = deduceMainApplicationClass();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>进入run方法</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">public ConfigurableApplicationContext run(String... args) &#123;</span><br><span class="line">StopWatch stopWatch = new StopWatch();</span><br><span class="line">stopWatch.start();</span><br><span class="line">        //声明了一个ApplicationContext 容器</span><br><span class="line">ConfigurableApplicationContext context = null;</span><br><span class="line">Collection&lt;SpringBootExceptionReporter&gt; exceptionReporters = new ArrayList&lt;&gt;();</span><br><span class="line">configureHeadlessProperty();</span><br><span class="line">        //从 META-INF/spring.factories 收集SpringApplicationRunListener，并实例化</span><br><span class="line">SpringApplicationRunListeners listeners = getRunListeners(args);</span><br><span class="line">        //调用 SpringApplicationRunListener.starting()</span><br><span class="line">listeners.starting();</span><br><span class="line">try &#123;</span><br><span class="line">           //参数</span><br><span class="line">ApplicationArguments applicationArguments = new DefaultApplicationArguments(</span><br><span class="line">args);</span><br><span class="line">                //准备环境 并调用 SpringApplicationRunListener.environmentPrepared()</span><br><span class="line">ConfigurableEnvironment environment = prepareEnvironment(listeners,</span><br><span class="line">applicationArguments);</span><br><span class="line">configureIgnoreBeanInfo(environment);</span><br><span class="line">            //打印Banner</span><br><span class="line">Banner printedBanner = printBanner(environment);</span><br><span class="line">            //根据类型创建一个Spring容器</span><br><span class="line">context = createApplicationContext();</span><br><span class="line">            //异常报告</span><br><span class="line">exceptionReporters = getSpringFactoriesInstances(</span><br><span class="line">SpringBootExceptionReporter.class,</span><br><span class="line">new Class[] &#123; ConfigurableApplicationContext.class &#125;, context);</span><br><span class="line">                    //准备Spring容器环境，调用ApplicationContextInitializer.initialize()</span><br><span class="line">                    //调用SpringApplicationRunListener.contextPrepared</span><br><span class="line">                    //调用SpringApplicationRunListener.contextLoaded</span><br><span class="line">prepareContext(context, environment, listeners, applicationArguments,</span><br><span class="line">printedBanner);</span><br><span class="line">                    //刷新容器</span><br><span class="line">refreshContext(context);</span><br><span class="line">afterRefresh(context, applicationArguments);</span><br><span class="line">stopWatch.stop();</span><br><span class="line">if (this.logStartupInfo) &#123;</span><br><span class="line">new StartupInfoLogger(this.mainApplicationClass)</span><br><span class="line">.logStarted(getApplicationLog(), stopWatch);</span><br><span class="line">&#125;</span><br><span class="line">            //调用SpringApplicationRunListener.started</span><br><span class="line">listeners.started(context);</span><br><span class="line">            //调用 ApplicationRunner CommandLineRunner</span><br><span class="line">callRunners(context, applicationArguments);</span><br><span class="line">&#125;</span><br><span class="line">catch (Throwable ex) &#123;</span><br><span class="line">handleRunFailure(context, ex, exceptionReporters, listeners);</span><br><span class="line">throw new IllegalStateException(ex);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">try &#123;</span><br><span class="line">        //调用SpringApplicationRunListener.running</span><br><span class="line">listeners.running(context);</span><br><span class="line">&#125;</span><br><span class="line">catch (Throwable ex) &#123;</span><br><span class="line">handleRunFailure(context, ex, exceptionReporters, null);</span><br><span class="line">throw new IllegalStateException(ex);</span><br><span class="line">&#125;</span><br><span class="line">return context;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>具体的东西还是跟代码看几遍，并实现下这几个接口</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;SpringBoot 使用已经有不短的时间了，这次来系统的过下，自动配置原理，和启动原理。&lt;/p&gt;
&lt;h3 id=&quot;Spring-Boot-优点&quot;&gt;&lt;a href=&quot;#Spring-Boot-优点&quot; class=&quot;headerlink&quot; title=&quot;Spring Boot 优点&quot;&gt;&lt;/a&gt;Spring Boot 优点&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Spring Boot 首先还是Spring&lt;/li&gt;
&lt;li&gt;它减少了大量的开发时间并提高了生产力&lt;/li&gt;
&lt;li&gt;它避免了编写大量的样板代码，注释和XML配置&lt;/li&gt;
&lt;li&gt;它遵循“自用默认配置”方法，以减少开发工作量&lt;/li&gt;
&lt;li&gt;独立运行的Spring项目&lt;/li&gt;
&lt;li&gt;内嵌的Servlet容器&lt;/li&gt;
&lt;li&gt;….&lt;/li&gt;
&lt;li&gt;重点：自用默认配置，约定大于配置，开箱即用&lt;/li&gt;
&lt;li&gt;如何实现的？
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="SpringBoot" scheme="https://blog.luckylxh.top/tags/SpringBoot/"/>
    
  </entry>
  
  <entry>
    <title>大数据的excel文件导入导出</title>
    <link href="https://blog.luckylxh.top/2019/05/14/%E5%A4%A7%E6%95%B0%E6%8D%AE%E7%9A%84excel%E6%96%87%E4%BB%B6%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BA/"/>
    <id>https://blog.luckylxh.top/2019/05/14/大数据的excel文件导入导出/</id>
    <published>2019-05-14T12:13:00.000Z</published>
    <updated>2020-09-23T04:03:03.627Z</updated>
    
    <content type="html"><![CDATA[<p>开发报表平台，需要有报表系统和用户的数据交互，报表又称之为线上的excel，所以在与系统交互的过程中，除了用户在线上直接录入数据，excel的导入导出是重要的一环.下面就说下我们在开发过程中对这块的处理。</p><h4 id="poi"><a href="#poi" class="headerlink" title="poi"></a>poi</h4><p>  没错，不出意外的我们使用了poi作为我们处理excel的开发组件，poi对excel的操作提供了丰富的api，让我们可以对excel的每个单元格的样式，格式等都有很好的操作。但是poi十分吃服务器内存也是一个事实，到现在这个问题还是没有很好的优化。<br><a id="more"></a>  </p><h4 id="读写模式"><a href="#读写模式" class="headerlink" title="读写模式"></a>读写模式</h4><p><img src="/images/pasted-43.png" alt="upload successful"></p><p>POI读取Excel有两种模式，一种是用户模式（可修改），一种是SAX事件驱动模式，将xlsx格式的文档转换成CSV格式后进行读取。用户模式API接口丰富，使用POI的API可以很容易读取Excel，但用户模式消耗的内存很大，当遇到很大sheet、大数据网格，假空行、公式等问题时，很容易导致内存溢出。POI官方推荐解决内存溢出的方式使用CVS格式解析，即SAX事件驱动模式。下面主要是讲解如何读取大批量数据：</p><h5 id="导出大数据量的excel-07"><a href="#导出大数据量的excel-07" class="headerlink" title="导出大数据量的excel(07)"></a>导出大数据量的excel(07)</h5><p>这个比较简单，我们只需要 用 SXXFWorkbook替换掉我们用的 XSSFWorkbook就可以了（POI3.8后），SXXFWorkbook 是poi为我们实现的一个 支持大数据量导出的WookBook实现类，它的整体实现就是，在新建的时候指定内存中容纳多少行数据，当持续写入的行数超过我们设置的数量的时候，就会刷新内存中的数据写入到硬盘中，内部实现还是 XSSFWorkbook这个类，所以我们在构建 SXXFWorkbook的时候<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//我们需要指定一个内存中的行数，后台的操作就和 XSSFWorkbook一致了。</span><br><span class="line">SXSSFWorkbook sxWorkbook = new SXSSFWorkbook(2000);</span><br></pre></td></tr></table></figure></p><p>这样我们在写出大数据量的excel的时候，就不会在出现内存溢出问题了。（只能导出）</p><h5 id="导入大数据量的excel-07"><a href="#导入大数据量的excel-07" class="headerlink" title="导入大数据量的excel(07)"></a>导入大数据量的excel(07)</h5><p>如果是大数据量的导入，我们肯定不能用用户模式，用户模式是对所有的数据全部放到内存中，34M大小的07版本的excel用用户模式读取，需要大概4G的内存消耗，所以太消耗内存了，不过用户模式可以读，可以写。是最为方便的一种模式，如果导入大数据量的excle，推荐一个开源的项目<a href="https://mvnrepository.com/artifact/com.monitorjbl/xlsx-streamer/2.1.0" target="_blank" rel="noopener">xlsx-streamer</a>,作者已经给我们写好了xml分批量读取excel的代码了，我们只要直接用就行了。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">Workbook wk = StreamingReader.builder().rowCacheSize(100)  //缓存到内存中的行数，默认是10</span><br><span class="line">                .bufferSize(2048)  //读取资源时，缓存到内存的字节大小，默认是1024</span><br><span class="line">                .open(excel);</span><br></pre></td></tr></table></figure></p><p>不过这种方式是只能读取信息，并且不支持随机访问sheet页种的每行数据，我们获取数据需要使用迭代器的方式获取。作者实现的这个开源组件不支持获取sheet页中的合并单元格信息，但是我们项目中使用必须要合并单元格的信息来完成业务操作，并且我们项目中的大部分组件使用的poi是3.9的，作者用的poi是4.0.0 所以最后我只能在开源作者的基础上做了自己的定制，可以获取到sheet页的合并单元格信息，并且poi版本是3.9。如果你们项目也需要自己的定制，也需要在作者的基础上进行开发，源代码中作者用的是解析xml的形式来读取excel的，也比较好理解和修改，我自己修改的版本在<a href="https://gitee.com/lixihao223/xlsx-streamer" target="_blank" rel="noopener">这里</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;开发报表平台，需要有报表系统和用户的数据交互，报表又称之为线上的excel，所以在与系统交互的过程中，除了用户在线上直接录入数据，excel的导入导出是重要的一环.下面就说下我们在开发过程中对这块的处理。&lt;/p&gt;
&lt;h4 id=&quot;poi&quot;&gt;&lt;a href=&quot;#poi&quot; class=&quot;headerlink&quot; title=&quot;poi&quot;&gt;&lt;/a&gt;poi&lt;/h4&gt;&lt;p&gt;  没错，不出意外的我们使用了poi作为我们处理excel的开发组件，poi对excel的操作提供了丰富的api，让我们可以对excel的每个单元格的样式，格式等都有很好的操作。但是poi十分吃服务器内存也是一个事实，到现在这个问题还是没有很好的优化。&lt;br&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Excel" scheme="https://blog.luckylxh.top/tags/Excel/"/>
    
      <category term="Poi" scheme="https://blog.luckylxh.top/tags/Poi/"/>
    
  </entry>
  
  <entry>
    <title>浏览器缓存机制</title>
    <link href="https://blog.luckylxh.top/2019/04/02/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6/"/>
    <id>https://blog.luckylxh.top/2019/04/02/浏览器缓存机制/</id>
    <published>2019-04-02T07:40:00.000Z</published>
    <updated>2020-09-23T04:02:07.740Z</updated>
    
    <content type="html"><![CDATA[<h4 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h4><h5 id="get请求"><a href="#get请求" class="headerlink" title="get请求"></a>get请求</h5><ul><li>GET 请求可被缓存</li><li>GET 请求保留在浏览器历史记录中</li><li>GET 请求可被收藏为书签</li><li>GET 请求不应在处理敏感数据时使用</li><li>GET 请求有长度限制</li><li>GET 请求只应当用于取回数据</li></ul><h5 id="post请求"><a href="#post请求" class="headerlink" title="post请求"></a>post请求</h5><ul><li>POST 请求不会被缓存</li><li>POST 请求不会保留在浏览器历史记录中</li><li>POST 不能被收藏为书签</li><li>POST 请求对数据长度没有要求</li></ul><a id="more"></a><h4 id="缓存机制"><a href="#缓存机制" class="headerlink" title="缓存机制"></a>缓存机制</h4><p>   浏览器与服务器通信的方式为应答模式，即是：浏览器发起HTTP请求 – 服务器响应该请求，那么浏览器怎么确定一个资源该不该缓存，如何去缓存呢？</p><p>   浏览器第一次向服务器发起该请求后拿到请求结果后，将请求结果和缓存标识存入浏览器缓存，浏览器对于缓存的处理是根据第一次请求资源时返回的响应头来确定的。具体过程如下图：</p><p><img src="/images/pasted-36.png" alt="upload successful"></p><p>由上图我们可以知道：</p><p>浏览器每次发起请求，都会先在浏览器缓存中查找该请求的结果以及缓存标识<br>浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中</p><p>以上两点结论就是浏览器缓存机制的关键，它确保了每个请求的缓存存入与读取，只要我们再理解浏览器缓存的使用规则，那么所有的问题就迎刃而解了，本文也将围绕着这点进行详细分析。为了方便大家理解，这里我们根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分，分别是强缓存和协商缓存。</p><h5 id="强缓存"><a href="#强缓存" class="headerlink" title="强缓存"></a>强缓存</h5><p>强缓存：不会向服务器发送请求，直接从缓存中读取资源，在chrome控制台的Network选项中可以看到该请求返回200的状态码，并且Size显示from disk cache或from memory cache。强缓存可以通过设置新鲜度，也就是两种 HTTP Header 实现：Expires 和 Cache-Control。在已经有缓存的时候，去请求数据的时候会验证新鲜度是否还新鲜，如果是，就直接从缓存中获取数据，如果不新鲜，就请求后台，获取数据，再放入缓存中。</p><h6 id="Expires"><a href="#Expires" class="headerlink" title="Expires"></a>Expires</h6><p>缓存过期时间，用来指定资源到期的时间，是服务器端的具体的时间点。也就是说，Expires=max-age + 请求时间，需要和Last-modified结合使用。Expires是Web服务器响应消息头字段，在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据，而无需再次请求。</p><p>Expires 是 HTTP/1 的产物，受限于本地时间，如果修改了本地时间，可能会造成缓存失效。Expires: Wed, 22 Oct 2018 08:41:00 GMT表示资源会在 Wed, 22 Oct 2018 08:41:00 GMT 后过期，需要再次请求。</p><h6 id="Cache-Control"><a href="#Cache-Control" class="headerlink" title="Cache-Control"></a>Cache-Control</h6><p>在HTTP/1.1中，Cache-Control是最重要的规则，主要用于控制网页缓存。比如当Cache-Control:max-age=300时，则代表在这个请求正确返回时间（浏览器也会记录下来）的5分钟内再次加载资源，就会命中强缓存。<br>Cache-Control 可以在请求头或者响应头中设置，并且可以组合使用多种指令：</p><p><img src="/images/pasted-37.png" alt="upload successful"></p><ul><li><p>max-age 和 s-maxage</p><p>两者是 cache-control 的主要字段，它们是一个数字，表示资源过了多少秒之后变为无效。在浏览器中，max-age 和 s-maxage 都起作用，而且 s-maxage 的优先级高于 max-age。在代理服务器中，只有 s-maxage 起作用。 可以通过设置 max-age 为 0 表示立马过期来向服务器请求资源。</p></li><li><p>public 和 private</p><p>public 表示该资源可以被所有客户端和代理服务器缓存，而 private 表示该资源仅能客户端缓存。默认值是 private，当设置了 s-maxage 的时候表示允许代理服务器缓存，相当于 public。</p></li><li><p>no-cache 和 no-store</p><p>no-cache 表示的是不直接询问浏览器缓存情况，而是去向服务器验证当前资源是否更新（即协商缓存）。no-store 则更狠，完全不使用缓存策略，不缓存请求或响应的任何内容，直接向服务器请求最新（协商缓存也不会走）。由于两者都不考虑缓存情况而是直接与服务器交互，所以当 no-cache 和 no-store 存在时会直接忽略 max-age 等。</p></li></ul><h6 id="Expires和Cache-Control两者对比"><a href="#Expires和Cache-Control两者对比" class="headerlink" title="Expires和Cache-Control两者对比"></a>Expires和Cache-Control两者对比</h6><p>其实这两者差别不大，区别就在于 Expires 是http1.0的产物，Cache-Control是http1.1的产物，两者同时存在的话，Cache-Control优先级高于Expires；在某些不支持HTTP1.1的环境下，Expires就会发挥用处。所以Expires其实是过时的产物，现阶段它的存在只是一种兼容性的写法。</p><p>强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段，而不关心服务器端文件是否已经更新，这可能会导致加载文件不是服务器端最新的内容，那我们如何获知服务器端内容是否已经发生了更新呢？此时我们需要用到协商缓存策略。</p><h5 id="协商缓存"><a href="#协商缓存" class="headerlink" title="协商缓存"></a>协商缓存</h5><p>协商缓存就是强制缓存失效后，浏览器携带缓存标识向服务器发起请求，由服务器根据缓存标识（校验值）决定是否使用缓存的过程，主要有以下两种情况：</p><ul><li>协商缓存生效，返回304和Not Modified<br><img src="/images/pasted-38.png" alt="upload successful"></li><li>协商缓存失效，返回200和请求结果<br><img src="/images/pasted-39.png" alt="upload successful"></li></ul><p>协商缓存可以通过设置两种 HTTP Header 实现：Last-Modified 和 ETag ，也就是带着校验值请求后台，后台根据校验值判断后台资源是否有更新，如果有返回最新的数据，如果没有就不返回数据了，节省传输的数据大小。</p><h6 id="Last-Modified"><a href="#Last-Modified" class="headerlink" title="Last-Modified"></a>Last-Modified</h6><p>浏览器在第一次访问资源时，服务器返回资源的同时，在response header中添加 Last-Modified的header，值是这个资源在服务器上的最后修改时间，浏览器接收后缓存文件和header；</p><p><code>Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT</code></p><p>浏览器下一次请求这个资源，浏览器检测到有 Last-Modified这个header，于是添加If-Modified-Since这个header，值就是Last-Modified中的值；服务器再次收到这个资源请求，会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比，如果没有变化，返回304和空的响应体，直接从缓存读取，如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间，说明文件有更新，于是返回新的资源文件和200</p><p><img src="/images/pasted-40.png" alt="upload successful"></p><p>但是 Last-Modified 存在一些弊端：</p><ul><li><p>如果本地打开缓存文件，即使没有对文件进行修改，但还是会造成 Last-Modified 被修改，服务端不能命中缓存导致发送相同的资源</p></li><li><p>因为 Last-Modified 只能以秒计时，如果在不可感知的时间内修改完成文件，那么服务端会认为资源还是命中了，不会返回正确的资源</p></li></ul><p>既然根据文件修改时间来决定是否缓存尚有不足，能否可以直接根据文件内容是否修改来决定缓存策略？所以在 HTTP / 1.1 出现了 ETag 和If-None-Match</p><h6 id="ETag"><a href="#ETag" class="headerlink" title="ETag"></a>ETag</h6><p>Etag是服务器响应请求时，返回当前资源文件的一个唯一标识(由服务器生成)，只要资源有变化，Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时，会将上一次返回的Etag值放到request header里的If-None-Match里，服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致，就能很好地判断资源相对客户端而言是否被修改过了。如果服务器发现ETag匹配不上，那么直接以常规GET 200回包形式将新的资源（当然也包括了新的ETag）发给客户端；如果ETag是一致的，则直接返回304知会客户端直接使用本地缓存即可。</p><p><img src="/images/pasted-41.png" alt="upload successful"></p><h6 id="两者之间对比："><a href="#两者之间对比：" class="headerlink" title="两者之间对比："></a>两者之间对比：</h6><ul><li>首先在精确度上，Etag要优于Last-Modified。</li></ul><p>Last-Modified的时间单位是秒，如果某个文件在1秒内改变了多次，那么他们的Last-Modified其实并没有体现出来修改，但是Etag每次都会改变确保了精度；如果是负载均衡的服务器，各个服务器生成的Last-Modified也有可能不一致。</p><ul><li><p>第二在性能上，Etag要逊于Last-Modified，毕竟Last-Modified只需要记录时间，而Etag需要服务器通过算法来计算出一个hash值。</p></li><li><p>第三在优先级上，服务器校验优先考虑Etag</p></li></ul><h4 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h4><ul><li>Cache-Control与Expires</li></ul><p>　　Cache-Control与Expires的作用一致，都是指明当前资源的有效期，控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多，设置更细致，如果同时设置的话，其优先级高于Expires。</p><ul><li>Last-Modified/ETag与Cache-Control/Expires</li></ul><p>　　配置Last-Modified/ETag的情况下，浏览器再次访问统一URI的资源，还是会发送请求到服务器询问文件是否已经修改，如果没有，服务器会只发送一个304回给浏览器，告诉浏览器直接从自己本地的缓存取数据；如果修改过那就整个数据重新发给浏览器；</p><p>　　Cache-Control/Expires则不同，如果检测到本地的缓存还是有效的时间范围内，浏览器直接使用本地副本，不会发送任何请求。两者一起使用时，Cache-Control/Expires的优先级要高于Last-Modified/ETag。即当本地副本根据Cache-Control/Expires发现还在有效期内时，则不会再次发送请求去服务器询问修改时间（Last-Modified）或实体标识（Etag）了。</p><p>  当资源过期时（使用Cache-Control标识的max-age），发现资源具有Last-Modified声明，则再次向web服务器请求时带上头If-None-Match（Last-Modified的值）。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行比对，决定返回200或304</p><p>　　一般情况下，使用Cache-Control/Expires会配合Last-Modified/ETag一起使用，因为即使服务器设置缓存时间, 当用户点击“刷新”按钮时，浏览器会忽略缓存继续向服务器发送请求，这时Last-Modified/ETag将能够很好利用304，从而减少响应开销。</p><p><img src="/images/pasted-42.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h4&gt;&lt;h5 id=&quot;get请求&quot;&gt;&lt;a href=&quot;#get请求&quot; class=&quot;headerlink&quot; title=&quot;get请求&quot;&gt;&lt;/a&gt;get请求&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;GET 请求可被缓存&lt;/li&gt;
&lt;li&gt;GET 请求保留在浏览器历史记录中&lt;/li&gt;
&lt;li&gt;GET 请求可被收藏为书签&lt;/li&gt;
&lt;li&gt;GET 请求不应在处理敏感数据时使用&lt;/li&gt;
&lt;li&gt;GET 请求有长度限制&lt;/li&gt;
&lt;li&gt;GET 请求只应当用于取回数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;post请求&quot;&gt;&lt;a href=&quot;#post请求&quot; class=&quot;headerlink&quot; title=&quot;post请求&quot;&gt;&lt;/a&gt;post请求&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;POST 请求不会被缓存&lt;/li&gt;
&lt;li&gt;POST 请求不会保留在浏览器历史记录中&lt;/li&gt;
&lt;li&gt;POST 不能被收藏为书签&lt;/li&gt;
&lt;li&gt;POST 请求对数据长度没有要求&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="It" scheme="https://blog.luckylxh.top/categories/It/"/>
    
    
      <category term="Http" scheme="https://blog.luckylxh.top/tags/Http/"/>
    
      <category term="请求缓存" scheme="https://blog.luckylxh.top/tags/%E8%AF%B7%E6%B1%82%E7%BC%93%E5%AD%98/"/>
    
  </entry>
  
</feed>
