openpyxl - 覆盖数据表并保留数据透视表

2024-03-03

我已经看到了这个问题的一些答案,但没有一个有效。 例如:如何使用 openpyxl 写入现有 Excel 文件而不破坏公式? https://stackoverflow.com/questions/20262448/how-to-write-to-an-existing-excel-file-without-breaking-formulas-with-openpyxl

文档似乎没有透露任何内容:http://openpyxl.readthedocs.io/en/latest/api/openpyxl.reader.excel.html http://openpyxl.readthedocs.io/en/latest/api/openpyxl.reader.excel.html我尝试更换xls.load_workbook with xls.reader.excel.load_workbook但这并没有改变任何事情。

我当前的代码会覆盖数据表中的数据,但会终止另一个表中的数据透视表功能(该表仍然存在,但只有值)。知道如何保留数据透视表吗?

import pandas as pd
import openpyxl as xls
from shutil import copyfile

template_file = 'openpy_test.xlsx' 
output_file = 'openpy_output.xlsx' 

copyfile(template_file, output_file)

book = xls.load_workbook(output_file,guess_types=False,data_only=False)
writer = pd.ExcelWriter(output_file,engine='openpyxl')

writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

df.to_excel(writer,sheet_name='data',index=False,encoding='utf8')
writer.save()

我也尝试过book.save('dummycopy.xlsx'),这也可以通过不起作用的数据透视表进行保存。所以我确信问题与 load_workbook 函数有关。

封装版本:

openpyxl 2.4.10 py36_0

熊猫 0.20.3 py36hce827b7_2


我认为 openpyxl 目前不支持 Excel 数据透视表。我不得不改用 win32com 库。

这是我编写的一个包装模块,用于使用数据透视表执行特定操作;它基本上是VBA翻译成Python(记录宏并读取VBA,它会有意义)。希望能帮助到你。它仍在进行中,但应该足以供您使用。

import os, datetime
import win32com.client as win32
win32c = win32.constants
import sys, datetime

letters = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' #space to compensate for index. if letter is a if column is 1

def Pull_excel_workbook(path = '', filename = '', visible = False):
    '''function to run excel on the given filename'''
    if path == '': path = os.getcwd()
    if filename == '': raise FileNotFoundError('Please supply a file')
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    excel.Visible = visible
    try: wb = excel.Workbooks.Open(path + filename)
    except: print('Try again\n{}'.format(sys.exc_info()))
    ws = wb.ActiveSheet
    data = list(ws.UsedRange.Value) #2d list of rows and columns
    src = '{}!R1C1:R{}C{}'.format(ws.Name, len(data), len(data[0]))
    return excel, wb, src

    #wb.SaveAs(path + filename)

def Create_pivottable(wb, src, table_name = 'Pivot'):
    '''creates Pivot Table object in the wb in a new Pivot worksheet'''
    ws = wb.Sheets.Add()    #should also change wb.ActiveSheet to the new one.
    ws.Name = table_name
    tname = ws.Name
    starting_point = (4,1)  #row, column
    pc = wb.PivotCaches().Add(SourceType = win32c.xlDatabase,
                              SourceData = src)
    try:
        pt = pc.CreatePivotTable(TableDestination = '{}!R{}C{}'.format(tname, starting_point[0], starting_point[1]),
                            TableName = table_name,
                            DefaultVersion = win32c.xlPivotTableVersion10 #15
                            )
    except:             #not sure if will work...
        print('{}:{}:{}:{}'.format(wb, src, table_name, '{}!R{}C{}'.format(tname, starting_point[0], starting_point[1])))
        #tabledestination format of RN Pivot!R4C1 is not correct format, should be 'RN Pivot'!R4C1
        pt = pc.CreatePivotTable(TableDestination = '{}!R{}C{}'.format(tname, starting_point[0], starting_point[1]),
                            TableName = table_name,
                            DefaultVersion = win32c.xlPivotTableVersion15
                            )
    wb.Sheets(ws.Name).Select()
    wb.Sheets(ws.Name).Cells(3,1).Select()

def Add_to_Filter(wb, tname, field_name):
    ''' '''
    field = wb.ActiveSheet.PivotTables(tname).PivotFields(field_name)
    field.Orientation = win32c.xlPageField
    field.Position = 1

def Add_to_Row(wb, tname, field_name, position = 1):
    ''' '''
    field = wb.ActiveSheet.PivotTables(tname).PivotFields(field_name)
    field.Orientation = win32c.xlRowField
    field.Position = position

def Add_to_Column(wb, tname, field_name, position = 1):
    ''' '''
    field = wb.ActiveSheet.PivotTables(tname).PivotFields(field_name)
    field.Orientation = win32c.xlColumnField
    field.Position = position
    if position > 1:
        text = 'maybe do something here....'
        pass

def Add_to_Value(wb, tname, field_name, alias = '', calculation = 'xlSum'):
    ''' '''
    if type(calculation) is str and calculation in win32c.__dict__['__dicts__'][0]:
        calculation = win32c.__dict__['__dicts__'][0][calculation]
    datafield = wb.ActiveSheet.PivotTables(tname).PivotFields(field_name)
    wb.ActiveSheet.PivotTables(tname).AddDataField(datafield, alias, calculation)

def LtoC(letter):
    global letters
    col = letters.index(letter)
    return col

def CtoL(col):
    global letters
    letter = letters[col]
    return letter

def Format_pretty(wb, tname, row_to_colapse):
    '''makes it look prettier'''
    wb.ActiveSheet.PivotTables(tname).TableStyle2 = 'PivotStyleMedium9'
    if type(row_to_colapse) is not str:
        for row in row_to_colapse:
            wb.ActiveSheet.PivotTables(tname).PivotFields(row).ShowDetail = False #collapses
            wb.ActiveSheet.PivotTables(tname).PivotFields(row).RepeatLabels = True #repeats labels
    else:
        wb.ActiveSheet.PivotTables(tname).PivotFields(row_to_colapse).ShowDetail = False #collapses
        wb.ActiveSheet.PivotTables(tname).PivotFields(row_to_colapse).RepeatLabels = True #repeats labels
    wb.ActiveSheet.Columns('A:Z').EntireColumn.AutoFit()
    wb.ActiveSheet.Range('A1').Select()

def Add_calcd_col(ws, col, row_start, row_end, formula, style = '', col_title = 'default'):
    '''col and rows should be int
    '''
    letter = CtoL(col)
    ws.Range('{0}{1}:{0}{2}'.format(letter, row_start, row_end)).Select()
    ws.Cells(row_start, col).Value = col_title
    for row in range(row_start + 1, row_end + 1):
        ws.Cells(row, col).Value = formula.format(row)
    ws.Range('{0}{1}:{0}{2}'.format(letter, row_start, row_end)).Style = style
    #print("ws.Range('{0}1:{0}200'.format({0})).Style = style".format(letter))
    #ws.Range('{0}1:{0}200'.format(letter)).Style = style

def Values_to_columns(wb,tname, position = 2):
    ''' '''
    wb.ActiveSheet.PivotTables(tname).DataPivotField.Orientation = win32c.xlColumnField
    wb.ActiveSheet.PivotTables(tname).DataPivotField.Position = position

def WB_save(wb, path, tname, filename):
    '''clean save of the new file '''
    #Format_pretty(wb, tname, 'Division') #that needs to be fixed....
    new_filename = filename[:-5] + '-{}.xlsx'.format(datetime.date.today().strftime('%m.%d.%y'))
    wb.SaveAs(path + new_filename)

def Pivot_refresh(path, filename, pivot_sheet_name, pivot_table_name = 'Pivot'):
    '''function to refresh the pivot table
    tested and functional with recruiting prod report'''
    excel, wb, src = Pull_excel_workbook(path = path, filename = filename)
    wb.Sheets(pivot_sheet_name).Select()
    cell = 'A6' #need a better way for this
    excel.Worksheets(pivot_sheet_name).Range(cell).PivotTable.RefreshTable()
    #pvt = excel.Worksheets(pivot_sheet_name).Range(cell).PivotTable
    #pvt.RefreshTable()
    WB_save(wb, path, pivot_table_name, filename)
    #pivot refresh
    #new = filename[:-5] + '-{}.xlsx'.format(2)
    #Pivot_refresh(path = path, filename = new, pivot_sheet_name = 'Pivot')

def Hide_columns(wb, tname, start, end):
    '''Hides columns'''
    if type(start) is not str: start = CtoL(start)
    if type(end) is not str: end = CtoL(end)
    wb.ActiveSheet.Columns('{}:{}'.format(start, end)).EntireColumn.Hidden = True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openpyxl - 覆盖数据表并保留数据透视表 的相关文章

  • 如何检查给定名称的变量是否是非本地变量?

    给定一个堆栈帧和一个变量名 我如何判断该变量是否是非局部的 例子 import inspect def is nonlocal frame varname How do I implement this return varname not
  • Sublime Text 3 内部图像查看器

    是否可以为 Sublime Text 3 创建一个内部图像查看器插件 我注意到在他们的论坛中 人们提到 ST2 不可能 因为 API 不允许访问 UI 和小部件 但只是想知道 ST3 是否仍然如此 Sublime Text 3 现在有内置的
  • Pandas groupby:根据另一列中的值更改一列中的值

    我会尽力解释我的问题 但我是 Pandas 新手 所以请耐心等待 我有一个 Pandas 数据框df Random ID Seq ID Type Seq Token 0 8 1 User First 1 8 2 Agent Second 2
  • 将大型 Twitter JSON 数据 (7GB+) 加载到 Python 中

    我已经通过 AWS 设置了一个公共流来收集推文 现在想做一些初步分析 我的所有数据都存储在 S3 存储桶中 5mb 文件 我下载了所有内容并将所有文件合并为一个 每条推文都按照 Twitter 规范存储为标准 JSON 对象 基本上 合并的
  • python中多个页面的数据串联时出现错误

    我在连接多个页面的数据并将其导出到单个 CSV 文件中时遇到错误 根据我的代码 数据导出到第 10 页 但在第 10 页之后它正在工作 import urllib request from bs4 import BeautifulSoup
  • 使用 imaplib 库连接到电子邮件时遇到 AUTHENTICATIONFAILED 错误

    如何连接到 imaplib 库而不遇到 AUTHENTICATIONFAILE 错误 通过网络浏览器登录时 我的 Gmail 收件箱显示严重的安全警报 登录尝试被阻止 IMAP SERVER imap gmail com USERNAME
  • ctypes c_char_p 的不同行为?

    我对不同版本的 python 的这种行为感到困惑 不明白为什么 Python 2 7 5 default Aug 25 2013 00 04 04 GCC 4 2 1 Compatible Apple LLVM 5 0 clang 500
  • 无法在 VS Code 中导入

    我是 python 新手 一直在使用 VS code 现在我正在研究汤普森采样问题 需要 numpy 和 matplotlib 我已经导入了这两个库 但 VS code 给出了无法导入的错误 我知道我必须使用 PIP 进行安装 并且我已经看
  • 为什么我必须在 pybson (=bson, GitHub:py-bson) 之后安装 pymongo 才能成功导入 pybson?

    编辑 将问题放在网上很长时间后 我注意到这是一个衍生产品无法使用 pymongo 2 2 连接到 MongoDB 2 0 5 数据库 https stackoverflow com questions 10603754 cant conne
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 除下一行的值并在数据框中创建列

    我有一个像这样的csv id value 1 100 1 150 1 200 1 250 2 300 2 350 2 400 2 450 我想根据每个唯一 ID 的值生成一列 例如 id 1 的前 2 行值为 100 150 我正在尝试创建
  • 列表值意外变化[重复]

    这个问题在这里已经有答案了 为什么是这个列表r即使我只是想更改列表 也会被更改v 即使它们不指向相同的内存位置 r v list r 2 2 1 2 8 3 10 2 1 8 4 2 4 6 4 for c a in enumerate r
  • Pandas:如何根据另一个数据框的值对数据框上的列求和

    我是 Pandas 新手 我正在尝试做以下事情 我有一个名为的数据框comms包含articleID和commentScore列 等等 我有另一个名为arts带有列文章 ID 我需要创建arts一个名为文章评分 每篇文章必须具有articl
  • 互补DNA序列

    我在编写这个循环时遇到问题 它似乎在第二个序列之后停止了 我想返回给定 DNA 序列的互补 DNA 序列 例如 AGATTC gt TCTAAG 其中 A T 和 C G def get complementary sequence dna
  • 现在与出生日期之间的年、月、日、分钟差异

    import datetime birthday datetime datetime 1996 8 15 differnce datetime datetime now birthday This returns a timedelta o
  • Python3如何安装.ttf字体文件?

    我想使用 python3 更精确的 Python 3 6 代码在 Windows 10 上安装 ttf 字体文件 我用谷歌搜索 但我发现的唯一的就是这个使用python在windows上安装TTF字体 https stackoverflow
  • 无法使用 BeautifulSoup4 (Python 3) 抓取特定表

    我想从 Ligue 1 足球网站上抓取一张表格 具体来说 该表包含有关卡片和裁判的信息 http www ligue1 com LFPStats stats arbitre competition D1 http www ligue1 co
  • Python 类型提示:typing.Mapping 与typing.Dict

    我正在开发一个 python 项目 我们使用typing整个模块类型提示 看来我们用的是typing Dict and typing Mapping几乎可以互换 有理由选择其中一种而不是另一种吗 我自己设法回答了这个问题 typing Di
  • 将 github 上的包安装到 Spyder 中

    我一直在尝试安装并导入mpl finance来自 github 的包 在我的 Spyder 环境中没有成功 我努力了 pip install e git https github com matplotlib mpl finance git
  • 类型错误:只能使用标量值执行操作

    如果您能让我知道如何为所提供的表格绘制一些信息丰富的图表 我将不胜感激here https www iasplus com en resources ifrs topics use of ifrs 例如 我需要一个名为 国内非上市公司 非上

随机推荐

  • 多个型号的评论

    在我的 Rails 应用程序中 我目前设置了评论以与我的帖子模型一起使用 该模型运行正常 如何向我的图书模型添加评论 这是我到目前为止所拥有的 以下是我的评论架构中的内容 create table comments force true d
  • jsx 上的 eslint 缩进

    我正在尝试制作简单的组件 但是当我点击ctrl s它这样做 警告和错误是这样的 eslint 预期结束标签与开始的缩进相匹配 react jsx ending tag location eslint 预期缩进 4 空格字符但发现2 reac
  • iOS 图表 moveViewToX 似乎不起作用

    我正在尝试移动当前显示的数据范围 看了文档 看来应该可以用moveViewToX函数将视图的左侧移动到给定的 x 值 我制作了一个测试代码 其中有 1 个带有按钮的视图 当视图加载到模拟器中时 图表会正确显示 当按钮被点击时 它会调用mov
  • python ssl ssl.SSLError: [SSL: UNSUPPORTED_PROTOCOL] 不支持的协议 (_ssl.c:590)

    使用 python 2 7 10 或 2 7 9 时出现此错误 但适用于 python 2 7 6 尚未测试其他版本 OpenSSL 版本 openssl version a OpenSSL 1 0 1f 6 Jan 2014 built
  • 如何从 Pl/SQL 中的存储函数返回临时 CLOB 实例?

    我的存储函数使用以下命令创建临时 LOB 实例 Dbms Lob CreateTemporary BUFFER TRUE Dbms Lob SESSION where BUFFER是当地人CLOB多变的 之后函数填充BUFFER一些数据并返
  • Android 浏览器中的 SVG

    我知道它本身不支持 但是是否有任何 JS Shims 可以渲染到画布对象或允许我在本机 Android 浏览器上渲染 SVG 的东西 不是 Opera 等 因为我想避免用户需要安装另一个浏览器 我想你想要的是这个库 http code go
  • 多项式回归废话预测

    假设我想用二次 正交 多项式拟合线性回归模型 然后预测响应 这是第一个模型 m1 的代码 x 1 100 y 2 3 x 5 x 2 rnorm 100 m1 lm y poly x 2 prd 1 predict m1 newdata d
  • 实体框架,代码优先:将主从与零对一关系相结合

    我使用代码优先 EF 有一个简单的主从关系 public class User public string Id get set public ICollection
  • 如何将多个 FlowDocument 连接成 1 个 FlowDocument

    我有多个 FlowDocument 我想将它们连接在一起 下面的方法没有 return 语句 我想做的是将 TextRange 转回 FlowDocument private FlowDocument Concatenate FlowDoc
  • if(!isset($_SESSION['username'])) 导致用户从 verify_login_form.php 重定向回 index.php

    我的网站上有一个登录系统 它将用户从 index php 带到 verify login form php 然后 如果电子邮件 用户名组合与帐户匹配 它们就会被带到 home php 我遇到的问题是我有 if isset SESSION u
  • Eclipse Java启动配置文件路径

    我正在寻找 Eclipse 存储其启动配置的文件 我正在 Ubuntu 中进行一些 Java 开发 我正在开发的一个可执行文件需要另一个可执行文件的输出作为它的参数 也就是说 B 的输出需要作为命令行参数传递给 A 在Eclipse中 我不
  • 从 C DLL 到 .NET 的接口

    我有一个用 C 编写的遗留 DLL 我想从 C NET 应用程序调用它 问题是 C DLL 的 DLL 接口相当复杂 是这样的 declspec dllexport void stdcall ProcessChunk void p proc
  • 如何在 Mac OS X Snow Leopard 中运行 XUL 应用程序?

    我正在尝试在 Mac OS X 中创建 XUL Hello World 应用程序 我从以下位置下载 XULRunnerhere http releases mozilla org pub mozilla org xulrunner rele
  • 从使用 (WHERE) 条件选择的行中获取上一行和下一行

    例如我有这样的说法 my name is Joseph and my father s name is Brian 该语句按单词拆分 如下表 ID word 1 my 2 name 3 is 4 Joseph 5 and 6 my
  • JAX-RS 中必需的 @QueryParam(以及在缺少 @QueryParam 时该怎么做)

    我部署了一个网络服务组件JBoss 应用服务器 7使用RETEasy JAX RS执行 是否有注释可以声明必需的 强制的 查询参数参数在JAX RS 如果没有 处理缺少此类参数的情况的 标准 方法是什么 当使用所有强制参数正确调用时 我的
  • 亚马逊 EC2 延迟

    同一区域中一对 Amazon EC2 实例之间的简单连接的预期延迟是多少 Thanks 延迟应类似于同一 LAN 中两台计算机的延迟 只需确保在连接两个映像时使用的是私有 IP 而不是公共 IP
  • Java ProcessBuilder:引号内有空格

    我正在使用 ProcessBuilder 运行 FFMPEG 来转换和标记我的一些 MP3 文件 在 bat 文件中手动使用以下内容可以按预期工作 E Dokumente workspace MusicBot ffmpeg bin ffmp
  • 使用scrapyd部署项目出错

    我的项目文件夹中有多个蜘蛛 并且希望立即运行所有蜘蛛 因此我决定使用 scrapyd 服务运行它们 我开始这样做是因为看到here http scrapy readthedocs org en 0 7 topics scrapyd html
  • Django - URL 模式正则表达式不匹配带重音的字符串参数

    我在将带重音符号的字符串参数传递到 Django 应用程序时遇到一些问题 我有以下网址模式 url r galeria P
  • openpyxl - 覆盖数据表并保留数据透视表

    我已经看到了这个问题的一些答案 但没有一个有效 例如 如何使用 openpyxl 写入现有 Excel 文件而不破坏公式 https stackoverflow com questions 20262448 how to write to