victory的博客

长安一片月,万户捣衣声

0%

pandas提取指定数据并保存在原Excel工作簿中

实现代码:

import pandas as pd

df = pd.read_excel("物料表.xlsx", header=2)
# print(df)

df500 = df[df["数量"] > 500]
# print(df500)

with pd.ExcelWriter('物料表.xlsx', mode='a', engine='openpyxl',
                    datetime_format='YYYY-MM-DD') as writer:
    df500.to_excel(writer, sheet_name='数量大于500', index=False)

from openpyxl import load_workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment

thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色

wb = load_workbook("物料表.xlsx")
ws = wb["数量大于500"]

# 调整列宽
ws.column_dimensions['A'].width = 12
ws.column_dimensions['C'].width = 15.5
ws.column_dimensions['G'].width = 10

# 设置字号,对齐,缩小字体填充,加边框
for row_number in range(2, ws.max_row + 1):
    for col_number in range(1, ws.max_column + 1):
        c = ws.cell(row=row_number, column=col_number)
        c.font = Font(size=10)
        c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
        c.alignment = Alignment(horizontal="left", vertical="center")
wb.save("物料表.xlsx")

物料表.xlsx

python出数学练习题

实现代码:

# import random
#
# for i in range(5):
#     num1 = random.randint(1, 9)
#     num2 = random.randint(1, 9)
#     print(f"{num1} + {num2} = ")


# 加法、乘法题
import random
data = []  # 储存题目的列表
group = []  # 中转列表
while len(data) < 20:  # 题目个数,20行x4列共80个题,刚好放入word文档中的1页
    num1 = random.randint(0, 9)  # 随机整数1,从0-9中选取
    num2 = random.randint(0, 9)  # 随机整数2,从0-9中选取
    group.append(f"{num1} + {num2} = ")  # 数据放入中转列表
    if len(group) == 4:  # 按四道题分一组
        data.append(group)  # 数据放入总列表
        group = []  # 清空中转列表
print(data)

# # 减法题
# import random
#
# data = []
# group = []
# while len(data) < 20:
#     num1 = random.randint(1, 9)
#     num2 = random.randint(1, 9)
#     if num1 > num2:
#         group.append(f"{num1} - {num2} = ")
#         if len(group) == 4:
#             data.append(group)
#             group = []
#
# # print(data)

# # 除法题
# import random
#
# data = []  # 储存题目的列表
# group = []  # 中转列表
# while len(data) < 20:
#     num1 = random.randint(1, 19)
#     num2 = random.randint(1, 19)
#     if num1 >= num2 and num1 % num2 == 0:
#         group.append(f"{num1} ÷ {num2} = ")  # 数据放入中转列表
#         if len(group) == 4:  # 按四道题分一组
#             data.append(group)  # 数据放入总列表
#             group = []  # 清空中转列表
#
# print(data)

# 输出到word文件
def To_word(data, file_name):
    """
    data:需要传入的列表
    file_name:word文件的文件名
    """
    from docx import Document
    from docx.shared import Pt  # 用于设定字体大小(磅值)

    doc = Document()
    for i in data:
        # print(i)
        row = "\t\t".join(i)
        # print(row)
        doc.add_paragraph(row)
    # 设置字号
    for para in doc.paragraphs:
        for run in para.runs:
            run.font.size = Pt(16)  # 文字大小磅值
    doc.save(f"{file_name}.docx")

To_word(data, "加法题")
# To_word(data, "减法题")
# To_word(data, "乘法题")
# To_word(data, "除法题")

一键提取PDF中的表格到Excel

实现代码:

import os
import pdfplumber
from openpyxl import Workbook

path = 'PDF'  # 文件所在文件夹
files = [path + "\\" + i for i in os.listdir(path)]  # 获取文件夹下的文件名,并拼接完整路径
key_words = "主要会计数据"

for file in files:
    with pdfplumber.open(file) as p:
        wb = Workbook()  # 新建excel工作簿
        wb.remove(wb.worksheets[0])  # 删除工作簿自带的工作表

        # 获取关键词所在页及下一页的页码
        pages_wanted = []
        for index, page in enumerate(p.pages):  # 从0开始给所有页编号
            if key_words in page.extract_text():
                pages_wanted.append(index)
                pages_wanted.append(index + 1)
                break

        # 提取指定页码里的表格
        for i in pages_wanted:
            page = p.pages[i]
            tables = page.extract_tables()  # 读取表格
            if tables:  # 判断是否存在表格,若不存在,则不执行下面的语句
                ws = wb.create_sheet(f"Sheet{i + 1}")  # 新建工作表,表名的编号与表在PDF中的页码一致
                for table in tables:  # 遍历所有列表
                    for row in table:  # 遍历列表中的所有子列表,里面保存着行数据
                        ws.append(row)  # 写入excel表
        wb.save("Excel\\{}.xlsx".format(file.split("\\")[1].split(".")[0]))

PDF:
东旭蓝天:2019年年度报告.PDF
华特气体:2019年年度报告(修订版).PDF

批量修改word文件中的段落格式

实现代码:

import os
import docx
# 定义字体格式
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体


def F_title(run):
    # 标题文字
    run.font.size = Pt(22)  # 文字大小磅值
    run.bold = True  # 加粗
    run.font.name = "方正小标宋_GBK"  # 字体
    r = run._element.rPr.rFonts
    r.set(qn("w:eastAsia"), "方正小标宋_GBK")  # 字体


def F_name_dept(run):
    # 姓名,部门,日期
    run.font.size = Pt(17)  # 文字大小磅值
    run.bold = False  # 加粗
    run.font.name = "楷体"  # 字体
    r = run._element.rPr.rFonts
    r.set(qn("w:eastAsia"), "楷体")  # 字体


def F_main(run):
    # 正文的格式
    run.font.size = Pt(17)  # 文字大小磅值
    run.bold = False  # 加粗
    run.font.name = "仿宋"  # 字体
    r = run._element.rPr.rFonts
    r.set(qn("w:eastAsia"), "仿宋")  # 字体


def F_title1(run):
    # 标题一的格式
    run.font.size = Pt(17)  # 文字大小磅值
    run.bold = False  # 加粗
    run.font.name = "黑体"  # 字体
    r = run._element.rPr.rFonts
    r.set(qn("w:eastAsia"), "黑体")  # 字体


def F_title2(run):
    # 标题二的格式
    run.font.size = Pt(17)  # 文字大小磅值
    run.bold = True  # 加粗
    run.font.name = "楷体"  # 字体
    r = run._element.rPr.rFonts
    r.set(qn("w:eastAsia"), "楷体")  # 字体


# 获取待处理的文件的路径
path = '待处理文件'  # 文件所在文件夹
files = [path + "\\" + i for i in os.listdir(path)]  # 获取文件夹下的文件名,并拼接完整路径
# print(files)
# 逐个提取文件,设置字体格式
for file in files:
    doc = docx.Document(file)
    for run in doc.paragraphs[0].runs:  # 总标题字体格式
        F_title(run)

    for para in doc.paragraphs[1:3]:  # 部门、姓名及日期字体格式
        for run in para.runs:
            F_name_dept(run)

    title1 = ["一、", "二、", "三、", "四、"]  # 标题一的唯一特征字符串
    title2 = ["1、", "2、", "3、", "4、"]  # 标题二的唯一特征字符串
    for para in doc.paragraphs[3:]:
        if any(i in para.text for i in title1):  # 若该段落是标题一,则应用标题一的字体格式
            for run in para.runs:
                F_title1(run)
        elif any(j in para.text for j in title2):  # 若该段落是标题二,则应用标题二的字体格式
            for run in para.runs:
                F_title2(run)
        else:
            for run in para.runs:  # 其余都应用正文的字体格式
                F_main(run)
    doc.save('已处理文件\\{}'.format(file.split("\\")[1]))
    

已处理文件:
报告-何十.docx
报告-刘七.docx
报告-张三.docx
报告-朱八
报告-李四.docx
报告-猪八戒.docx
报告-王五.docx
报告-秦九.docx
报告-赵六.docx
报告-黄二.docx

python替换word文档中的文字

实现代码:

# -*- coding:utf-8 -*-
import docx


# # 定义函数替换文字块中的字符
# def info_update(doc, old_info, new_info):
#     for para in doc.paragraphs:  # 遍历段落
#         for run in para.runs:  # 遍历文字块
#             # run.text = run.text.replace(old_info, new_info)  # 替换
#             print(run.text)
#
#
# doc = docx.Document('替换前.docx')
# info_update(doc, '第四次', '第五次')
# info_update(doc, '2019', '2020')
# info_update(doc, '18', '10')
# doc.save('替换后.docx')

# doc = docx.Document('替换前.docx')
# for para in doc.paragraphs:  # 遍历段落
#     for run in para.runs:  # 遍历文字块
#         # run.text = run.text.replace(old_info, new_info)  # 替换
#         print(run.text)

# # 按段落查看文字
# doc = docx.Document('替换前.docx')
# for para in doc.paragraphs:
#     print(para.text)

import docx
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体


def info_update(doc, old_info, new_info):
    for para in doc.paragraphs:
        para.text = para.text.replace(old_info, new_info)

    # 设置第一段(标题)的文字格式
    for run in doc.paragraphs[0].runs:
        run.font.size = Pt(14)  # 文字大小磅值
        run.bold = True  # 加粗
        run.font.name = "微软雅黑"  # 字体选择
        # 中文字体应用,固定写法
        r = run._element.rPr.rFonts  # 字体,固定写法
        r.set(qn("w:eastAsia"), "微软雅黑")  # 字体

    # 设置第二及后续段落的文字格式
    for para in doc.paragraphs[1:]:
        for run in para.runs:
            run.font.size = Pt(12)  # 文字大小
            run.bold = False  # 不加粗
            run.font.name = "微软雅黑"  # 字体选择
            # 中文字体应用,固定写法
            r = run._element.rPr.rFonts
            r.set(qn("w:eastAsia"), "微软雅黑")


doc = docx.Document('替换前.docx')
info_update(doc, "第四次", "第五次")
info_update(doc, "2019", "2020")
info_update(doc, "18", "10")
doc.save('替换后_设置格式.docx')

替换前.docx

69.sqrt(x)

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

题目链接

思路

1.二分法

代码

class Solution(object):
    @staticmethod
    def my_sqrt1(a):
        """二分法开根号"""
        # 初始化左右边界
        left, right = 0, a
        while left <= right:
            mid = (left + right) // 2
            if mid ** 2 == a:
                return mid
            elif mid ** 2 > a:
                right = mid - 1
            else:
                left = mid + 1
        return right


if __name__ == "__main__":
    a = 3
    s = Solution()
    sqrt_a = s.my_sqrt1(a)
    print(sqrt_a)