用 openpyxl 处理 xlsx 文件
Dec 20, 2016openpyxl
是一个用来处理 excel 文件的 python 代码库, 安装什么略过不提, 只说一个简单操作的例子
- 例子
有这么一个表
| 高压/低压(实验组) | 高压/低压(对照组) | | ———- | ———- | | 156⁄99 | 110⁄70 | | 124⁄83 | 119⁄71 | | 103⁄78 | 100⁄60 | | 150⁄100 | 114⁄78 | | 150⁄100 | 109⁄74 | | 100⁄76 | 112⁄65 | | 130⁄90 | 130⁄77 | | 174⁄105 | 121⁄72 | | 109⁄85 | 129⁄84 | | 140⁄100 | 128⁄80 | | | 120⁄80 | | | 122⁄73 | | | 120⁄70 | | | 107⁄80 | | | 110⁄70 | | | 115⁄73 | | | 110⁄61 | | | 127⁄80 | | | 110⁄70 | | | 108⁄79 | | | 114⁄78 | | | 118⁄71 |
需要把高压低压分开两列来整, 手动写要累死狗, 上万的数据, 于是祭出Python大法
- 烂码
import re
import openpyxl
file = "工作簿2.xlsx"
wb = openpyxl.load_workbook(file)
ws = wb.get_sheet_by_name("Sheet1")
rows = ws.max_row
cols = ws.max_column
p = re.compile("[0-9]+/[0-9]+")
for row in range(1, rows + 1):
i = 0
for col in range(1, cols + 1):
v = str(ws.cell(row=row, column=col).value)
if re.search(p, v):
lst = v.split("/")
ws.cell(row=row, column=col + i + cols).value = int(lst[0])
i += 1
ws.cell(row=row, column=col + i + cols).value = int(lst[1])
else:
i += 1
ws = wb.get_sheet_by_name("Sheet2")
for row in range(1, rows + 1):
i = 0
for col in range(1, cols + 1):
v = str(ws.cell(row=row, column=col).value)
if re.search(p, v):
lst = v.split("/")
ws.cell(row=row, column=col + i + cols).value = int(lst[0])
i += 1
ws.cell(row=row, column=col + i + cols).value = int(lst[1])
elif re.search(re.compile("[0-9+/.+]"), v):
lst = v.split("/")
# print(lst)
ws.cell(row=row, column=col + i + cols).value = int(lst[0])
i += 1
ws.cell(row=row, column=col + i + cols).value = lst[1]
elif v == "未记录":
ws.cell(row=row, column=col + i + cols).value = "未记录"
i += 1
ws.cell(row=row, column=col + i + cols).value = "未记录"
else:
i += 1
wb.save("test.xlsx")
享受生活即可
结果长这样
高压/低压(实验组) | 高压/低压(对照组) | 高压(实验) | 低压(实验) | 高压(对照) | 低压(对照) |
---|---|---|---|---|---|
156⁄99 | 110⁄70 | 156 | 99 | 110 | 70 |
124⁄83 | 119⁄71 | 124 | 83 | 119 | 71 |
103⁄78 | 100⁄60 | 103 | 78 | 100 | 60 |
150⁄100 | 114⁄78 | 150 | 100 | 114 | 78 |
150⁄100 | 109⁄74 | 150 | 100 | 109 | 74 |
100⁄76 | 112⁄65 | 100 | 76 | 112 | 65 |
130⁄90 | 130⁄77 | 130 | 90 | 130 | 77 |
174⁄105 | 121⁄72 | 174 | 105 | 121 | 72 |
109⁄85 | 129⁄84 | 109 | 85 | 129 | 84 |
140⁄100 | 128⁄80 | 140 | 100 | 128 | 80 |
120⁄80 | 120 | 80 | |||
122⁄73 | 122 | 73 | |||
120⁄70 | 120 | 70 | |||
107⁄80 | 107 | 80 | |||
110⁄70 | 110 | 70 | |||
115⁄73 | 115 | 73 | |||
110⁄61 | 110 | 61 | |||
127⁄80 | 127 | 80 | |||
110⁄70 | 110 | 70 |