zoukankan      html  css  js  c++  java
  • office套件

    一、PDF模块

      使用PyPDF2模块

    pip install PyPDF2

    1.1 从PDF读取数据

      直接读取,并打印出来。但是这种打印存在一个问题,不能中文字符

    import PyPDF2
    import os
    
    pdf_obj = open('de8ug.pdf', 'rb')    # 使用二进制方式打开,生成一个文件对象
    pdf = PyPDF2.PdfFileReader(pdf_obj)  # 把文件对象传入到pdfread中
    print(pdf.numPages)                  # 获取pdf的页数
    
    page = pdf.getPage(1)                # 获取PDF某一页内容,生产一个对象
    print(page.extractText())            # 打印出来,但是存在一个问题,不能显示中文

      解决中文字符的问题

    import os
    from pdfminer.pdfinterp import PDFResourceManager, process_pdf
                        # 资源管理      # 运行过程
    from pdfminer.converter import TextConverter # 文本转换 from pdfminer.layout import LAParams # 布局 from io import StringIO         # 临时文件 def convert_pdf(path): rsrcmgr = PDFResourceManager() retstr = StringIO() laparams = LAParams() device = TextConverter(rsrcmgr, retstr, laparams=laparams) # 把几个对象传入进来,生产文本转换对象 fp = open(path, 'rb')
    process_pdf(rsrcmgr, device, fp) # 转换的过程,转移到临时文件中 fp.close() device.close() out
    = retstr.getvalue() # 直接到临时文件中读取数据 retstr.close() return out

    s = convert_pdf('de8ug.pdf')
    s.split(' x0c')   # 每一页都是根据这个进行分割的

    1.2  写入PDF

      从某一个PDF中获取某一页写入到新的一个PDF中

    import PyPDF2
    
    pdf_writer = PyPDF2.PdfFileWriter()  # 先生成一个写对象
    
    # 生成一个读对象,并获取指定某一页码
    pdf_obj = open('de8ug.pdf', 'rb')
    pdf = PyPDF2.PdfFileReader(pdf_obj)
    page = pdf.getPage(1)                
    
    # 在写对象中加入这一夜
    pdf_writer.addPage(page)  
    
    # 打开一个文件,写入内容
    with open('lh-1.pdf', 'wb') as f:
        pdf_writer.write(f)
    pdf_obj.close()

    1.3 PDF 加密与解密

      加密

    with open('debug.pdf', 'rb') as f:
        # 打开需要加密文件,使用文件对象生成一个PDF_read对象
        pdf_read = PyPDF2.PdfFileReader(f)
        # 生成一个pdf写对象
        pdf_write = PyPDF2.PdfFileWriter()
    
        # 循环每一页,把read对象中的每一页,加入到write对象中
        for page in range(pdf.numPages):
            pdf_write.addPage(pdf.getPage(page))
        
        # 对read对象进行加密
        pdf_write.encrypt('hilouhui')
    
        # 直接写入到文本中
        with open('lh-en.pdf', 'wb') as f2:
            pdf_write.write(f2)

      解密:

    import PyPDF2
    
    with open('lh-en.pdf', 'rb') as f:
        pdf_read = PyPDF2.PdfFileReader(f)
    
        print(pdf_read.isEncrypted)  # 判读是否加密,这个只是read对象的方法
        pdf_read.decrypt('hilouhui')  # 解密
        # print(pdf_read.getPage(1).extractText())
        page = pdf_read.getPage(1)
        print(page.extractText())

    1.4  加水印

      加水印的原理其实就是多个pdf的合并

    import PyPDF2
    with open('de8ug.pdf', 'rb') as f_in:
        with open('water.pdf', 'rb') as f_out:
            # 打开两个pdf 对对象:
            pdf_in = PyPDF2.PdfFileReader(f_in)
            pdf_out = PyPDF2.PdfFileReader(f_out)
            # 打开一个写的PDF对象
            pdf_write = PyPDF2.PdfFileWriter()
    
            # 里面那层每一页读取出来,实用水印页进行合并。在写到pdf_write中
            for page_num in range(pdf_in.numPages):
                page = pdf_in.getPage(page_num)
                page.mergePage(pdf_out.getPage(0))  # 对每一页进行合并
                pdf_write.addPage(page)
            
            # 写入文件
            with open('de8ug-water.pdf', 'wb') as f:
                pdf_write.write(f)

    1.4 将数据导出为PDF格式

    import datetime  # 导入日期时间库
    import reportlab.pdfbase.ttfonts  # 导入reportlab的注册字体
    
    reportlab.pdfbase.pdfmetrics.registerFont(
        reportlab.pdfbase.ttfonts.TTFont('song', 'C:WINDOWSFontssimsun.ttc'))  # 注册字体,linux和windowns不同
    
    from reportlab.pdfgen import canvas
    from reportlab.lib.units import inch  # 导入单位英寸
    
    
    def create_pdf(input, output="disosi.pdf"):
        now = datetime.datetime.today()
        date = now.strftime("%h %d %Y %H:%M:%S")  # 设定日期格式
        c = canvas.Canvas(output)
        c.setFont('song', 10)  # 设置字体字号
        textobject = c.beginText()  # 定义开始
        textobject.setTextOrigin(inch, 11 * inch)  # 定义位置
        textobject.textLines('''LH备忘录: %s ''' % date)  # 输出标题
    
        for line in input:  # 通过循环的方式一行一行写入文件
            textobject.textLine(line.strip())  # 写入文件
    
        c.drawText(textobject)
        c.showPage()
        c.save()
    
    
    def main():
        report = ['我是娄辉', '你呢', '我很帅']
        create_pdf(report)
    
    
    if __name__ == '__main__':
        main()

     二、 Excel  表格操作

    python操作excel使用openpyxl这个模块,其中有三个对象:

      • workbook  工作簿,一个excle文件
      • sheet     表格,一个excle文件中包含多个表格
      • cell     单元格

    excel的操作的情景:

    1. 打开或者创建一个Excel需要创建一个Workbook对象
    2. 获取一个表则需要先创建一个Workbook对象,然后使用该对象的方法来得到一个Worksheet对象
    3. 如果要获取表中的数据,那么得到Worksheet对象以后再从中获取代表单元格的Cell对象

    2.1 三个对象操作

    2.1.1 workbook对象

    打开与 保存方法:

    import openpyxl
    wb = openpyxl.load_workbook('de8ug.xlsx') # 打开文件,加载到wb的内存处
    wb.save('lh.xlsx')    # 保存成另外一个文件
    import openpyxl
    wb = openpyxl.load_workbook('de8ug.xlsx')
    
    wb.active                    # 获取当前活跃的sheet,默认打开第一张活跃
    wb.sheetnames                # 获取所有的表名
    wb.worksheets                # 以列表的方式返回所有的worksheet对象
    
    wb.get_sheet_by_name('表名') # 获取一个表对象。但是这种方法现在不用了
    wb['name']                   # 使用这种方法获取表对象
    
    wb.read_only                 # 判断是否只读
    wb.encoding                  # 获取字符编码
    wb.properties                # 获取文件的信息,编码,时间,创建者等等
    
    
    wb.get_sheet_names      # 获取所有表格的名称(新版已经不建议使用,通过Workbook的sheetnames属性即可获取)
    get_sheet_by_name       # 通过表格名称获取Worksheet对象(新版也不建议使用,通过Worksheet[‘表名‘]获取)
    get_active_sheet        # 获取活跃的表格(新版建议通过active属性获取)
    remove_sheet            # 删除一个表格
    create_sheet            # 创建一个空的表格
    copy_worksheet          # 在Workbook内拷贝表格

    2.1.2 worksheet对象  表对象

    # 属性
    title:       表格的标题
    dimensions:    表格的大小,这里的大小是指含有数据的表格的大小,即:左上角的坐标:右下角的坐标
    max_row:      表格的最大行
    min_row:       表格的最小行
    max_column:     表格的最大列
    min_column:     表格的最小列
    rows:        按行获取单元格(Cell对象) - 生成器
    columns:       按列获取单元格(Cell对象) - 生成器
    freeze_panes:   冻结窗格
    values:      按行获取表格的内容(数据)  - 生成器
    
    # 方法
    iter_rows:       按行获取所有单元格,内置属性有(min_row,max_row,min_col,max_col)
    iter_columns:     按列获取所有的单元格
    append:        在表格末尾添加数据
    merged_cells:     合并多个单元格
    unmerged_cells:    移除合并的单元格

    2.1.3 cell对象  单元格对象

      cell对象的方法比较简单:

        获取单元格对象的两种方式:

          sh1 ['a1']

          sh1.cell(row=1, column=2)

    row:      单元格所在的行
    column:    单元格坐在的列
    value:     单元格的值,可以直接获取。 cell1.value = '改变的值' 也可以  cell1 = '改变的值'
    coordinate:  单元格的坐标

    2.1.4 函数 与  单元格样式

      添加函数其实就是  添加字符串,加上去后,让excel自动解析:

      例如: =AVERAGE(B2:B8)

     

    单元格样式:

    from openpyxl.styles import Font # 内置很多种样式
    font = Font(bold=True, size=20)    # 字体样式有很多方法
    sh2['B7'].font = font

    2.2 一些小case

    import openpyxl
    
    wb = openpyxl.load_workbook('de8ug.xlsx')
    sh1 = wb.active
    sh2 = wb['Sheet2']
    
    sh2['a1'] = '名字'
    sh2['b1'] = '分数大于75'
    index = 2
    for row in sh1.rows:  # 利用rows的生成器对象
        # print(row)
        # print(row[0].value,row[1].value)  
        if row[0].coordinate != 'A1' and row[1].value > 75:
            sh2['A' + str(index)] = row[0].value
            sh2['B' + str(index)] = row[1].value
            index += 1
    
    wb.save('111111111111.xlsx')
    挑选出分数大于75
    import openpyxl
    
    wb = openpyxl.load_workbook('de8ug.xlsx')
    
    sh1 = wb['成绩表']
    sh2 = wb['Sheet2']
    index = 2
    for row in range(2, sh1.max_row+1):
        grade = sh1.cell(row=row, column=2).value
        if grade > 75:
            sh2['A' + str(index)] = sh1.cell(row=row, column=1).value
            sh2['B' + str(index)] = grade
            index += 1
    
    wb.save('22222.xlsx')

       

      

  • 相关阅读:
    CSS样式
    Python宏观
    javaScript----------(函数)
    vue-----5计算属性
    python之函数作用域、嵌套以及闭包
    python之函数的定义、传参以及动态参数
    python之文件操作
    基础数据类型的补充以及深浅copy
    小数据池、代码块以及编码转换
    python基础二
  • 原文地址:https://www.cnblogs.com/louhui/p/9102927.html
Copyright © 2011-2022 走看看