Как изменить ячейку на листе в файле xlsm, используя openpyxl в зависимости от индекса значения кортежа - PullRequest
3 голосов
/ 10 июля 2019

Я пытаюсь изменить некоторые новые значения в существующем файле xlsm с некоторой помощью pandas dataframe и tuple variable

Итак, я заметил, что библиотека openpyxl может изменить книгу xlsm, из моего предыдущего вопроса , как обновить существующий лист xlsm с помощью макросов, используя pandas, openpyxl, xlwings без потери макросов

В соответствии с этим вопросом Как писать в xlsm с использованием openpyxl , я попытался создать этот код так, чтобы таким образом изменить нужные мне данные через tuple.value.index.

# This is my directory                         
mydir = (os.getcwd()).replace('\\', '/') + '/' 
#This is my xlsm file
gov_wb = load_workbook(filename=r'' + mydir + 'Governance_Tracker - Copy 
- Copy.xlsm', read_only=False, keep_vba=True)
#This is sheet I want to modify
gov_trcker = gov_wb['Gov_Tracker']                                                                                    
gov_trcker.cell(row=values.index("%s"), column=31).value = 
'ExampleExampleExampleExample'                             
gov_wb.save('outfile.xlsm')

но я нахожу эту ошибку

Traceback (most recent call last):
File "C:/Users/mwx707566/PycharmProjects/MyRobotAutomate/MyRobotFunc.py", 
line 115, in <module>
gov_trcker.cell(row=values.index("%s"), column=31).value = 'dsfgdsgvdf'
ValueError: tuple.index(x): x not in tuple

Любая идея, как изменить существующий файл xlsm, не теряя макросы, примерно так

Примечание: любые кусочки информации в моем предыдущем вопросе как обновить существующий лист xlsm с помощью макросов, используя pandas, openpyxl, xlwings без потери макросов

Редактировать

Кроме того, мне нравится этот sheet cell object документ. https://pythonhosted.org/xlrd3/cell.html, но все еще не нашли def берет tuple любое предложение?

Отредактировано 2

В соответствии со сценарием Muhammad Adeel я следую его сценарию в зависимости от своих потребностей, и вот мой код

import sys
import xlrd
import unicodedata
import base64
import decimal
import glob
import csv
import xlwt
import os
import xlutils
from xlutils.copy import copy as xl_copy

reload(sys)

mydir = (os.getcwd()).replace('\\', '/') + '/'
myPath = mydir + 'Governance_Tracker - Copy - Copy.xlsm'

if not os.path.exists(myPath):
gov_wb = xlwt.Workbook(encoding='ascii')
else:
   upd_b = xlrd.open_workbook(myPath)
   gov_wb = xl_copy(upd_b)
   sheets = upd_b.sheets()

last_sheet_index = len(sheets)
xl_sheet = upd_b.sheet_by_index(last_sheet_index - 1)
print ('Sheet name: %s' % xl_sheet.name)

for i in range(1, xl_sheet.nrows):
    previous_day_data.append(xl_sheet.row(i))
sheet_names = []
for x in sheets:
  sheet_names.append(x.name)

if new_worksheet_name in sheet_names:
    print 'THE SHEET ALREADY PRESENT WITH THE SAME DATE.. KINDLY DELETE 
THAT'
return

worksheet = gov_wb.add_sheet(new_worksheet_name)

rowHeaders = [
"#", "Site Name", "Region", "Site Type", "SiteCode", "TAC Name", 
"DT\nReadiness", "RFS Date", "RFS"
, "Huawei 1st submission date ", "TE 1st Response date ", "Huawei 2nd 
submission date ", "TE 2nd Response date ",
"Huawei 3rd submission date ", "TE 3rd Response date ", "Acceptance 
Date(Optimization)", "Acceptance Date(Planning)", "signed sites",
"As Built Date", "AS built status", "Date DT", "DT Status", "SHR Status", 
"DT Planned", "Integeration Status", "Comments/snags",
"Cluster name", "Type(Standalone/colocated)", "Installed type 
(Standalone/colocated)", " Status ", "Pending  ", "Pending Status",
"problematic details", "ETS TAC \n", "Region", "SF6\n Signed date", "SF6\n 
Signed Comment", " Comment History",
"On air Owner", "PP \nOwner", "Report \nComment", "HU Opt.\nArea Owner", 
"Planning Owner", "PO Number", "Trigger date ",
"As built status", "R", "T"
]

gov_tracker = gov_wb.get_sheet(0)
trend = gov_wb.get_sheet(2)
shee_planning = gov_wb.get_sheet(3)
all = gov_wb.get_sheet(4)
data = gov_wb.get_sheet(5)
sheet5 = gov_wb.get_sheet(6)
charts = gov_wb.get_sheet(7)
ssv_progress_tracker = gov_wb.get_sheet(8)
shrs_tracker_te_huawei = gov_wb.get_sheet(9)

global row
for index, value in enumerate(rowHeaders):
  worksheet.write(row, index, value)

for index, value in enumerate(alp_total_rowValues):  # populate other 
excel sheets
  gov_tracker.write(row, index, value)
gov_wb.save(mydir)

Это мой код после выполнения скрипта Mohammed Adeel в соответствии с моими потребностями, но я застрял с previous_day_data, new_worksheet_name и alp_total_rowValues, как я могу использовать эти объекты в соответствии с моими потребностями

Есть идеи здесь? Кто-нибудь может мне здесь помочь?

1 Ответ

1 голос
/ 10 июля 2019

Несколько месяцев назад я создал скрипт, который обновляет существующий файл Excel, добавляет новый лист в этот файл Excel, а также обновляет существующие листы Excel. Я собираюсь прикрепить соответствующий код, я надеюсь, что вы получите представление об этом коде.

if not os.path.exists(file_name):
    wb = xlwt.Workbook(encoding = 'ascii')
else:
    rb = xlrd.open_workbook(file_name)
    wb = xl_copy(rb)
    sheets = rb.sheets()

last_sheet_index =  len(sheets)
xl_sheet = rb.sheet_by_index(last_sheet_index-1)
print ('Sheet name: %s' % xl_sheet.name)

for i in range(1, xl_sheet.nrows):
    previous_day_data.append(xl_sheet.row(i)) 
sheet_names = []
for x in sheets:
sheet_names.append(x.name)

if new_worksheet_name in sheet_names:
  print 'THE SHEET ALREADY PRESENT WITH THE SAME DATE.. KINDLY DELETE THAT'
  return

worksheet = wb.add_sheet(new_worksheet_name)

rowHeaders = ["Item #", "Title", "Price", ....]

alp_total_sheet = wb.get_sheet(0)
alp_price_sheet = wb.get_sheet(1)
fairless_sheet  = wb.get_sheet(2)
atlanta_sheet   = wb.get_sheet(3)
dallas_sheet    = wb.get_sheet(4)
eagan_sheet     = wb.get_sheet(5)
sparks_sheet    = wb.get_sheet(6)

global row 
for index, value in enumerate(rowHeaders):
  worksheet.write(row, index, value)

for index, value in enumerate(alp_total_rowValues): # populate other excel sheets
    alp_total_sheet.write(row, index, value)
wb.save(file_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...