读取Excel文件并将行排列为列(粗体),行值在粗体行下?

2024-09-30 12:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有数百个.xls和.xlsx文件,它们有某种顺序,但相当混乱

  • 中间有时会有空的单元格,这些单元格是不相关的,并且 应该被忽略
  • 如果有一个粗体单元格后跟一个粗体单元格,则第一个粗体单元格 可以忽略
  • 如果有一个粗体单元格后跟一个或多个空单元格 新的粗体单元格第一个粗体单元格+空单元格可以忽略
  • 如果存在具有“逻辑数据”或“估计逻辑数据”的单元格: 或者一些文本(逻辑数据)下面有粗体单元格 应该被忽略

通过使用Python/Pandas,我能在不发疯的情况下实现最终结果吗

示例1(文件名:“example1-heephone.xls”):**=bold,在代码块中似乎不起作用

**Features**
**Transmitter**
2.4GHZ
5GHZ
Power LED
- 1 x 3.5mm mic jack

**Receiver**
diameter
impedance
Mic Jack

**Logistic data:**
**Gift Box Measurement**
20'
40'

示例2(“示例2-keyboard.xls”):

**BSCI / SA8000**
BSCI / SA8000 certified
Certificate validity

**Upcost**

**Features**

Display (LCD, or LED)
Sync
**Estimated logistic data:**
Qty
Carton
20'

最终结果应该是一个.xlsx文件,每个列中的值都有一个下拉菜单,如:

|-----------|----------------------|------------------|------------------|-------------------------|-------------------------|
| Article   | Transmitter          | Receiver         | Logistic data:   | BSCI / SA8000           | Features                |
|-----------|----------------------|------------------|------------------|-------------------------|-------------------------|
| headphone | 2.4GHZ               | diameter         | 20'              |                         |                         | 
|           | 5GHZ                 | impedance        | 40'              |                         |                         |
|           | Power LED            | Mic Jack         |                  |                         |                         |                        
|           | - 1 x 3.5mm mic jack |                  |                  |                         |                         |                        
|-----------|----------------------|------------------|------------------|-------------------------|-------------------------|
| keyboard  |                      |                  | Qty              | BSCI / SA8000 certified | Display (LCD, or LED)   |  
|           |                      |                  | Carton           | Certificate validity    | Sync                    | 
|           |                      |                  | 20'              |

Tags: 文件数据示例dataled逻辑xlsxxls
2条回答

仅适用于.xlsx文件

from openpyxl import load_workbook

path = "test.xlsx"
book = load_workbook(path)
sheet = book.worksheets[0] # get first Excel sheet of test.xlsx

for cells in range(1, 201): # check first 200 cells
        cell = sheet.cell(cells, 1) # iterate over cells in Column 1 = A -> A1, A2, A3, ...
        if cell.value != None and cell.font.b == 1: # ignore empty cells and get bold cells
        ... "do stuff with cell" ...

为了检测样式,可以使用像styleframe这样的外部包。对每个示例文件重复步骤1和2

  1. 阅读示例文件,确定style为粗体的索引
from styleframe import StyleFrame
sf = StyleFrame.read_excel('Example-1.xlsx', read_style=True, use_openpyxl_styles=False, headers=None)
indices=[]
for i in range(0, len(sf)):
    for val in sf.iloc[i]:
        if(val.style.bold):
            indices.append(i)
  1. 查找索引之间的值
df=pd.read_excel("Example-1.xlsx", headers=None)
df=df.astype(str)
columns=[]
values=[]
for i in range(0,len(indices)):
    print(i)
    columns.append(df.iloc[indices[i]].values[0])
    if(i+1<len(indices)):
        values.append(list(df.iloc[indices[i]+1:indices[i+1]].values))
    else:
        if(indices[i]+1<len(df)):
            values.append(list(df.iloc[indices[i]+1:].values))
        else:
            values.append([])

values=list(map(lambda z: " ".join([x[0] for x in z]), values))
temp_dict=dict(zip(columns, values))
  1. 以下代码根据需要创建最终数据帧-
final_dict=[]
final_dict.append(temp_dict)
final_df=pd.DataFrame.from_dict(final_dict)

Example File必须包含一个额外的头,以减少歧义

Sample Input

相关问题 更多 >

    热门问题