无法理解openpyxl模块中工作表的append方法如何工作

时间:2019-06-03 11:39:54

标签: python openpyxl

以下是一些代码:

from openpyxl import load_workbook

wb = load_workbook('myfile.xlsx')
ws = wb.active 
# data for filling Excel table
rows = (
   (88, 46, 57),
   (89, 38, 12),
   (23, 59, 78),
   (56, 21, 98),
   (24, 18, 43),
   (34, 15, 67)
)
for row in rows:
    ws.append(row)
wb.save('my_changed_file.xlsx')

执行上面的代码后,我希望看到第一行填充了Excel表,但是第二行填充了该表。

为什么append方法可以正常工作?

2 个答案:

答案 0 :(得分:1)

这不是append的错。每个工作簿在启动时至少具有一行和一列。不久前,我遇到了类似的问题:Determine if worksheet is empty in openpyxl。根据作者(Charlie Clark)的说法,内部计数器max_rowmax_column必须始终严格为正,因此append将始终写入第二行。

您始终可以在控制索引的循环中设置单元格,这与append的操作非常相似,很方便:

for r, row in enumerate(data, start=1):
    for c, value in enumerate(row, start=1):
        worksheet.cell(row=r, column=c).value = value

填充A1后,append会完全按照您的期望工作。

答案 1 :(得分:0)

我遇到了同样的问题-空行自动出现,直到这个线程之前都不知道为什么。

将分享我的最终解决方案:

import java.util.Observable;

public class UserModel extends Observable {
    
    public enum ChangedValue {
        ID, //
        NAME, //
        EMAIL, //
        //...
    }
    
    private Integer id;
    private String name;
    private String email;
    
    //...
    
    public void setId(Integer id) {
        this.id = id;
        setChanged();
        notifyObservers(ChangedValue.ID);//use the enum types as parameters here
    }
    
    public void setName(String name) {
        this.name = name;
        setChanged();
        notifyObservers(ChangedValue.NAME);
    }
    
    public void setEmail(String email) {
        this.name = email;
        setChanged();
        notifyObservers(ChangedValue.EMAIL);
    }
}