win32com操作word API精讲 第六集 Range(四)对齐和缩进

本课程《win32com操作word API精讲&项目实战》同步在B站、今日头条、视频号及本公众号发布。其中本公众号以发布文字教程为主。

今天是大年初二,一灯在此祝愿各位朋友兔年吉祥,达成所想。

本节课主要讲解使用Range操作段落格式中的对齐缩进

1.ParagraphFormat属性

对齐和缩进属于段落格式,Range并不能直接操作段落格式(Paragraph(s)就可以),不过所幸的是,Range中封装了一个ParagraphFormat的属性,它是一个独立接口,代表了段落的所有格式,通过它,则能实现Range操作段落格式。

2.对齐和混合格式的坑

对齐的操作非常简单,示例如下:

from win32com.client import Dispatch

client = Dispatch('word.Application')
clinet.Visbile = 1

doc = client.Documents.Open(file_name)
# 假设打开的文档中有两端文字

rng1.Range(0,0)
rng1.MoveEnd(4,1)

rng1.ParagraphFormat.Alignment
>>>0

Alignment用来返回或设置Range对象所在段落的对齐情况,返回int,其对照关系如下:

常量 对齐
0 左对齐
1 居中对齐
2 右对齐
3 两端对齐
4 分散对齐

对齐的操作非常简单,但有个需要避开:混合格式,我们模拟以下的情形。

对齐避坑指南

加速以上文档中两个段落的对齐都不一样,当我们使用doc.Range().ParagraphFormat.Alignment来获取全文档的对齐时,会返回9999999,这是因为两个段落的对齐不一样,也就是这里所说的混合格式,这种情形不止存在于对齐中,还有字体、字号以及页面设置等资源都会有。

一般开发中,我们需要逐个资源进行处理,以避免掉进混合格式的坑。

缩进

word编程接口中的缩进和客户端中设置面板的缩进选项是一一对应的,对齐的接口如下:

名称 接口 说明
首行缩进/悬挂缩进 CharacterUnitFirstLineIndent 以字符为单位缩进
FirstLineIndent 以磅值为单位缩进
左缩进 CharacterUnitLeftIndent 以字符为单位缩进
LeftIndent 以磅值为单位缩进
右缩进 CharacterUnitRightIndent 以字符为单位缩进
RightIndent 以磅值为单位缩进

首行缩进悬挂缩进共用接口,它们两个的操作效果是相反的,所以在客户端中缩进设置面板中,它们两个处于一个下拉框中,如下图:
image

文本之前对应着左缩进的接口,文本之后对应着右缩进的接口。

同时,可以留意到,客户端提供了几个缩进的单位,这些单位最后都会被转换成磅值进行保存。在word编程的接口中,仅提供了两个单位的缩进接口,如上表中,带有CharacterUnit字样的接口属于按字符为单位进行缩进,反之按磅值为单位进行缩进。

代码演示(接着上面的代码)


# 对第一个段落执行首行缩进2字符
rng1.ParagraphFormat.CharacterUnitFirstLineIndent = 2

# 等效的做法 一个字号磅值等于一个字符
rng1.ParagraphFormat.FirstLineIndent = 当前段落字号磅值 * 2

缩进避坑指南

磅值是所有缩进最终会保存的尺度单位,即无论使用字符设置还是厘米设置,最终会被计算成磅值保存到OLE对象中,这个保存的逻辑会引起一些小坑,当我们使用字符设置缩进时,系统中计算、保存磅值的同时,也会记录字符值,所以上述代码中,使用字符设置了首行缩进,我们既能通过CharacterUnitFirstLineIndent属性获取当前缩进的字符值,也能通过FirstLineIndent属性获取磅值,但反之却不行。一图胜千字,请看下图。

image
image

所以,当我们要取消缩进时:

  • 如果当前使用的是磅值缩进,只需要按照磅值缩进接口赋值为0即可
  • 如果当前使用的是字符缩进,则需要先设置磅值缩进为0,再设置字符缩进为0方可取消。(因为这种情况它有两个缩进值,一为磅值,二为字符值)

暂时理解不了的话,自己敲一遍代码就能明白了。

悬挂缩进

悬挂缩进和首行缩进共用接口,前者使用负数赋值,后者使用正数赋值,这非常简单,伪代码演示即可。

# 悬挂缩进2字符
rng.ParagraphFormat.CharacterUnitFirstLineIndent = -2

至于左缩进和右缩进,使用方法、坑和首行缩进一模一样,请自行测试。

ok,本课内容就到这,下节课我们继续讲解Range的其他属性方法。

有疑问,可私信也可评论区交流哈。

本文转载于网络 如有侵权请联系删除

相关文章

  • mysql前缀索引语句_mysql 前缀索引

    大家好,又见面了,我是你们的朋友全栈君。联合索引概念联合索引又叫复合索引,即一个覆盖表中两列或者以上的索引,例如:index_name(columna,columnb)1创建方式执行altertable语句时创建altertabletable_nameaddindexindex_name(column_list)1index_name是创建的联合索引的名字,可以没有,没有的话系统会根据该索引包含的第一列来赋名称;table_name是要创建该索引的表名;column_list为该索引所包含的表的字段名。执行createindex语句时创建createindexindex_nameontable_name(column_list)1此种情况是在表已经创建好的情况下,再来创建复合索引。index_name和column_list同上;table_name是要创建索引的表名。例子createtablestu(idint,namevarchar(10),ageint,primarykey(id));ALTERTABLEstuADDINDEXLianHeIndex(name,age);或者cre

  • 某小说App返回数据 解密分析

    一、目标李老板:奋飞呀,最近被隔离在小区里,没啥可干的呀。奋飞:看小说呀,量大管饱。我们今天的目标就是某小说Appv2021_09_53二、步骤搜索url字符串App请求小说内容的时候没有加签名,但是返回的数据是加密的。main.png那么我们先去jadx搜索一下这个url(novel-content),看看有没有发现。结果是没有收获。那么很有可能这个url不是在apk中写死的,而是某个请求返回的。Charles可以搜索数据包,我们从返回包里面找到了这个url。main2.png那就好办了,看看是哪块代码去解析了这个content_url,我们在jadx中搜索"content_url"这次倒是有收获,但是看不出来这个变量再哪里用了。插播一个屏蔽登录只能再想想别的办法了,办法还没想出来,又遇到了新的问题。第二次启动app的时候,就不让我看书了。一定要我登录,一怒之下登录了,居然还不让我看。还要买VIP。这下忍不了了,我不过是想写个分析教程,何必这么为难我。先从提示入手,搜索"登录"来到这里login.png理论上说干掉这两个函数应该就可以了,写代码

  • leetcode刷题:两数之和

    题目: 给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 开始思路: 只是做出来,但是没有考虑只对应一个答案,两个for循环不容易解决重复问题,复制1a=[2,4,6,3] 2b=9 3deftwoSum(nums,target): 4lens=len(nums) 5foriinrange(lens): 6forjinrange(i+1,lens): 7ifnums[i]+nums[j]==target: 8print(i,j) 9break 10break复制这样在列表的第一个第二个值重复时候会出错改正思路:只循环一个j,和值减去当前循环值去寻找差值,得到唯一性:1a=[2,4,6,3] 2b=9 3deftwoSum(nums,target): 4lens=len(nums) 5foriinrange(1,len(nums)): 6temp=nums[:i] 7if(target-nums[i])intemp: 8j=temp.index

  • r语言预测波动率的实现:ARCH模型与HAR-RV模型

    原文:http://tecdat.cn/?p=3832波动率是众多定价和风险模型中的关键参数,例如BS定价方法或风险价值的计算。在这个模型中,或者说在教科书中,这些模型中的波动率通常被认为是一个常数。然而,情况并非如此,根据学术研究,波动率是具有聚类和长记忆特征的时间序列变量。本博客比较了GARCH模型(描述波动率聚类),ARFIMA模型(长记忆),HAR-RV模型(基于高频数据),以及来自SSE50指数和CME利率期货的样本。此外,本文使用滚动时间窗预测方法来计算预测波动率并构建指数以评估模型的准确性。结果表明,基于长记忆和实现波动率的ARFIMA-RV模型是最准确的模型。1.基于GARCH的模型-描述波动率聚类为了模拟异方差性,GARCH采用以下过程:为了反映金融市场的不对称性,学者们提出了EGARCH,TGARCH或APARCH(非对称权力自回归条件异方差),其中APARCH更为一般。我们从在ř中拟合APARCH开始:可以看出ARCH效应是显而易见的我们可以得到模型的系数,以及误差分析为了进一步分析模型,我们分析了QQ图中的正态性残差。我们发现残差不正常,然后我们测试残差的自相关

  • Prometheus使用[笔记]

    Prometheus使用环境查看上一篇安装篇MacOSCentos7prometheus-2.12.0.linux-amd64.tar.gzgrafana-6.3.5-1.x86_64node_exporter-0.18.1.linux-amd64pushgateway-0.9.1.linux-amd64命令行入门实例CPU使用率计算 CPU在t1到t2时间段总的使用时间=(user2+nice2+system2+idle2+iowait2+irq2+softirq2)-(user1+nice1+system1+idle1+iowait1+irq1+softirq1) CPU在t1到t2时间段空闲使用时间=(idle2-idle1) CPU在t1到t2时间段即时利用率=1-CPU空闲使用时间/CPU总的使用时间 increase()函数:解决counter类型的时间增量 多核CPU计算 sum()结果求和 获取CPU时间获取空闲时间idle获取总的时间单台机器的CPU总利用率 1-(sum(increase(node_cpu_seconds_total{instance="1

  • elasticsearch 处理null值

    1.查询为空的字段我们查询某个字段为空的数据时,在mysql中:selecteid,ent_namefroment_searchwhereenttype_codeisNULL;复制在elasticsearch中,我们使用的api为exists,这个查询是:查询这个字段为空的或者没有这个字段的:GETent_search/_search { "_source":["eid","ent_name"], "query":{ "bool":{ "must_not":{ "exists":{ "field":"enttype_code" } } } } }复制2.查询某个不为空的字段我们查询某个字段不为空的数据时,在mysql中:selecteid,ent_namefroment_searchwhereenttype_codeisNOTNULL;复制在elasticsearch中,我们使用的api为exists,这个查

  • T研究:国内云BPM市场规模尚小,预计2018年仅为3.29亿元

    BPM?什么鬼?反正作为“菊外人”的小编是第一次听说。其实,对于这个词,不光是小编,国内的企业也很陌生。T研究发现,拥有信息化系统的企业当中,仅有9.7%的企业用户表示,明确知道BPM是什么,BPM能做什么!所以,为了给大家普及更多的知识,T研究的小伙伴们挑灯夜战,翻阅“史料、典籍”,冒着夏日的酷暑进行走访调研,终于在7月的尾巴溜走之前给大家呈现了这份《2018年中国云BPM市场用户研究报告》。在这份报告中,T研究给出的BPM的定义是:BPM应该是集业务流程咨询、业务流程调研、业务流程解决方案建立、业务流程平台建设、业务流程成功的一整套服务。业务流程的管理应当包含但不限于企业内外部事件环境中,由互相依赖的业务流程出发,对业务进行描述、理解、组织和维护。通过人、软件、机器的各个节点之间互相协作、串联,以期达到企业高效、完整的自动化运转。通过调研,T研究发现,国内云BPM市场呈现如下特点:一、认知不足,上云之路仍然是路漫漫其修远兮;规模较小,但增速稳定。在被调研的1600多家拥有信息化系统的企业当中,仅有9.7%的企业用户表示,明确知道BPM是什么,BPM能做什么。而且在已经部署和应用BP

  • WEB安全基础 - - -SQL注入利用

    目录GET显错注入GET显错注入流程准备知识  举例:基于错误的GET单引号字符型注入1.判断注入点 2.判断闭合字符3.根据order判断sql语句的查询列数4.联合查询活得显示位5.获取当前数据库 6.获取所有数据库7. 获取当前数据库表名: 8.获取users表所有字段:​编辑9. 获取security.users表所有字段 10.获取security.users表所有字段内容: concat用法:concat_ws用法 group_concat用法:GET显错注入GET显错注入流程01 获取字段数     orderbyx 02 获取显示位     unionselect1,2,3,4…… 03 获取数据库信息 version(),user(),@@datadir 04 获取当前数据库 database(),schema(), 05 获取所有数据库 06 获取数据库表 07 获取所有字段 08 获取数据 准备知识 逻辑运算符:and、or、!= 注意:!!! and:并且,前后两条语句必须全为真,才为真,否则为假。 如:1=1and2=2真 1=1and1=2假 or:或者,

  • 「NOI2020」不知道咋记

    本来啥也不想写的。我能写点啥? 写我D1T2因为线段树上传标记时没取模白给76分送走金牌? 写我D2T2想到正解然后写假了白给44分送走翻盘机会? 金牌线340+,预计得分224+215=439,实际得分148+171=319。 啥也别说了,希望noi早日改赛制。 本来想写什么“只要不挂分我也是金牌水平”,不过想想发现大家不挂分其实都是金牌水平,所以这只能说明自己菜。 (p.s.:以上是倒序) 进寝室直接雷击:发现和jly一个寝室。 然而我交际水平太差了,所以也没搭上几句话。倒是看到很多人来膜jly来着。 突然发现寝室三个人就我没拿金,还各种丢人。 然后是试机+笔试日。 笔试看了一遍感觉没啥问题就去看试机题了,试机题有交互,于是今年也会考交互?结果是烟雾弹,今年6道传统题。 出成绩了,诶100分,那挺好,继续看试机题。看到编译选项-std=c++11-O2,全场起立鼓掌.jpg。 本来想写robot练练手,结果一不小心就rm了所有样例,退役感++。 然后转头写sequence,发现不会了,退役感++。 然后就是喜闻乐见的day1。 这t1好不可做啊,诶怎么它w≤5,诶那不是矩阵乘

  • Licensing Mode for Remote Desktop Session Host is not Configured

    LicensingModeforRemoteDesktopSessionHostisnotConfigured Whatisremotedesktoplicensing? Everydeviceoruserthatwantstoconnecttoaremotedesktopsessionhostrequiresa ClientAccessLicense(CAL),tohelpyouinstallandtracklicensesacrossdifferentcomputers.ThisCALalsohelpswithstreamliningaccessandensuresthatnounauthorizedsystemcanconnecttoaremotehost. Whenahostordevicetriestoconnecttoa remotedesktopsession (RDS)Hostserver,itcheckstheconfigurationtoseeifaCALisrequired.Ifyes,theRDShostserverreq

  • kuangbin_SegTree I (HDU 1540)

    做完D之后我信誓旦旦以为之后就只剩一个二维就能攻克线段树了看来也跟图论一样全是模板嘛 然后我打开了I题一眼看下去似乎直接用线段树记录sum然后跟区间长度比较然后处理一下实现也不难 两个小时后:特么的好像没那么简单啊 然后我百度了才知道原来这又是一个新题型...区间合并...啊啊啊啊啊 感谢kuangbin巨巨的blog让我学会了这个方法... 另外我WA了一天然后上机课时候打开来重新看的时候一眼瞟到build的时候l跟r写反了心痛   再多说一句这题hdu一如既往的坑明明有好多组数据input上非说只有一组 #include<cstdio> #include<cmath> #include<cstring> #include<stack> #include<algorithm> #defineINF0x3f3f3f3f #definemem(str,x)memset(str,(x),sizeof(str)) #defineSTOPputs("Pause"); #definelsonl,m,rt<<1 #

  • Python操作数据库-详细

    1.安装pip  1.1pip在安装python时勾选pip工具默认安装  如安装Python3.9.7      2.检查pip是否已经安装  2.1打开cmd输入pip如果成功则出现      2.2如果出现'pip'不是内部或外部命令,也不是可运行的程序或批处理文件。  打开系统环境变量,在系统环境变量中添加pip安装的路径:系统变量-Path末尾加上pip路径,一般在Python\Python39\Scripts的Scripts文件中 3.安装mysql包  cmd中输入pipinstallpymysql等待安装即可 pipinstallpymysql复制 4.在编写python工具中输入以下代码查看是否报错,无报错则安装成功 importpymysql #1.建立连接 conn=pymysql.connect( host='localhost', port=3306, user='root', passwd='123456',#password也可以 db='

  • JPushDemo【极光推送集成,基于v3.1.8版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录极光推送的集成,不能运行。 使用步骤 一、项目组织结构图   注意事项: 1、 导入类文件后需要change包名以及重新importR文件路径 2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖 二、导入步骤 2.1、接入准备 参考官网《3分钟快速使用JPushAndroidDemo》 创建极光推送开发者帐号——》创建应用——》获取APPkey 2.2、下载SDK 如果使用自动集成的话,不需要下载SDK,不过我个人倾向于手动集成,所以需要下载SDK。 下载地址:https://docs.jiguang.cn/jpush/resources/ 下载后的压缩包解压后的目录:   说明: 2.3、集成SDK 为了便于管理,我在Demo中新建了一个ThirdLib的module,用于集成SDK。 (1)新建ThirdLib的module,并在app的build.g

  • eclipse查看jar包源代码乱码问题解决

    文章来源   今天在eclipse中查看java的jar包中的源代码时,显示的全部是乱码。起初只设置了contenttypes还不行,还是乱码。不过问题最后解决了,配置步骤如下: 首先要知道你需要配置的编码格式,比如jar包的源码编码格式是GBK的。那么我们则配置为GBK。   步骤1、在eclipse菜单栏中,Window–>Preferences–>General–>Contenttypes。将JARContent,JavaClassFile的Defaultencoding都设置为你要的编码。 步骤2、光设置上面的还不行,还需要再设置Workspace的编码。Window–>Preferences–>General–>Workspace,将Textfileencoding的默认编码也设置为和上面一致的编码。 步骤3、保存,重启Eclipse即可发现乱码问题解决了。  

  • [HDOJ - 5282] Senior&#39;s String 【DP】

    题目链接:BZOJ-5282   题目分析 LCS就是用经典的O(n^2)DP解决,f[i][j]表示x串前i个字符与y串前j个字符的LCS长度。 f[i][j]=max(f[i-1][j],f[i][j-1]);  if(x[i]==y[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1); 然后再设置一个状态g[i][j],表示x串的前i个字符中,有多少个长为f[i][j]的子序列同时也是y串前j个字符的子序列。 然后转移的时候,分两种情况: 1)不包含x[i]的子序列,if(f[i-1][j]==f[i][j])g[i][j]+=g[i-1][j]; 2)包含x[i]的子序列,if(f[i-1][p-1]+1==f[i][j])g[i][j]+=g[i-1][p-1];(p是y串前j个字符中最靠后的与x[i]相同的位置。) 这样转移就好了。 初始化g[][]的时候给g[0][]和g[][0]赋值。   代码 #include<iostream> #include<cstdlib> #include<

  • SpringBoot参数校验

    请求参数的校验是非常容易犯错,或存在较多改进点的常见场景。比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验。这种情况常见于需要同时开发前后端的时候,虽然程序的正常使用不会有问题,但是开发者忽略了非正常操作。比如绕过前端程序,直接模拟客户端请求,这时候就会突然在前端预设的各种限制,直击各种数据访问接口,使得我们的系统存在安全隐患。 大量地使用if/else语句嵌套实现,校验逻辑晦涩难通,不利于长期维护。 所以,针对上面的问题,建议服务端开发在实现接口的时候,对于请求参数必须要有服务端校验以保障数据安全与稳定的系统运行。同时,对于参数的校验实现需要足够优雅,要满足逻辑易读、易维护的基本特点。 JSR-303 什么是JSR? JSR是JavaSpecificationRequests的缩写,意思是Java规范提案。是指向JCP(JavaCommunityProcess)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303定义的是什么标准? JSR-30

  • A题笔记(12)

    No.1466 代码:https://code.csdn.net/snippets/192091 No.1202 代码:https://code.csdn.net/snippets/192110 考察点:①判断闰年   if(((year%4==0)&&(year%100!=0))||(year%400==0)) cout<<"366"; else cout<<"365";复制   注意 intsum,num; sum+=num;复制 这时sum必须初始化:sum=0;  

  • [leetcode刷题]——树(前中后序遍历 + 层次遍历)

    此博客主要记录二叉树的前中后序遍历,使用递归和非递归的方法。   一、二叉树的前序遍历 144、二叉树的前序遍历  (easy)2021-05-25 使用递归和非递归的方法。 publicList<Integer>preorderTraversal(TreeNoderoot){ Stack<TreeNode>stack=newStack<>(); List<Integer>list=newArrayList<>(); stack.push(root); while(!stack.isEmpty()){ TreeNodenode=stack.pop(); if(node==null)continue; list.add(node.val); stack.push(node.right); stack.push(node.left); } returnlist; }复制 privateList<Integer>List=newArrayList<>(); public

  • npm使用入门

    NPM使用入门 npm就是nodepackagemanagernode的包管理工具 我们通过npminstall模块来安装模块,缩写:npmi模块,注意,低版本的node可能需要npminit先来创建一个package.json文件,这也是我推荐的,默认的会安装到目录中的node_modules;如果没有这个文件夹,会自动创建 卸载的话就是unintsall 全局安装(大多是工具,例如gulp等)-g(全写上是--global),全局安装之后,在任意的文件夹都可以访问到gulp 在在本地(当前目录上)安装(大多是包)不需要加-g 使用npmlist可以查看现在安装了的一些东西,npmlist|grep模块可以查看其中某个模块的信息 使用npminfo模块可以查看模块的信息及历史版本 使用npminstall模块@版本号可以来安装对应的版本的模块包,原包就会被覆盖 因为npm在国内收到伟大的墙的限制,所以下载速度奇慢,所以可以使用cnpm(淘宝镜像)来下载 下载cnpm: npminstall-gcnpm--registry=https://registry.npm.taobao.org

  • DB concept 恢复系统

    aries 减少恢复时间 减少检查点开销 避免重做日志冗余重做 减少日质量 LSN:日志序列号,标识操作在页上实施 物理逻辑redo,物理上标识受影响的页,页内逻辑 脏页表:内存已更新,未刷盘,减少恢复时不必要的重做 模糊检查点:记录脏页与相关信息,不在检查点将脏页写入,后台持续刷新 数据结构: LSN:唯一标示记录,文件号+偏移量 PageLSN:每个页维护,记录发生在该页的更新操作LSN,恢复阶段LSN小于该记录的日志将不执行,作为检查点的一部分, 磁盘上部分更新时,物理逻辑操作无法重做——缓冲页锁:更新完成(事务),且更新日志写入,释放锁(是否刷新?) 日志记录包含前一日志LSN:PreLSN 补偿日志记录:CLR:事务回滚中产生,read-only。abort日志记录作用。UndoNextLsn:回滚时下一个需要Undo的日志LSN(跳过已回滚的日志) 脏页表:缓冲区中已更新的页列表,每页:PageLSN(当前)RecLSN(初始)。写入磁盘移除 检查点日志记录:列表Of脏页活动事务(LastLsn) 恢复算法: 分析:脏的页,要撤销的事务,重做起始LSN redo:重做事务

  • JS+CSS+HTML 前端开发(六)

    火车上,看完whiteman的自传,百无聊赖,续写日志。 上次关于追求极致,前端开发中,对于多次使用的函数进行抽离,从而创建了专门的js文件,从而创造了包含增删改功能的js文件以及包括读取sql统计数据的函数的js文件。虽然如此,我的总体js文件的体积得到了至少30%的缩减。这只是总体而言,但是由于js文件数量的增加,相当于零碎文件增加,相应的与服务器端的连接次数也增加了,相应的增加了http服务的负担。所以,有些时候相应的效率提高了,但是性能可能是伴随着会降低,而这往往是我们无法解决的事情,两害相权取其轻吧。(也许有些大神会说,这些不是问题。但是我个人比较相信老子的损有余而补不足的名言,一方的增加必然伴随着另一方的减少。)所以相对来说,我的编程效率提高了,但是某些方面js文件的性能有些降低。所以在某些时候,衡量一下这个网速不断提高的社会,当前的网速一定程度上,平均满足了现在这个多次连接下载js文件的稍微麻烦的需求。一般来说,为了降低http的连接次数,也是为了降低服务器压力以及提高下载速度,一般要减少诸如图片,css文件以及js文件和html文件的数量,同时减少它们的体积。从而提高网

相关推荐

推荐阅读