整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Range范围的调整及EXCEL单元格及图表插入

Range范围的调整及EXCEL单元格及图表插入

分享成果,随喜正能量】不要对失去过于纠结,这不仅有利于让你放下曾经的美好事物,也有利于让你在面对现在所拥有的一切,能够更加安心、更加踏实。。

《VBA之Word应用》,是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实例让大家感受到Word VBA 的妙处。本套教程共三册十六章,今日内容第六章 “Word中的Range对象(下)”第3节:Range范围的调整及EXCEL单元格及图表插入

第三节 Range对象的方法(七)

大家好,我们这讲继续Range对象方法的讲解,在上一讲中我们讲解了Range对象的InsertParagraph方法、InsertParagraphAfter方法、InsertParagraphBefore方法,这节我们将讲解SetRange 方法、PasteAndFormat方法、PasteSpecial 方法。

1 Range.SetRange方法

这种方法设置现有范围的起始字符和结束字符的位置。

语法:expression. SetRange(Start, End)

其中expression 是必需的,是一个代表Range对象的变量

参数:

1)Start 必需 Long 范围的起始字符位置。

2)End 必需 Long 范围的结束字符位置。

  • 字符位置值从文章的开头开始,第一个值为0(零)。 将计算所有字符,包括非打印字符。 隐藏字符即便未显示也计算在内。
  • SetRange 方法以重新定义现有的 Range 对象的起始和结束位置。此方法不同于Range方法,后者用于在给出起始和结束位置的情况下创建范围。

2 Range.PasteAndFormat方法

该方法粘贴选定的表格单元格,并为其设置指定的格式。

语法:expression.PasteAndFormat(Type)

其中expression 是必需的,是一个代表Range对象的变量

参数:Type 必需 WdRecoveryType 粘贴所选的表格单元格时使用的格式类型。

WdRecoveryType 枚举值:

wdChart 14 将 Microsoft Office Excel 图表粘贴为嵌入的 OLE 对象

wdChartLinked 15 粘贴 Excel 图表并将其链接到原始 Excel 电子表格

wdChartPicture 13 将 Excel 图表粘贴为图片

wdFormatOriginalFormatting 16 保留所粘贴材料的原始格式

wdFormatPlainText 22 粘贴为无格式的纯文本文字

wdFormatSurroundingFormattingWithEmphasis 20 使所粘贴文本的格式与周围文本的格式匹配

wdListCombineWithExistingList 24 将粘贴的列表与邻近的列表合并.

wdListContinueNumbering 7 使粘贴的列表根据文档中的列表继续编号。

wdListDontMerge 25 不支持.

wdListRestartNumbering 8 对粘贴的列表重新进行编号

wdPasteDefault 0 不支持.

wdSingleCellTable 6 将单个单元格表格粘贴为独立的表格。.

wdSingleCellText 5 将单个单元格粘贴为文本.

wdTableAppendTable 10 通过在所选行之间插入粘贴的行,将粘贴的单元格合并到现有的表格中

wdTableInsertAsRows 11 将粘贴的表格作为行插入到目标表格的两行中间.

wdTableOriginalFormatting 12 粘贴一个追加的表格,而不合并表格样式.

wdTableOverwriteCells 23 粘贴表格单元格并覆盖现有的表格单元格.

wdUseDestinationStylesRecovery 19 使用目标文档中使用的样式.

3 Range.PasteSpecial方法

该方法插入剪贴板中的内容

语法:expression.PasteSpecial (IconIndex, Link, Placement, DisplayAsIcon, DataType, IconFileName, IconLabel)

其中expression 是必需的,是一个代表Range对象的变量

参数:

1) IconIndex 可选 Variant 如果 DisplayAsIcon 为 True,则该自变量是一个数字,对应于要在 IconFilename 指定的程序文件中使用的图标。 图标显示在“更改图标”对话框中:0(零)对应于第一个图标,1 对应于第二个图标,依此类推。 如果此参数被省略,使用的是第一个(默认)图标。

2)Link 可选 Variant 如果为 True,则创建指向“剪贴板”内容源文件的链接。 默认值为 False。

3)Placement 可选 Variant 可以为下列 WdOLEPlacement 常量之一:wdFloatOverText 或 wdInLine。 默认值为 wdInLine。

4)DisplayAsIcon 可选 Variant 如果为 True,则将链接显示为图标。 默认值为 False 。

5)DataType 可选 Variant 剪贴板内容在插入文档后采用的格式。 可以为任意 WdPasteDataType 常量。

6)IconFileName 可选 Variant 如果 DisplayAsIcon 为 True,则此参数是存储要显示的图标的文件的路径和文件名。

7)IconLabel 可选 Variant 如果 DisplayAsIcon 为 True,则此参数是显示在图标下方的文本。

WdPasteDataType 枚举:

wdPasteBitmap 4 位图.

wdPasteDeviceIndependentBitmap 5 与设备无关的位图.

wdPasteEnhancedMetafile 9 增强型图元文件

wdPasteHTML 10 HTML.

wdPasteHyperlink 7 超链接.

wdPasteMetafilePicture 3 图元文件图片.

wdPasteOLEObject 0 OLE 对象.

wdPasteRTF 1 RTF 格式

wdPasteShape 8 形状

wdPasteText 2 文本

4 实例:Range范围的调整及EXCEL单元格及图表插入

下面我们通过一个实例来讲解一下本节的知识点,这个实例中我们先定义一个Range,为当前文档的第二段,然后利用SetRange来扩展这个范围。

之后我们在文档的最后插入一个空的段落,将光标移到这个空段落之处。

紧接着,我们要打开一个Excel文件,从这个文件中,我们把B2单元格复制到剪贴板,并将剪贴板的内容以对象的格式粘贴到光标处。

之后,我们再次在文档的最后插入一个空的段落,将光标移到这个空段落之处。并将Excel文件中的图表复制到剪贴板中,并将剪贴板中的内容粘贴到光标处。

最后关闭Excel文件。

我们先看一下代码:

Sub mynzB()

[代码见教程]

End Sub

代码截图:

代码解读:

1)Set myRange=ActiveDocument.Paragraphs(2).Range

MsgBox myRange.Text

以上代码设置 myRange 并提示给用户myRange 内容。

2)myRange.SetRange Start:=myRange.Start, _

End:=ActiveDocument.Paragraphs(3).Range.End

MsgBox myRange.Text

以上代码调整 myRange的范围并提示给用户myRange 内容。

3) ActiveDocument.Content.InsertParagraphAfter

myRange.SetRange Start:=ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Start, _

End:=ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.End - 1

myRange.Select

以上代码在活动文档的末尾插入一个段落,并将光标位置调整到最后。

4)Set myEXL=CreateObject("excel.application")

myfile="EXCEL工作簿.XLSX"

myEXL.workbooks.Open ActiveDocument.Path & "\" & myfile

myEXL.Visible=True

设置要打开的文件,并打开这个文件。

5)myEXL.Sheets("Sheet1").Range("B2").Copy

Selection.Collapse Direction:=wdCollapseStart

Selection.Range.PasteSpecial DataType:=wdPasteOLEObject

'将单元格B2以单元格的形式粘贴wdPasteOLEObject是单元格的格式,如果是文本的格式可以用wdPasteText。

6) ActiveDocument.Content.InsertParagraphAfter

myRange.SetRange Start:=ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Start, _

End:=ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.End

myRange.Select

以上代码再次在活动文档的末尾插入一个段落,并重置光标位置

7) myEXL.Sheets("Sheet1").ChartObjects(1).Copy

Selection.PasteAndFormat Type:=wdChartPicture

以上代码复制图表并粘贴,粘贴的是图片的格式

8)myEXL.workbooks.Close

Set myEXL=Nothing

以上关闭Excel文件。

最后我们看代码的运行:

Excel工作表的界面如下:

代码运行的提示框:

我们在当前文档中可以看一下图表的格式,会发现这个图表是图片格式的。

今日内容回向:

1 Word中Range对象的SetRange 方法、PasteAndFormat方法、PasteSpecial 方法的意义是什么?

2 如何利用VBA插入单元格及图表?

本讲内容参考程序文件:Doc 006文档.docm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

分享成果,随喜正能量】得与失,是一种选择,也是一种放弃,没有一种选择十全十美,没有一次决定万无一失。让自己豁达起来对于已经失去的东西,你或许也应该庆幸,它们不会再打扰你的内心。

所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的技术开发者来完善。

python的完美性。

未来人工智能,大数据方向,区块链的识别和进阶都将以python为中心来展开。

咳咳咳! 好像有点打广告的嫌疑了。

当前互联网信息共享时代,最重要的是什么?是数据。最有价值的是什么?是数据。最能直观体现技术水平的是什么?还是数据。

所以,今天我们要分享的是:如何来获取各个文件格式的文本信息。

普通文件的格式 一般分为: txt普通文本信息,doc word文档,html网页内容,excel表格数据,以及特殊的mht文件。

一、Python处理html网页信息

html类型的文本数据,内容是由前端代码书写的标签+文本数据的格式,可以直接在chrome浏览器打开,清楚 的展示出文本的格式。

python 获取html文件的内容和获取txt文件的方法相同,直接打开文件读取就可以了。

读取代码如下:

with open(html_path, "r", encoding="utf-8") as f:
 file=f.read()

file 是html文件的文本内容。是一个网页标签的格式内容。

二、Python处理excel表格信息

python拥有直接操作excel表格的第三方库xlwt,xlrd。调用对应的方法就可以读写excel表格数据。

读取excel操作代码如下:

filepath="C:\\Users\Administrator\Desktop\新建文件夹\笨笨 前程6份 武汉.xls"
sheet_name="UserList"
rb=xlrd.open_workbook(filepath)
sheet=rb.sheet_by_name(sheet_name)
# clox_list=[0, 9, 14, 15, 17]
for row in range(1, sheet.nrows):
 w=WriteToExcel()
 # for clox in clox_list:
 name=sheet.cell(row, 0).value
 phone=sheet.cell(row, 15).value
 address=sheet.cell(row, 9).value
 major=sheet.cell(row, 14).value
 age=sheet.cell(row, 8).value

其中row是表格数据对应的行数, cell获取具体行数,列数的具体数据。

三、Python读取doc文档数据

python读取doc文档是最麻烦的。处理逻辑复杂。处理的方式也有很多种。

python 没有直接处理doc文档的第三方库,但是有一个处理docx的第三方库。可以通过将doc文件转换为docx文件,再调用第三方python库pydocx来读取doc文档的内容。

这里需要注意的是,不要直接修改doc的后缀来修改成docx文件。直接通过修改后缀获取的docx文件,pydocx无法读取内容。

我们可以使用另外一个库来修改doc为docx。

具体代码如下:

def doSaveAas(self, doc_path):
 """
 将doc文档转换为docx文档
 :rtype: object
 """
 docx_path=doc_path.replace("doc", "docx")
 word=wc.Dispatch('Word.Application')
 doc=word.Documents.Open(doc_path) # 目标路径下的文件
 doc.SaveAs(docx_path, 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件
 doc.Close()
 word.Quit()

代码所需的包接口:

import os
import zipfile
from win32com import client as wc
import xlrd
from bs4 import BeautifulSoup
from pydocx import PyDocX
from lxml import html
from xpath_content import XpathContent
from write_to_excel import WriteToExcel

python处理docx文档的方法有很多种,具体使用情况,根据个人需求来决定。

No.1 解压docx文件

docx文件的原理,本质上就是一个压缩的zip文件,通过解压以后,就可以获取原来文件的各个内容。

docx解压后的文件结构如下:



docx文件的文本内容存储结构如下:

文本内容存储于word/document.xml文件中。



第一种方法,我们就可以先将docx还原成zip压缩文件,再解压zip文件,读取word/document.xml文件的内容就ok了。

具体操作代码如下:

def get_content(self):
 """
 获取docx文档的文本内容
 :rtype: object
 """
 os.chdir(r"C:\Users\Administrator\Desktop\新建文件夹") # 改变目录到文件的目录
 #
 os.rename("51 2014.09.12 1份Savannah.docx", "51 2014.09.12 1份Savannah.ZIP") # 重命名为zip文件
 f=zipfile.ZipFile('51 2014.09.12 1份Savannah.ZIP', 'r') # 进行解压
 xml=f.read("word/document.xml")
 wordObj=BeautifulSoup(xml.decode("utf-8"))
 # print(wordObj)
 texts=wordObj.findAll("w:t")
 content=[]
 for text in texts:
 content.append(text.text)
 content_str="".join(content)
 return content_str

最后获取到的就是docx文档的所有文本数据了。

No.2 将docx文档转换成python能够处理的文本格式

第一种方法,是依据docx文档的原理来获取数据,流程有点繁琐,有没有能直接读取docx文档内容的方法呢?答案,肯定是没有的,别想了,洗洗回家睡吧。

直接读取docx文档的方法没有,有没有能够将docx文档转换成python能够轻松处理的文本格式呢?

这个可以有,前面说了,python拥有大量丰富的第三方库(先夸一波我大python),历经千辛万苦终于找到了,一个能转换docx文档格式的第三方库,pydocx,pydocx库中有个方法pydocx.to_html()就可以直接将docx文档转换为html文件,怎么样?意不意外,惊喜不惊喜!

第二种方法,转换文本格式的代码如下:

def docx_to_html(self, docx_path):
 """
 docx文档转换成html响应
 :rtype: object
 """
 # docx_path="C:\\Users\Administrator\Desktop\新建文件夹\\51 2014.09.12 1份Savannah.docx"
 response=PyDocX.to_html(docx_path)

获取到的response是html文件内容。

四、Python处理mht文件

mht文件是一种只能在IE浏览器上展示的文本格式,在chrome浏览器中打开是一堆的乱码。

No.1 伪造IE请求mht文件内容

最基础的读取mht文本的方法就是伪造IE浏览器请求。

调用requests库,发送get请求网页链接,构造IE的请求头信息。

理论上来说,这种方法是可行的。但是呢,不建议用,原因大家都懂得。


No.2 转换文件格式

好了说正经的方法,猜测mht文件能否修改成其他文件格式来直接读取呢?

docx,不行;html,不行;excel,更不用说了。

真相只有一个!!!

直接修改后缀得到的docx,无法读取。

so,我们想到的方法是什么呢。没错,就是修改成doc文档。

方法是匪夷所思的,但也是灵感一现。

mht可以直接通过修改后缀转换成doc文档,doc文档读取文本内容的方法具体参考上面读取doc文档的方法。

如何获取html文本的内容?

html文本的内容是网页结构标签数据,取出文本的方式是:re正则,或者xpath。

后续,小伙伴有需要的话,会再开一章详细了解re,xapth的使用规则。

来源网络,侵权联系删除

TTP Range 请求总结

HTTP range 请求允许我们从服务器上只发送HTTP消息的一部分到客户端。这样的部分请求对于大型媒体、具有中断和恢复下载进度的下载文件请求很有帮助。

检查服务器是否支持 HTTP Range 请求

在进行HTTP range 请求之前,先检查服务器是否支持部分请求

如果请求一个资源时, HTTP响应中出现如下所示的 'Accept-Ranges', 且其值不是none, 那么服务器支持范围请求。

curl -I http://i.imgur.com/z4d4kWk.jpg

HTTP/1.1 200 OK
...
Accept-Ranges: bytes
Content-Length: 146515

在如上响应中,Accept-Ranges: bytes 代表可以使用字节作为单位来定义请求范围。这里的 Response Headers中的 Content-Length: 146515 则代表该资源的完整大小。

如果站点响应中未返回 Accept-Ranges 响应头,或者其值为none,那么这意味着server不支持HTTP range请求。

给服务器发HTTP Range请求

一、单范围请求

我们可以对一个资源发起单个范围请求:

curl http://i.imgur.com/z4d4kWk.jpg -i -H "Range: bytes=0-1023"

发出的请求如下:

GET /z4d4kWk.jpg HTTP/1.1 Host: i.imgur.com Range: bytes=0-1023

正常情况下 server 返回 206 部分内容响应:

HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024 ... (binary content)

这次并非检查server是否支持range请求,故Content-Length表示的是现在请求的范围大小,而Content-Range则表示的是这部分消息在完整资源中的位置。

二、多范围请求

curl http://www.example.com -i -H "Range: bytes=0-50, 100-150"

用逗号隔开多个范围,即可同时请求多部分资源。

响应如下:

HTTP/1.1 206 Partial Content Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5 Content-Length: 282 --3d6b6a416f9b5 Content-Type: text/html Content-Range: bytes 0-50/1270

该响应有:

  • 206部分响应码:
  • Content-Type: multipart/byteranges;boundary=3d6b6a416f9b5——>表示遵循多部分 byterange

每个部分包含自己的Content-Type 和 Content-Range

三、条件范围请求

当继续请求更多资源时,你需要确保被存储的资源在上一帧收到后没有被改变。

If-Range HTTP请求创建了一个带条件的range HTTP请求,如果条件得到满足,range请求将会被发出,server 发回带有适当正文的206 partial content 应答,如果条件不满足则返回完整资源,并显示200 OK状态。这个头可以与Last-Modified 验证程序,或者与 ETag 一起使用。

If-Range: Wed, 21 Oct 2015 07:28:00 GMT

HTTP Range 请求响应

在处理HTTP Range 请求时,有三个相关的状态:

  • 206 Partial Content——> HTTP Range 请求成功
  • 416 Requested Range Not Satisfiable status.——> HTTP Range 请求超出界限
  • 200 OK——> 不支持范围请求

与分块相比

Transfer-Encoding 请求头允许分块编码,这在服务器给客户端发送大量的数据,且响应总大小直到请求结束才能确定时很有用,如果服务器直接发送数据给客户端而不缓存响应,或者确定具体响应大小的话,会产生延迟。HTTP Range 请求和分块是兼容的,一起用或者不一起用均可。